【问题标题】:javascript canvas pie loader pause when loadedjavascript canvas pie loader在加载时暂停
【发布时间】:2018-12-25 22:35:32
【问题描述】:

我有一个脚本,它可以用作饼图加载器,但是加载器部分一旦到达完整的圆圈就会消失。我希望它在“计时器”达到 100%(又名一整圈)时停止。但我无法弄清楚。

这是我的代码

var loader = document.getElementById('pie-loader'),
  α = 0,
  π = Math.PI,
  t = 22,
  tdraw;

function PieDraw() {
  α++;
  α %= 360;
  var r = (α * π / 180),
    x = Math.sin(r) * 90,
    y = Math.cos(r) * -90,
    mid = (α > 180) ? 1 : 0,
    anim = 'M 0 0 v -90 A 90 90 1 ' + mid + ' 1 ' + x + ' ' + y + ' z';
  loader.setAttribute('d', anim);
  if (α != 0) {
    tdraw = setTimeout(PieDraw, t);
  }
}
PieDraw();
.pie svg {
  position: absolute;
  top: 50%;
  left: 50%;
  z-index: 100;
  display: block;
  width: 180px;
  height: 180px;
  -webkit-transform: translateX(-50%) translateY(-50%);
  transform: translateX(-50%) translateY(-50%);
  pointer-events: none
}

.pie #pie-loader {
  fill: #155385;
  fill-opacity: .5
}
<div class="pie">
  <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="180" height="180" viewbox="0 0 180 180"><path id="pie-loader" transform="translate(90,90)" /></svg>
</div>

一旦蓝色圆圈已满,任何有关停止此操作的帮助,将不胜感激!

我试过添加这个,但它不是 100% 满的。

function PiePause(){
  clearTimeout(tdraw);
  var anim = 'M 0 0 v -90 A 90 90 1 1 1 -3.140954703225074 -89.94517443171861 z';
  loader.setAttribute('d',anim);
}

谢谢。

【问题讨论】:

    标签: javascript html css svg canvas


    【解决方案1】:

    问题不在于超时,而在于实现 100% 循环以实现您添加关闭参数所需的相同效果。可以这样做:

    var loader = document.getElementById('pie-loader'),
      α = 0,
      π = Math.PI,
      t = 22,
      tdraw, prevMid = '';
    
    function PieDraw() {
      α++;
    
      α %= 360;
    
      var r = (α * π / 180),
        x = Math.sin(r) * 90,
        y = Math.cos(r) * -90,
        mid = (α > 180) ? 1 : 0,
        anim = 'M 0 0 v -90 A 90 90 1 ' + mid + ' 1 ' + x + ' ' + y + ' z';
      if (α == 0) {
        anim = ' M 0, 0' +
          'm -90, 0' +
          'a 90,90 0 1,0 180,0' +
          'a 90,90 0 1,0 -180,0 z'
      }
    
      loader.setAttribute('d', anim);
      if (α != 0) {
        tdraw = setTimeout(PieDraw, t);
      }
    }
    
    PieDraw();
    .pie svg {
      position: absolute;
      top: 50%;
      left: 50%;
      z-index: 100;
      display: block;
      width: 180px;
      height: 180px;
      -webkit-transform: translateX(-50%) translateY(-50%);
      transform: translateX(-50%) translateY(-50%);
      pointer-events: none
    }
    
    .pie #pie-loader {
      fill: #155385;
      fill-opacity: .5
    }
    <div class="pie">
      <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="180" height="180" viewbox="0 0 180 180"><path id="pie-loader" transform="translate(90,90)" />
      
    
      </svg>
    </div>

    您实际上得到了需要闭合的 99.99% 的圆圈。

    【讨论】:

      【解决方案2】:

      好的,我不确定发布答案的用户发生了什么,但从他们发布的内容出发,稍作改动,现在可以:

      var loader = document.getElementById('pie-loader'), α = 0, π = Math.PI, t = 22, tdraw;
          function PieDraw(){
              α++;
              α %= 360;
              var r = ( α * π / 180 )
              , x = Math.sin( r ) * 90
              , y = Math.cos( r ) * - 90
              , mid = ( α > 180 ) ? 1 : 0
              , anim = 'M 0 0 v -90 A 90 90 1 ' 
                     + mid + ' 1 ' 
                     +  x  + ' ' 
                     +  y  + ' z';
              loader.setAttribute( 'd', anim );
              if((α !== 0) && (α < 359)) {
                  tdraw = setTimeout(PieDraw,t);
              } else {
                  var anim = 'M 0 0 v -90 A 90 90 1 1 1 -0.01 -90 z';
                  loader.setAttribute('d',anim);
              }
          }
      

      【讨论】:

      • 没有时间问题检查我的答案。
      【解决方案3】:
      if((α != 0) && (α < 360)) { tdraw = setTimeout(PieDraw,t); }
      

      在 if 条件中进行此更改并检查。

      【讨论】:

      • 谢谢,我不知道你的回答为什么消失了,但它确实帮助我指明了正确的方向:)
      • 很高兴它帮助了你,欢迎。
      猜你喜欢
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 2012-07-18
      • 1970-01-01
      相关资源
      最近更新 更多