很酷的星级评分系统原生JS实现


Posted in Javascript onAugust 25, 2016

今天我又写了个很酷的实例:星级评分系统(可自定义星星个数、显示信息)

 sufuStar.star();使用默认值5个星星,默认信息
 var msg = [........]; sufuStar.star(10,msg);自定义星星个数为10、显示信息msg格式参考默认值,条数必须和星星个数一致; 

自己实现一些实例,有个好处,能增加应用各知识点的熟练度,还能检验出自己的薄弱项!一经发现,立即翻API文档恶补! 

不知道是不是我太笨,这个实例居然写了整整一天! 

不废话了,先说下这个实例涉及的知识点:
 1.用CSS的border来画个三角形,并用before来把它加到其它元素上;
 2.学习如何用CSS来定位元素;
 3.学习事件的代理;
 4.如何优化性能;
 5.String对象的match方法的应用,正则表达式的应用;
 6.注册事件与事件处理,需要兼容IE的写法;
 7.学习如何利用‘||'给变量设置默认值;
 8.简化代码:将可能要重复写的代码拿出来,单独写成一个函数; 

下面是带注释的完整代码,碰到不懂得就查文档吧,以我目前的水平只能写成这样了,若有好的建议,欢迎前辈指出!

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title></title>
 <style>
 *{
  margin: 0;
  padding: 0;
 }
 #star{
  position: absolute;
  left: 0;
  right: 0;
  top: 30px;
  bottom: 0;
  margin: auto;
  width: 80%;
  font-size: 12px;
 }
 #star-div{
  margin:5px;
  font-size: 0;
 }
 #star-div a{
  display: inline-block;
  width: 21px;
  height: 21px;
  background: url(http://files.cnblogs.com/files/susufufu/star0.gif) no-repeat;

 }
 #star-div .on{
  background: url(http://files.cnblogs.com/files/susufufu/star1.gif) no-repeat;
 }
 #star-info{
  position: absolute;
  top: 55px;
  left: -30px;
  display: none;
  width: 155px;
  height: 50px;
  padding: 2px;
  line-height: 17px;
  border-radius: 8px;
  background-color: gold;
  z-index: 5;
 }
 #star-info:before{
  content: '';
  border-bottom: 10px solid gold;
  border-left: 10px solid rgba(0,0,0,0);
  border-right: 10px solid rgba(0,0,0,0);
  position: absolute;
  left: 35px;
  top: -10px;
 }
 #star-span{line-height: 14px}
 #star-info strong,#star-span strong{
  color: red;
 }
 </style>
 <script>
 window.onload = function(){
  var sufuStar = function (){
  //工具函数
  function gbyId(id){return document.getElementById(id);}

  function addEvent(elem,type,func){ //兼容IE
   if(elem.addEventListener){
   elem.addEventListener(type,func,false)
   }else if(elem.attachEvent){
   elem.attachEvent('on'+type,func)
   }
  }
  function getIndex(event) { //兼容IE
   var e = event || window.event;
   var t = e.target || e.srcElement;
   if (t.tagName.toLowerCase() === 'a') {
   return parseInt(t.innerHTML);
   }
  }
  function showInfo(index,msg){
   var info = gbyId('star-info');
   info.style.display = 'block';
   info.style.left = index*21-51+'px';
   info.innerHTML = "<strong> "+index+'分 '+msg[index-1].match(/(.+)\|/)[1]+'<br />'+'</strong>'+msg[index-1].match(/\|(.+)/)[1];
  }
  function appenStar(elem,nums){
   var frag = document.createDocumentFragment(); //为了提高性能,因使用DocumentFragment一次性append,这样页面只重新渲染一次
   for(var i = 0;i<nums;i++){
   var a =document.createElement('a');
   a.innerHTML = i+1;
   a.href = "javascript:;"; //阻止浏览器的点击链接的默认行为
   frag.appendChild(a);
   }
   elem.appendChild(frag);
  }
  //主体函数
  function star(num,myMsg){
   var n = num||5; //当num有值则取其值,无值则取默认值5;
   var clickStar=curentStar=0; //clickStar保存点击状态
   var msg = myMsg||[
   "很不满意|差得太离谱,与卖家描述的严重不符,非常不满",
   "不满意|部分有破损,与卖家描述的不符,不满意",
   "一般|质量一般,没有卖家描述的那么好",
   "满意|质量不错,与卖家描述的基本一致,还是挺满意的",
   "非常满意|质量非常好,与卖家描述的完全一致,非常满意"
   ];
   var starContainer = gbyId('star-div');
   appenStar(starContainer,n);
   addEvent(starContainer,'mouseover',over); //采用事件代理模式(通过<a>标签的父元素starContainer来代理事件)
   addEvent(starContainer,'mouseout',out);
   addEvent(starContainer,'click',click);
   function over(event){
   if(getIndex(event)){ //若getIndex(event)取不到值,说明当前触发事件的目标不是<a>标签
    var index = getIndex(event);
    change(index);
    showInfo(index,msg);
   }
   }
   function out(event){
   change(); //将评分设为已点击状态clickStar
   gbyId('star-info').style.display = 'none'
   }
   function click(event) {
   if (getIndex(event)) {
    var index = getIndex(event);
    clickStar = index; //保存点击状态
    gbyId('star-info').style.display = 'none';
    gbyId('star-span').innerHTML = "<strong>" + index + '分 ' + msg[index - 1].match(/(.+)\|/)[1] + '</strong>'+'<br />'+ msg[index - 1].match(/\|(.+)/)[1];
   }
   }
   function change(index){
   curentStar = index||clickStar;
   for(var i=0;i<n;i++){
    starContainer.children[i].className = i<curentStar ? 'on' : ''
   }
   }
  }
  return {
   star:star
  }
  }(); //这里的()表示函数立即执行,这样变量sufuStar才能调用匿名函数的返回值star

  //调用执行: sufuStar.star(num,myMsg),参数可为空,参数num,myMsg将设为默认值
  sufuStar.star();
 }
 </script>
