持续时间和百分比的进度条

时间:2015-07-21 04:55:48

标签: javascript jquery progress-bar

我想创建一个持续时间(完成动画所需的时间)和百分比的进度条。

所以我希望这个进度条花费3000毫秒来完成(达到100%):

到目前为止:

  <div id="box"></div>

  <script>
     function start(){
          var duration = 5000; // it should finish in 5 seconds !
         var max = 100;
         var i = 0 ;
         var interval = setInterval(function(){
            i++;
            offset  = (max*i)/duration;
            console.log(offset);
            $("#box").css("width", offset + "px");
            $("#box").text(parseInt(offset) + "%");
            if(i>=duration){
                alert("done "+i);
                clearInterval(interval);
            }
        }, 1);


      }
  </script>

它可以工作,但它需要的时间超过5000毫秒。

我还添加了Jquery标记,因为我不在乎是否用javascript或jquery执行此操作

谢谢你们。

4 个答案:

答案 0 :(得分:4)

根据需要随意调整以下内容,但主要问题是修复的。也就是说,你的间隔不应该每1毫秒运行一次,它应该以100%完成。以下内容将您的间隔设置为始终以每1%运行。

function start(){
     var duration = 5000; // it should finish in 5 seconds !
     var percent = duration / 100; // 1 percent of duration
     var i = 0 ;
     var interval = setInterval(function(){
        i++;
        $("#box").css("width", i + "px");
        $("#box").text(i + "%");
        if(i>=100){
            alert("done");
            clearInterval(interval);
        }
    }, percent);


}

答案 1 :(得分:4)

最简单的解决方案可能是使用.animate()

&#13;
&#13;
function start() {
  var duration = 5000; // it should finish in 5 seconds !
  $("#box").stop().css("width", 0).animate({
    width: 100
  }, {
    duration: duration,
    progress: function(promise, progress, ms) {
      $(this).text(Math.round(progress * 100) + '%');
    }
  });
}

start()
&#13;
#box {
  border: 1px solid red;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="box"></div>
&#13;
&#13;
&#13;

另一个解决方案是查看时差

&#13;
&#13;
function start() {
  var duration = 5000; // it should finish in 5 seconds !
  var st = new Date().getTime();
  var interval = setInterval(function() {
    var diff = Math.round(new Date().getTime() - st),
      val = Math.round(diff / duration * 100);
    val = val > 100 ? 100 : val;
    $("#box").css("width", val + "px");
    $("#box").text(val + "%");
    if (diff >= duration) {
      clearInterval(interval);
    }
  }, 100);
}

start()
&#13;
#box {
  border: 1px solid red;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="box"></div>
&#13;
&#13;
&#13;

使用requestAnimationFrame

相同

&#13;
&#13;
function start() {
  var duration = 5000; // it should finish in 5 seconds !
  var st = window.performance.now();
  window.requestAnimationFrame(function step(time) {
    var diff = Math.round(time - st),
      val = Math.round(diff / duration * 100);
    val = val > 100 ? 100 : val;
    $("#box").css("width", val + "px");
    $("#box").text(val + "%");
    if (diff < duration) {
      window.requestAnimationFrame(step);
    }
  })
}

start()
&#13;
#box {
  border: 1px solid red;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="box"></div>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

不确定您是否还在使用它,但您可以自助执行此操作。

<div class="progress-bar" style="width: 0;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" >


var value = 0;

function start(){
    value += 5;
    $( ".progress-bar" ).css("width", value+"%").attr("aria-valuenow", value);    
    if ( value%5 == 0 ) { 
        return setTimeout(restart, 100); 
    }
    if(value >= 100)
        return;
    else
        setTimeout(restart, 50);
}

function restart() {
    start();
}

答案 3 :(得分:0)

我使用了某些人提供的答案,但是进度栏上您错了一件事情。您需要将jquery中的“ px”更改为“%”,否则进度条将仅为100px宽。由于我使用的是Bootstrap进度栏,因此此处的值会修改为已经存在的值,并在页面加载时填充进度包装。

 function start() {
 var duration = 5000; // it should finish in 5 seconds !
 var st = window.performance.now();
 window.requestAnimationFrame(function step(time) {
 var diff = Math.round(time - st),
 val = Math.round(diff / duration * 100);
 val = val > 100 ? 100 : val;
 $(".progress-bar").css("width", val + "%");
 $(".progress-bar").text(val + "%");
 if (diff < duration) {
   window.requestAnimationFrame(step);
   }
 })
}
start()