javascript canvas pie loader加载时暂停

时间:2018-07-18 06:09:25

标签: javascript html css svg canvas

我有一个脚本可以用作饼图加载程序,但是一旦加载到整个圆圈,加载程序部分就会消失。我希望它在“计时器”达到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);
}

谢谢。

3 个答案:

答案 0 :(得分:1)

if((α != 0) && (α < 360)) { tdraw = setTimeout(PieDraw,t); }

对此条件进行更改并检查。

答案 1 :(得分:1)

好吧,我不确定发布答案的用户发生了什么,但是从他们发布的内容开始,进行了很小的更改,现在可以正常工作了:

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);
        }
    }

答案 2 :(得分: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%的圈子,需要关闭。