手写进度条并设置防抖

第一篇小总结。

实现一个进度条(两层div)

效果图:

点击load按钮开始加载进度。

html代码:

这里就很简单,设置两个div,外层的为容器,内层的为进度,通过增加内层div的width来实现进度增加的效果。

<body>
    <div id='container'>
      <div id='progress'>0</div>
    </div>
    <button id='btn' onclick='debounce(move,10000,false)()'>load</button>
</body>
复制代码
CSS代码:

为两个div设置样式,外层无色,内层背景色为green,初始width为0%,之后会通过执行js代码来改变这个宽度。另外,使用line-height使得内层中表示进度的百分比数字垂直居中,使用text-align实现数字水平居中。

#container{
  width:100%;
  border:1px solid black;
  border-radius:5px;
}
#progress{
  width:0%;
  line-height:30px;
  background:green;
  text-align:center;
  border-radius:5px;
}
复制代码
JS代码+防抖函数:

move函数实现了进度条的增加,即改变内层div的width,但是如果反复出发点击事件,进度条会不断的从零开始加载,也就是出现抖动的情况。

所以,加入一个防抖函数debounce,其中immediate可以设置为true或者false来控制是否立即执行一次。

function move(){
  var pro = document.getElementById('progress');
  var width = 0;
  var timer1 = setInterval(go,100);
  function go(){
    if(width<100){
    width++;
    pro.style.width = width + '%';
    pro.innerHTML = width + '%';
    }else{
      clearInterval(timer1);
    }
  }
}
//防抖
var timer = null; //初始定时器
function debounce(move,delay,immediate){
  return function()
   //保存上下文
    var context = this;
    var args = arguments;
    //如果存在定时器,则将还没执行完的定时器消除,对应的延迟的事件也就取消了。
    //但是这里取消事件并没把timer设为null,注意这一点。
    if(timer){clearTimeout(timer);}
    //immediate为true时表示会马上执行一次事件
    if(immediate){
      var doNow = !timer;//初始的timer为null,所以这里为真
      //设置一个定时器,delay时间之后timer为null,就可以重新触发了
      timer = setTimeout(function(){
        timer = null;
      },delay);
      if(doNow){
      move.apply(context,args);
      }
    }else{
      timer = setTimeout(function(){
        move.apply(context,args);
      },delay);
    }
  }
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值