【问题标题】:Make javascript Animation function loop, Until page loads制作javascript动画函数循环,直到页面加载
【发布时间】:2018-04-26 20:51:48
【问题描述】:

我有一段我已经复制和编辑的 javascript,它是为动画加载环设计的,但动画只运行一次,我希望它每 4 秒运行一次,直到页面被加载,但我可以'找不到正确的语法/脚本让它重复,我不希望它重新加载页面,只循环那个特定的脚本,直到我将它设置为停止。

".radial" 是包含在我的 css 和 html 文件中的径向线的类。 它们有十二个,它们不旋转,只有荧光 .glow 动画部分使它在旋转时出现。代码是;

const radials = [...document.querySelectorAll('.radial')];
let degrees = 29;

for(i=0; i < radials.length; i++) {
  degrees += 13;
  radials[i].style.transform = `rotate(${degrees}deg)`;
  degrees += 34;
}

radials.forEach((radial, index) => {
  setTimeout(function() {                                           
    radial.classList.add('glow');                                               
  },index * 29);
});

:: 更新 ::

已阅读下面的 cmets 并在 Youtube 上进行搜索。我认为将整个脚本包装在一个函数中是最好的选择。在其自身中包括对该函数的调用并在超时或延迟属性的括号中传递一个参数。但是 setInterval()setTimeOut() 都使用了不安全的 eval() 函数。这应该是一个安全问题。

也是我前段时间看的一个youtube视频,说setInterval() & setTimeOut() 没有达到60fps。 requestAnimationFrame() 将是一个更好的选择。我不确定这些说法是否合法,或者他的来源来自哪里,但我会继续搜索网络。

发光部分看起来不错,但我无法让它重复。 我是Js新手,请耐心等待。

setTimeOut()setInterval() 还有其他解决方法吗?

【问题讨论】:

  • 我已经尝试在 youtube 上搜索,也尝试过设置间隔,但似乎没有做太多,之后我还尝试设置一个函数,它调用 const 径向部分备份但没有运气

标签: javascript animation loading loader


【解决方案1】:

将此代码放入传递给 setInterval() 计时器调用的函数中。

function loop() { 
  const radials = [...document.querySelectorAll('.radial')];
  let degrees = 29;

  for(i=0; i < radials.length; i++) {
    degrees += 13;
    radials[i].style.transform = `rotate(${degrees}deg)`;
    degrees += 34;
  }

  radials.forEach((radial, index) => {
    setTimeout(function() {                                           
      radial.classList.add('glow');                                               
    },index * 29);
  });

  setTimeout(loop, 4000);
}

【讨论】:

  • 嗨,斯科特,感谢您的回复。 setInterval() 函数只控制动画开始前的时间延迟。不以 4000 毫秒间隔循环
  • @RyanStone 哦,对不起,我误会了。在这种情况下,您实际上根本不会使用循环,而是会进行递归函数调用。让我更新答案。
  • @RyanStone 哪个循环应该有 4 秒的延迟,for i 循环或 forEach 循环或两者都有?
  • 我不确定它是“for i”循环还是“forEach”,只是试图循环/重复 intire 命令,所以当它运行一个完整周期并且所有径向线都在发光时重置并恢复为暗灰色,然后光芒再次开始填充它们..
  • @RyanStone 好的,让我再做一次调整。
【解决方案2】:

使用setInterval()。 setInterval 有两个参数,第一个是您要运行的函数,第二个是您的重复时间(以毫秒为单位)。因此,要每 4 秒运行一次函数,您可以:

setInterval(function() { 
 // do something
}, 4000);

【讨论】:

  • 我刚试过这个,但它仍然只运行一次,是一个参数,我可以在你刚才提到的那个函数中设置间隔,就像在你说 2s 3s 4s 等的 css 中一样
  • 似乎仍然无法正常工作,我知道 }, index *29 部分是我一直在更改以设置动画持续时间但已尝试上述两个答案...没有运气到目前为止,感谢您的回复..
  • Scott Marcus 的回答到底出了什么问题?我会努力完善它并达到你所需要的。
  • 我尝试了 Scott Marcus 的答案,但它似乎没有重播,它只动画一次,然后所有径向线都保持在发光状态..
  • 使用 setInterval(function() 答案是没有设置重复的参数或者是 4000ms 行的标准
【解决方案3】:

您可以使用setInterval 来做到这一点,就像在其他答案中一样,但我认为如果您有一个不断调用自身的animate 函数,逻辑会更清晰。

您正在添加一个“发光”类,但您永远不会删除它。 animate 函数应该打开和关闭它。为了清楚起见,让我们将其设为一个单独的函数,toggleGlow

接下来,我们在每个动画循环中启动单独的 toggleGlow 函数,每个径向都有不同的延迟。

最后,animate 函数会在每次短暂的、恒定的延迟后重新调用自己,直到满足某个停止条件(例如页面加载)。

const radials = [...document.querySelectorAll('.radial')];

function toggleGlow(element) {
  if (element.classList.contains("glow")) {
    element.classList.remove("glow");
  } else {
    element.classList.add("glow");
  }
}

function animate() {
  radials.forEach((radial, index) => {
    setTimeout(function() {
      toggleGlow(radial);
    }, index * 29);
  });

  if (!stopCondition) {
    setTimeout(animate, 200);
  }
}

// kick it off
animate();

此处为 JSFiddle 示例:https://jsfiddle.net/duxhy3Lj/

【讨论】:

  • 不,大约有 22 个径向线,形成一个时钟,但不要一个一个地动画,(如果是时钟,下午 2 点、下午 5 点、晚上 7 点、晚上 9 点和晚上 11 点都开始同时发光,然后其他剩余部分用辉光顺时针填充)实际的径向不旋转,尽管我可能会在稍后添加它只是看起来好像它正在旋转的发光方面......我会尝试你的建议..
  • 我的意思是,是的。这是我要制作动画的 .glow 类。
  • 我认为您所指的旋转部分是全天候在不同角度绘制多个径向的部分,它们目前是静止不动的
  • 哦,我明白了。那么,为什么这部分是您的示例代码?那令人困惑。所以你试图为发光设置动画,但你只打开它?这应该怎么动画?你有没有带过发光课程?
  • 我不完全理解您提出的问题,旋转部分就是将径向线彼此分开一定程度的部分。 .glow 函数以圆周运动为发光类设置动画,但它们最终都会发光,我希望它在每个循环结束时重置为不发光
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2011-10-22
  • 2018-05-16
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多