JS實(shí)現(xiàn)星星評(píng)分功能實(shí)例代碼(兩種方法)
一、方法1
1、用到圖片
2、結(jié)構(gòu)和樣式
<!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就會(huì)變成亮星,就是換了背景位置,把空心的星星變成了實(shí)心的。所以js實(shí)現(xiàn)的時(shí)候點(diǎn)亮就是給li加一個(gè)light的類名。
效果:
3、交互js
<script> var num=finalnum = tempnum= 0; var lis = document.getElementsByTagName("li"); //num:傳入點(diǎn)亮星星的個(gè)數(shù) //finalnum:最終點(diǎn)亮星星的個(gè)數(shù) //tempnum:一個(gè)中間值 function fnShow(num) { finalnum= num || tempnum;//如果傳入的num為0,則finalnum取tempnum的值 for (var i = 0; i < lis.length; i++) { lis[i].className = i < finalnum? "light" : "";//點(diǎn)亮星星就是加class為light的樣式 } } for (var i = 1; i <= lis.length; i++) { lis[i - 1].index = i; lis[i - 1].onmouseover = function() { //鼠標(biāo)經(jīng)過(guò)點(diǎn)亮星星。 fnShow(this.index);//傳入的值為正,就是finalnum } lis[i - 1].onmouseout = function() { //鼠標(biāo)離開(kāi)時(shí)星星變暗 fnShow(0);//傳入值為0,finalnum為tempnum,初始為0 } lis[i - 1].onclick = function() { //鼠標(biāo)點(diǎn)擊,同時(shí)會(huì)調(diào)用onmouseout,改變tempnum值點(diǎn)亮星星 tempnum= this.index; } } </script>
這樣設(shè)計(jì)的一個(gè)關(guān)鍵點(diǎn)在于,mouout時(shí)保存一個(gè)值用于讓星星變暗,初始為0(0顆星變亮就是全暗),不點(diǎn)擊的話只要鼠標(biāo)離開(kāi)所有星星都是暗的,click事件會(huì)觸發(fā)一次mouseover和一次mouseout,所以點(diǎn)擊時(shí)改變tempnum確定鼠標(biāo)離開(kāi)時(shí)幾顆星亮,這個(gè)值會(huì)一直保持,直到下次點(diǎn)擊時(shí)改變它。
最終效果:
二、方法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;} /*星星評(píng)分*/ .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> //星星評(píng)分 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結(jié)構(gòu)
<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>
簡(jiǎn)單描述下原理:主要是多層背景的覆蓋關(guān)系
首先是結(jié)構(gòu):.star下面包含了兩層,一層是ystar,一層是ul。
4.1、實(shí)現(xiàn)4個(gè)星星的評(píng)分效果
外層.star定寬,背景圖為空心灰色的星星。
里面.ystar代表點(diǎn)亮的星星,它的背景是實(shí)心的黃色星星,如果有4顆亮星,就設(shè)置.ystar的寬度為80%。2顆為40%。
4.2、實(shí)現(xiàn)鼠標(biāo)hover上去星星點(diǎn)亮的效果
主要是通過(guò)css控制。關(guān)鍵是通過(guò):hover實(shí)現(xiàn)的。
ul:hover時(shí)加上了空心灰色的星星背景圖。
a:hover時(shí),寬度變成前幾個(gè)星星的寬度。
這樣在hover時(shí),其實(shí)有4層背景,比如第二個(gè)星星hover時(shí),從下到上依次是
.star 暗星100%寬度.ystar 亮星 80寬度ul 暗星100%寬度.two-stars 40%寬度
4.3、鼠標(biāo)hover顯示tip
通過(guò)js獲取a的data-name實(shí)現(xiàn)。
以上所述是小編給大家介紹的JS實(shí)現(xiàn)星星評(píng)分功能實(shí)例代碼(兩種方法)的詳細(xì)內(nèi)容,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的,在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- jquery插件star-rating.js實(shí)現(xiàn)星級(jí)評(píng)分特效
- js點(diǎn)亮星星評(píng)分并獲取參數(shù)的js代碼
- js星星評(píng)分效果
- JS實(shí)現(xiàn)帶提示的星級(jí)評(píng)分效果完整實(shí)例
- javascript實(shí)現(xiàn)五星評(píng)分功能
- js實(shí)現(xiàn)的星星評(píng)分功能函數(shù)
- javascript 星級(jí)評(píng)分效果(手寫(xiě))
- AngularJS實(shí)現(xiàn)星星等級(jí)評(píng)分功能
- JavaScript制作淘寶星級(jí)評(píng)分效果的思路
- css+html+js實(shí)現(xiàn)五角星評(píng)分
相關(guān)文章
cropper js基于vue的圖片裁剪上傳功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了cropper js基于vue的圖片裁剪上傳功能的相關(guān)資料,需要的朋友可以參考下2018-03-03JSON字符串和對(duì)象相互轉(zhuǎn)換實(shí)例分析
這篇文章主要介紹了JSON字符串和對(duì)象相互轉(zhuǎn)換的方法,結(jié)合實(shí)例形式分析了json格式數(shù)據(jù)的轉(zhuǎn)換方法,涉及javascript正則與字符串操作的相關(guān)技巧,需要的朋友可以參考下2016-06-06超輕量級(jí)的js時(shí)間庫(kù)miment使用解析
這篇文章主要介紹了超輕量級(jí)的js時(shí)間庫(kù)miment使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08JavaScript動(dòng)態(tài)修改背景顏色的方法
這篇文章主要介紹了JavaScript動(dòng)態(tài)修改背景顏色的方法,涉及javascript操作鼠標(biāo)事件及樣式的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04layer.open提交子頁(yè)面的form和layedit文本編輯內(nèi)容的方法
今天小編就為大家分享一篇layer.open提交子頁(yè)面的form和layedit文本編輯內(nèi)容的方法,具有好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09