js实现自定义进度条效果


Posted in Javascript onMarch 15, 2017

效果图:

js实现自定义进度条效果

代码如下:

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>Staged progress bar</title>
  <style type="text/css">
   *{margin:0;padding:0;}
   html,body{height:100%;}
   ul{list-style:none;}
   .cf:after{content:"";display:block;clear:both;height: 0;}
   #bar{height:20px;margin:100px 10px; margin-left: 50px}
   #bar div{float:left;position:relative;}
   #bar .staged, #bar .progress{border-color:#4CA8FF;}
   #bar .staged i{position:relative;overflow:hidden;display:block;width:inherit;height:inherit;}
   #bar .staged i:before{content:"";display:block;width:0;height:inherit;border-radius:50%;}
   #bar .progress {width:120px;height:inherit;margin-left:-4px;z-index:1;border-style:solid;border-width:2px 0;}
   #bar .progress:nth-child(2) i{border-left-width:2px;border-top-left-radius:6px;border-bottom-left-radius:6px;}
   #bar .progress:nth-child(2){border-left-width:2px;border-top-left-radius:10px;border-bottom-left-radius:10px;}
   #bar .progress:last-child{border-right-width:2px;border-top-right-radius:10px;border-bottom-right-radius:10px;}
   #bar .progress i{width:0;height:inherit;display:block;border-radius:0 10px 10px 0;position:relative;font-style:normal;}
   #bar .progress, #bar .staged{background:#7d7d7d;}
   #bar .sp i:before, #bar .progress i{background:#4CA8FF;}
   #bar .staged:not(:first-child){margin-left:-4px; }
   #bar .staged:before{position:absolute;content:attr(data-text);width:inherit;height:inherit;top:90%;left:0;}
   #bar .staged:after{content:attr(data-value);color:#fff;width:inherit;height:inherit;position:absolute;top:0;left:0;}
   #bar .sp i:before{width:100%;transition:width 1s;}
   .msg:before, .msg:after{display:block;position:absolute;border-style:solid;border-color:#ccc;background:#fff;top:30px;}
   .msg:before{content:attr(data-text);width:200px;height:40px;line-height:40px;font-size:12px;text-align:center;border-radius:4px;border-width:1px;top:-68px;left:calc(100% - 114px);}
   .msg:after{content:"";width:14px;height:14px;transform:rotate(45deg);border-width:0 1px 1px 0;top:-34px;left:calc(100% - 20px);}
  </style>
 </head>
 <body>
  <div id="bar" class="cf" data-value="8000" data-text="还有 [number] 点进度加载完成">
   <div class="staged sp" data-value="0" ><i></i></div>
   <div class="progress"><i></i></div>
   <div class="staged" data-value="200" "><i></i></div>
   <div class="progress"><i></i></div>
   <div class="staged" data-value="1000" ><i></i></div>
   <div class="progress"><i></i></div>
   <div class="staged" data-value="5000" ><i></i></div>
   <div class="progress"><i></i></div>
   <div class="staged" data-value="10000" ><i></i></div>
   <div class="progress"><i></i></div>
  </div>
  <script type="text/javascript">
   var progressBar = (function(){
    var $ = function(sele){
     return document.querySelectorAll(sele);
    }
    return function(a){
     var getValue = function(obj,attr){
      return Number(obj.getAttribute(a.value));
     }
     var box = $(a.box)[0];
     var value = getValue(box);
     var text = box.getAttribute(a.text);
     var staged = $(a.staged);
     var progress = $(a.progress);
     var i = 0, index = 0, num = 0, numV = 0, n = 1, af_index = 0, timeout = 0, stopAm = null;
     var af = function(fn){
      if(!requestAnimationFrame || !cancelAnimationFrame){
       clearTimeout(af_index);
       af_index = setTimeout(fn, 1000/60);
      }
      else{
       cancelAnimationFrame(af_index);
       af_index = requestAnimationFrame(fn);
      }
     }
     var setMsg = function(){
      var msg = progress[index];
      if(a.note){
        var arr = text.split(a.note);
        text = arr[0] + n + arr[1];
      }
      msg.setAttribute("data-text", text);
      msg.className = a.msg;
     }
     var animation = function(){
      if(i == 0){
       if(staged.length == index + 1){
        numV = value * 2;
       }
       else numV = getValue(staged[index + 1]);
       if(n == 0) {
        progress[index].style.width = "1%";
        return
       };
       if(n < 0 && staged.length > index + 1){
        n = numV - value;
        if(Number(progress[index].style.width.split("%")[0])<5) progress[index].style.width = "3%";
        setMsg();
        return;
       }
      }
      num = Math.ceil(++i * numV / 100);
      if(num > value){
       num = value;
       //console.log(num)
       n = numV - num;
       if(n > 0){
        if(staged.length > index + 1) setMsg();
        return;
       }
      }
      if(i == 100){
       staged[index + 1].className += " " + a.stagedProgress;
      }
      if(i > 105){ //105% 宽,自己根据样式调整。
       num = numV;
       index++;
       i = 0;
       timeout = setTimeout(function(){
        af(animation);
        clearTimeout(timeout);
       }, a.stagedSleep);
       return;
      }
      progress[index].style.width = i + "%";
      af(animation);
     }
     animation()
    }
   })();
   progressBar({
    box : "#bar",
    text : "data-text", // box 的属性
    note : "[number]", // box 的属性 (可以省略,计算好直接写入提示语句。);
    msg : "msg",
    staged : ".staged",
    progress : ".progress i",
    stagedProgress : "sp",
    value : "data-value",
    stagedSleep : "900",
    sleep : "3000"
   });
  </script>
 </body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
javascript一些不错的函数脚本代码
Sep 10 Javascript
CCPry JS类库 代码
Oct 30 Javascript
工作中常用到的JS表单验证代码(包括例子)
Nov 11 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
Jun 20 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
Jan 26 Javascript
jQuery实现购物车表单自动结算效果实例
Aug 10 Javascript
javascript创建cookie、读取cookie
Mar 31 Javascript
浅谈JavaScript对象的创建方式
Jun 13 Javascript
简单实现js轮播图效果
Jul 14 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
Sep 28 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
基于JS实现快速读取TXT文件
Aug 25 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
Mar 15 #Javascript
jQuery模拟窗口抖动效果
Mar 15 #Javascript
利用jQuery实现一个简单的表格上下翻页效果
Mar 14 #Javascript
基于React实现表单数据的添加和删除详解
Mar 14 #Javascript
Node.js 中exports 和 module.exports 的区别
Mar 14 #Javascript
JS检测数组类型的方法小结
Mar 14 #Javascript
轻松理解JavaScript闭包
Mar 14 #Javascript
You might like
也谈php网站在线人数统计
2008/04/09 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
php简单防盗链实现方法
2015/07/29 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
python 实现Harris角点检测算法
2020/12/11 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
测量实习生自我鉴定
2013/09/19 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
保险经纪人求职信
2014/03/11 职场文书
网站创业计划书
2014/04/30 职场文书
离婚财产处理协议书
2014/09/30 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
校运会宣传稿大全
2015/07/23 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书