JS實現(xiàn)星星評分功能實例代碼(兩種方法)
一、方法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實現(xiàn)的時候點亮就是給li加一個light的類名。
效果:

3、交互js
<script>
var num=finalnum = tempnum= 0;
var lis = document.getElementsByTagName("li");
//num:傳入點亮星星的個數(shù)
//finalnum:最終點亮星星的個數(shù)
//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() { //鼠標經(jīng)過點亮星星。
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事件會觸發(fā)一次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、實現(xiàn)4個星星的評分效果
外層.star定寬,背景圖為空心灰色的星星。
里面.ystar代表點亮的星星,它的背景是實心的黃色星星,如果有4顆亮星,就設置.ystar的寬度為80%。2顆為40%。
4.2、實現(xiàn)鼠標hover上去星星點亮的效果
主要是通過css控制。關鍵是通過:hover實現(xiàn)的。
ul:hover時加上了空心灰色的星星背景圖。
a:hover時,寬度變成前幾個星星的寬度。
這樣在hover時,其實有4層背景,比如第二個星星hover時,從下到上依次是
.star 暗星100%寬度.ystar 亮星 80寬度ul 暗星100%寬度.two-stars 40%寬度
4.3、鼠標hover顯示tip
通過js獲取a的data-name實現(xiàn)。
以上所述是小編給大家介紹的JS實現(xiàn)星星評分功能實例代碼(兩種方法)的詳細內容,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的,在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
cropper js基于vue的圖片裁剪上傳功能的實現(xiàn)代碼
這篇文章主要介紹了cropper js基于vue的圖片裁剪上傳功能的相關資料,需要的朋友可以參考下2018-03-03
layer.open提交子頁面的form和layedit文本編輯內容的方法
今天小編就為大家分享一篇layer.open提交子頁面的form和layedit文本編輯內容的方法,具有好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09

