转载自   JS实现星星评分功能实例代码(两种方法)

一、方法1

1、用到图片

2、结构和样式

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>ul {padding-left: 0;overflow: hidden;}ul li {float: left;list-style: none;width: 27px;height: 27px;background: url(img/star.gif)}ul li a {display: block;width: 100%;padding-top: 27px;overflow: hidden;}ul li.light {background-position: 0 -29px;}</style>
</head>
<body><ul><li class="light"><a href="javascript:;">1</a></li><li><a href="javascript:;">2</a></li><li><a href="javascript:;">3</a></li><li><a href="javascript:;">4</a></li><li><a href="javascript:;">5</a></li></ul>
</body>
</html>

li加了light的class就会变成亮星,就是换了背景位置,把空心的星星变成了实心的。所以js实现的时候点亮就是给li加一个light的类名。

效果:

3、交互js

<script>
var num=finalnum = tempnum= 0;
var lis = document.getElementsByTagName("li");
//num:传入点亮星星的个数
//finalnum:最终点亮星星的个数
//tempnum:一个中间值
function fnShow(num) {finalnum= num || tempnum;//如果传入的num为0,则finalnum取tempnum的值for (var i = 0; i < lis.length; i++) {lis[i].className = i < finalnum? "light" : "";//点亮星星就是加class为light的样式}
}
for (var i = 1; i <= lis.length; i++) {lis[i - 1].index = i;lis[i - 1].onmouseover = function() { //鼠标经过点亮星星。fnShow(this.index);//传入的值为正,就是finalnum}lis[i - 1].onmouseout = function() { //鼠标离开时星星变暗fnShow(0);//传入值为0,finalnum为tempnum,初始为0}lis[i - 1].onclick = function() { //鼠标点击,同时会调用onmouseout,改变tempnum值点亮星星tempnum= this.index;}
}
</script>

这样设计的一个关键点在于,mouout时保存一个值用于让星星变暗,初始为0(0颗星变亮就是全暗),不点击的话只要鼠标离开所有星星都是暗的,click事件会触发一次mouseover和一次mouseout,所以点击时改变tempnum确定鼠标离开时几颗星亮,这个值会一直保持,直到下次点击时改变它。

最终效果:

二、方法2

1、用到图片

2、效果如下

3、完整代码如下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>demo of starof</title><style>ul{padding:0;margin: 0;}li{list-style: none;}/*星星评分*/.scoremark{width:154px;position:relative;margin-top:50px;}.scoremark .score {float: right;display: block;margin: 0 0 0 10px;font-size: 18px;line-height: 22px;font-weight: bold;color: #f70;}.scoremark .star {float: right;display: block;position: relative;width: 116px;height: 20px;background: url(img/star.png) no-repeat 0px -20px;}.scoremark .ystar {position: absolute;top: 0;left: 0;width: 116px;height: 20px;background: url(img/star.png) no-repeat 0px 0px;}.scoremark .star ul {width: 120px;height: 20px;position: absolute;top: 0;left: 0;}.scoremark .star ul:hover {background: url(img/star.png) no-repeat 0px -20px;}.scoremark .star li {float: left;width: 24px;height: 20px;}.scoremark .star li a {display: block;width: 24px;height: 20px;overflow: hidden;text-indent: -9999px;position: absolute;z-index: 5;}.scoremark .star li a:hover {background: url(img/star.png) no-repeat 0px 0px;z-index: 3;left: 0}.scoremark .star a.one-star {left: 0;}.scoremark .star a.one-star:hover {width: 24px}.scoremark .star a.two-stars {left: 24px;}.scoremark .star a.two-stars:hover {width: 48px}.scoremark .star a.three-stars {left: 48px;}.scoremark .star a.three-stars:hover {width: 72px}.scoremark .star a.four-stars {left: 72px;}.scoremark .star a.four-stars:hover {width: 96px}.scoremark .star a.five-stars {left: 96px;}.scoremark .star a.five-stars:hover {width: 120px;}.scoremark .tips {position: absolute;top: -28px;left: 0;width: 40px;height: 21px;color: #333;line-height: 20px;padding: 0 0 5px 0;text-align: center;background: url(img/ico.png) no-repeat;z-index: 6;font-size: 12px;}</style><script src="http://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
</head>
<body><div id="scoremark" class="scoremark scores"><em class="score">8.0</em><span class="star"><span class="ystar" style="width:80%"></span><ul><li><a href="javascript:void(0)" data-name="很差" class="one-star">1</a></li><li><a href="javascript:void(0)" data-name="较差" class="two-stars">2</a></li><li><a href="javascript:void(0)" data-name="一般" class="three-stars">3</a></li><li><a href="javascript:void(0)" data-name="较好" class="four-stars">4</a></li><li><a href="javascript:void(0)" data-name="很好" class="five-stars">5</a></li></ul></span><div style="left: 0px; display: none;" class="tips"></div></div>
<script>
//星星评分
starScore($(".scoremark"));
function starScore(star){star.find(".star ul li a").mouseenter(function(){var txt = $(this).attr("data-name");var x = $(this).parent("li").index();star.find(".tips").html(txt).css("left",-6+x*24).show();});star.find(".star ul li a").mouseleave(function(){star.find(".tips").html("").css("left",0).hide();});
}
</script>
</body>
</html>

4、原理

4.1html结构

<div id="scoremark" class="scoremark scores"><em class="score">8.0</em><span class="star"><span class="ystar" style="width:80%"></span><ul><li><a href="javascript:void(0)" data-name="很差" class="one-star">1</a></li><li><a href="javascript:void(0)" data-name="较差" class="two-stars">2</a></li><li><a href="javascript:void(0)" data-name="一般" class="three-stars">3</a></li><li><a href="javascript:void(0)" data-name="较好" class="four-stars">4</a></li><li><a href="javascript:void(0)" data-name="很好" class="five-stars">5</a></li></ul></span><div style="left: 0px; display: none;" class="tips"></div></div>

简单描述下原理:主要是多层背景的覆盖关系

首先是结构:.star下面包含了两层,一层是ystar,一层是ul。

4.1、实现4个星星的评分效果

外层.star定宽,背景图为空心灰色的星星。

里面.ystar代表点亮的星星,它的背景是实心的黄色星星,如果有4颗亮星,就设置.ystar的宽度为80%。2颗为40%。

4.2、实现鼠标hover上去星星点亮的效果

主要是通过css控制。关键是通过:hover实现的。

ul:hover时加上了空心灰色的星星背景图。

a:hover时,宽度变成前几个星星的宽度。

这样在hover时,其实有4层背景,比如第二个星星hover时,从下到上依次是

.star 暗星100%宽度.ystar 亮星 80宽度ul 暗星100%宽度.two-stars 40%宽度

4.3、鼠标hover显示tip

通过js获取a的data-name实现。

JS实现星星评分功能实例代码(两种方法)相关推荐

  1. java实现星级评分功能_JS实现星星评分功能实例代码(两种方法)

    一.方法1 1.用到图片 2.结构和样式 Document ul { padding-left: 0; overflow: hidden; } ul li { float: left; list-st ...

  2. html+轮播图下标跳转代码,最简单的JavaScript图片轮播代码(两种方法)

    通过改变每个图片的opacity属性: 素材图片: 代码一: 最简单的轮播广告 body, div, ul, li { margin: ; padding: ; } ul { list-style-t ...

  3. 使用Linux服务器运行深度学习代码 || 两种方法,粗暴高效

    [本文是介绍快速远程使用Linux服务器运行深度学习.机器学习代码,全程高能,史上最全] 前面介绍了以下几个内容,不会的可以转链接看下 教你无脑式安装Xshell.Xftp,快速远程连接使用Linux ...

  4. oracle 判断是否位汉字,js判断字符是否是汉字的两种方法小结

    有时需要判断一个字符是不是汉字,比如在用户输入含有中英文的内容时,需要判断是否超过规定长度就要用到.用 Javascript 判断通常有两种方法. 1.用正则表达式判断 js判断字符是否是汉字 .co ...

  5. hexo博客文章置顶功能实现的两种方法

    写在前面 本文主要描述了如何实现hexo文章置顶功能,讲述了通过修改源码和通过更改插件两种方式实现,以及如何添加置顶显示.文章可能还有很多不足,请大家谅解,欢迎大佬提意见. 本文使用的东西 win10 ...

  6. SPARK官方实例:两种方法实现随机森林模型(ML/MLlib)

    在spark2.0以上版本中,存在两种对机器学习算法的实现库MLlib与ML,比如随机森林: org.apache.spark.mllib.tree.RandomForest 和 org.apache ...

  7. android listview 自定义控件,Android 自定义弹性ListView控件实例代码(三种方法)

    关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListView弹性效果的方法(基本上拿来就可以用),供大家参考: 弹性L ...

  8. Qt文档阅读笔记-windowOpacity官方解析及实例(两种方法使得程序渐变出现)

    目录 官方解析 博主例子 官方解析 windowOpacity 这个属性控制窗口的透明度. 他的取值范围是1.0(不透明)至0.0(全透明). 默认情况下,这个属性的值是1.0. 这个属性在Linux ...

  9. JS教程之 识别 JavaScript 数据类型:两种方法就足够了

    Primitive type原始类型: Null.Undefined.Number.String.Boolean.Symbol.BigInt vObject type 对象类型: Object 你知道 ...

最新文章

  1. win7x64注册表显卡渲染速度_Geek3D GpuTest GUI(显卡测试软件)下载-Geek3D GpuTest GUI(显卡测试软件)免费版下载v0.7.0...
  2. 使用函数求两个整数的最大公约数和最小公倍数
  3. 虚假新闻检测挑战赛落幕,探寻获奖团队背后的故事
  4. 论文返修(response letter)最有用的开场白
  5. python显示1000以内的斐波拉契数列_python实现斐波那契数列
  6. 1103: [POI2007]大都市meg(dfs序+线段树||树状数组)
  7. 9 10次c语言上机作业答案,C语言第五次上机作业参考答案
  8. linux-文件类型-七种
  9. 产品运营周报报表分析案例
  10. hive 强转为string_String 源码浅析————终结篇
  11. 电脑故障速查方法集萃
  12. 老司机多年BT下载软件-这些下载神器你都用过吗
  13. 离散数学及其应用【华章版】习题答案第一章01
  14. java求100以内奇数和
  15. 2016 上海 Qcon 值得关注的技术
  16. .net core 集成skywalking
  17. android吸顶效果,RecyclerVIew实现悬浮吸顶效果
  18. UE4中程序驱动的LookAt动画
  19. minicom 下载
  20. 避坑:git在push本地文件到远程时,报错ailed to push some refs to https://xx/xx.git的解决办法

热门文章

  1. 2020牛客国庆集训派对day2 F题 Java大数处理
  2. java继承层次结构,在状态模式中实现继承层次结构 - java
  3. 如何维持手机电池寿命_延长手机电池寿命终极技巧教学,iPhone和安卓手机皆适合...
  4. 二叉树分析(两点最大距离)
  5. 背包dp的核心思想(动态规划)
  6. Codeforces Round #740 (Div. 2) E. Bottom-Tier Reversals 构造
  7. Infinite Fraction Path UVALive - 8207
  8. [luogu-P4299] 首都(并查集 + LCT动态维护树的重心 / 维护虚儿子信息)
  9. CF1415D:XOR-gun(异或)
  10. CF666E-Forensic Examination【广义SAM,线段树合并】