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实现滚动图片新闻的实例代码
Nov 27 Javascript
js返回上一页并刷新的多种实现方法
Feb 26 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 Javascript
AngularJS中的表单简单入门
Jul 28 Javascript
Jquery调用iframe父页面中的元素及方法
Aug 23 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
Dec 26 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
Jan 19 Javascript
vue proxyTable 接口跨域请求调试的示例
Sep 12 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
Nov 07 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
Jul 17 Javascript
浅谈Vue 函数式组件的使用技巧
Jun 16 Javascript
前端vue+elementUI如何实现记住密码功能
Sep 20 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
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
在js中使用&quot;with&quot;语句中跨frame的变量引用问题
2007/03/08 Javascript
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
javascript自定义右键菜单插件
2019/12/16 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
Python实现的金山快盘的签到程序
2013/01/17 Python
Python中的类学习笔记
2014/09/23 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
pymysql模块的操作实例
2019/12/17 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
SQL SERVER面试资料
2013/03/30 面试题
信息工程学院毕业生推荐信
2013/11/05 职场文书
秘书专业自荐信范文
2013/12/26 职场文书
学生自我鉴定模板
2013/12/30 职场文书
党员党性分析材料
2014/02/17 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
语文教育专业求职信
2014/06/28 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers