【问题标题】:How to run smoothly the progress bar line in html如何顺利运行html中的进度条线
【发布时间】:2019-01-25 22:02:26
【问题描述】:

function move() {
  var elem = document.getElementById("myBar");   
  var width = 1;
  var counter = 1;
  var id = setInterval(frame, 1000);
  function frame() {
    if (width >= 60) {
      clearInterval(id);
    } else {
      width += 1; 
      elem.innerHTML = counter++;
      elem.style.width = width + 'px'; 
    }
  }
}
#myProgress {
  width: 120px;
  background-color: #ddd;
}

#myBar {
  width: 0px;
  height: 10px;
  background-color: #4CAF50;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1>JavaScript Progress Bar</h1>

<div id="myProgress">
  <div id="myBar">0</div>
</div>
<br>
<button onclick="move()">Click Me</button>

在上面的 sn-p 中有一个进度条,当单击按钮时会自动填充,它会通过添加 style.width 来填充进度条1。我希望该进度条能够顺利填充,但毫秒应保持不变,即 1000 。

【问题讨论】:

  • 平滑是什么意思?使用过渡?

标签: javascript html css


【解决方案1】:

您可以渲染的最小单位是像素。

您可以做的是检查某个反转以增加宽度。在下面的示例中,我将宽度增加了 10px,以便您可以正确看到 transition

function move() {
  var elem = document.getElementById("myBar");   
  var width = 0;
  var counter = 0;
  var id = setInterval(frame, 600);
  function frame() {
    if (width >= 60) {
      clearInterval(id);
    } else {
      counter++
      console.log(counter);
      if(counter % 5 == 0)
      {
        width += 10; 
        elem.style.width = width + 'px'; 
      }
    }
  }
}
#myProgress {
  width: 120px;
  background-color: #ddd;
}
#myBar {
  width: 2px;
  height: 10px;
  background-color: #4CAF50;
  -webkit-transition: width 0.5s;
  -moz-transition: width 0.5s;
  -ms-transition: width 0.5s;
  -o-transition: width 0.5s;
  transition: width 0.5s;      
}
<div id="myProgress">
  <div id="myBar"></div>
</div>

<br>
<button onclick="move()">Click Me</button>

【讨论】:

    【解决方案2】:

    添加transition:width 600ms linear;

    #myBar {
      width: 2px;
      height: 10px;
      background-color: #4CAF50;
      transition:width 600ms linear;
    }
    

    这将平滑地为栏的宽度设置动画。

    注意:保持过渡时间等于 setInterval 超时,以避免动画抖动

    function move() {
      var elem = document.getElementById("myBar");   
      var width = 1;
      var counter = 1;
      var id = setInterval(frame, 1000);
      function frame() {
        if (width >= 60) {
          clearInterval(id);
        } else {
          width += 1; 
          elem.innerHTML = counter++;
          elem.style.width = width + 'px'; 
        }
      }
    }
    #myProgress {
      width: 120px;
      background-color: #ddd;
    }
    
    #myBar {
      width: 2px;
      height: 10px;
      background-color: #4CAF50;
      transition:width 1000ms linear;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <h1>JavaScript Progress Bar</h1>
    
    <div id="myProgress">
      <div id="myBar"></div>
    </div>
    
    <br>
    <button onclick="move()">Click Me</button>

    CSS 中的过渡可以在 2 个值之间进行平滑插值。 这意味着当您将宽度增加 1px 时,浏览器将通过动画来增加宽度,这仅在执行增加宽度的 javascript 代码后才会发生。

    【讨论】:

    • 这个进度条是增加一秒吗?意思是当有一秒然后它会增加?
    • @meena,如果这个回答对你有帮助,请采纳
    【解决方案3】:

    您可以使用trasition 并减少间隔时间

    function move() {
      var elem = document.getElementById("myBar");   
      var width = 2;
      var id = setInterval(frame, 1);
      function frame() {
        if (width >= 60) {
          clearInterval(id);
        } else {
          width += 2; 
          elem.style.width = width + 'px'; 
        }
      }
    }
    #myProgress {
      width: 120px;
      background-color: #ddd;
    }
    
    #myBar {
      width: 2px;
      height: 10px;
      background-color: #4CAF50;
      transition: width 2s;
    }
    <h1>JavaScript Progress Bar</h1>
    
    <div id="myProgress">
      <div id="myBar"></div>
    </div>
    
    <br>
    <button onclick="move()">Click Me</button>

    【讨论】:

    • 请再看我的sn-p你就明白了
    • 您需要减少setInterval 毫秒,因为在 1000 毫秒内,宽度会在 1 秒后增加,以便停止 1 秒
    【解决方案4】:

    如何调整 JavaScript 代码以获得所需的结果:

    function move() {
      var elem = document.getElementById("myBar");
      var width = 0.5;
      // change the milliseconds to 10 or 5 to fill it relatively faster
      var id = setInterval(frame, 20);
    
      function frame() {
        if (width >= 120) {
          clearInterval(id);
        } else {
          width += 0.5;
          elem.style.width = width + 'px';
        }
      }
    }
    #myProgress {
      width: 120px;
      background-color: #ddd;
    }
    
    #myBar {
      width: 2px;
      height: 10px;
      background-color: #4CAF50;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <h1>JavaScript Progress Bar</h1>
    
    <div id="myProgress">
      <div id="myBar"></div>
    </div>
    
    <br>
    <button onclick="move()">Click Me</button>

    【讨论】:

    • 这个进度条是增加一秒吗?意思是当有一秒然后它会增加?
    • @meena 不,它增加了 20 毫秒,相当于 0.02 秒。所以函数每 0.02 秒运行一次。
    • 我想运行一秒意味着1000毫秒后1000
    • 你也想改变宽度吗?或者它应该与您的代码中给出的相同?
    猜你喜欢
    • 1970-01-01
    • 2014-07-15
    • 2021-07-01
    • 1970-01-01
    • 2011-03-11
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多