</head>
<body>
<div id="star">
 <span>点击星星打分:</span>
 <div id="star-div">
 </div>
 <span id="star-span"></span>
 <p id="star-info">
 </p>
</div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript让setInteval里的函数参数中的this指向特定的对象
Jan 31 Javascript
AlertBox 弹出层信息提示框效果实现步骤
Oct 11 Javascript
javascript动态生成树形菜单的方法
Nov 14 Javascript
javascript实现自动填写表单实例简析
Dec 02 Javascript
ES6中非常实用的新特性介绍
Mar 10 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
Jul 19 Javascript
apicloud拉起小程序并传递参数的方法示例
Nov 21 Javascript
vue路由插件之vue-route
Jun 13 Javascript
vue-router结合vuex实现用户权限控制功能
Nov 14 Javascript
微信小程序实现抖音播放效果的实例代码
Apr 11 Javascript
vantUI 获得piker选中值的自定义ID操作
Nov 04 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
Aug 25 #Javascript
轻松掌握JavaScript策略模式
Aug 25 #Javascript
Javascript 6里的4个新语法
Aug 25 #Javascript
Javascript实现代码折叠功能
Aug 25 #Javascript
深入浅出ES6之let和const命令
Aug 25 #Javascript
PhotoSwipe异步动态加载图片方法
Aug 25 #Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 #Javascript
You might like
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
发现的以前不知道的函数
2006/09/19 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
使用python实现扫描端口示例
2014/03/29 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
django+mysql的使用示例
2018/11/23 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
pytorch 常用线性函数详解
2020/01/15 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
毕业生求职自荐书范文
2014/03/27 职场文书
餐饮投资计划书
2014/04/25 职场文书
春游踏青活动方案
2014/08/14 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
无保留意见审计报告
2015/06/05 职场文书
python实现简单倒计时功能
2021/04/21 Python
python munch库的使用解析
2021/05/25 Python
详解Java实践之适配器模式
2021/06/18 Java/Android
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
2022/03/23 MySQL
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