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之卸载鼠标事件的代码
May 14 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
Apr 01 Javascript
基于Jquery制作的幻灯片图集效果打包下载
Feb 12 Javascript
js 如何实现对数据库的增删改查
Nov 23 Javascript
Javascript基础教程之比较操作符
Jan 18 Javascript
javascript实现密码强度显示
Mar 18 Javascript
jQuery获取页面元素绝对与相对位置的方法
Jun 10 Javascript
javascript实现图片轮播效果
Jan 20 Javascript
通过sails和阿里大于实现短信验证
Jan 04 Javascript
微信小程序云开发之模拟后台增删改查
May 16 Javascript
微信小程序版本自动更新的方法
Jun 14 Javascript
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
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四种基础算法代码实例
2013/10/29 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
基于python的字节编译详解
2017/09/20 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
基于python3生成标签云代码解析
2020/02/18 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
java程序员面试交流
2012/11/29 面试题
国培教师自我鉴定
2014/02/12 职场文书
村干部承诺书
2014/03/28 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
创意婚礼策划方案
2014/05/18 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python