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 相关文章推荐
location.href用法总结(最主要的)
Dec 27 Javascript
JavaScript DOM进阶方法
Apr 13 Javascript
JavaScript简单实现弹出拖拽窗口(二)
Jun 17 Javascript
angularjs封装bootstrap时间插件datetimepicker
Jun 20 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
bootstrapValidator自定验证方法写法
Dec 01 Javascript
JavaScript字符集编码与解码详谈
Feb 02 Javascript
angular十大常见问题
Mar 07 Javascript
Zepto实现密码的隐藏/显示
Apr 07 Javascript
vue跨域解决方法
Oct 15 Javascript
VUE 单页面使用 echart 窗口变化时的用法
Jul 30 Javascript
JS数组转字符串实现方法解析
Sep 04 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开发需要注意的安全问题
2010/09/01 PHP
PHP修改session_id示例代码
2014/01/08 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
python发送HTTP请求的方法小结
2015/07/08 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
python实现图片处理和特征提取详解
2017/11/13 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
韩国美国时尚服装和美容在线全球市场:KOODING
2018/11/07 全球购物
.net C#面试题
2012/08/28 面试题
韩国商务邀请函
2014/01/14 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
教师党员承诺书2015
2015/01/21 职场文书
酒店人事主管岗位职责
2015/04/11 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
优秀创业计划书分享
2019/07/19 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
常用的Python代码调试工具总结
2021/06/23 Python
golang的文件创建及读写操作
2022/04/14 Golang
python中的random模块和相关函数详解
2022/04/22 Python