gpt4 book ai didi

javascript - 每次迭代后更改动画持续时间

转载 作者:行者123 更新时间:2023-11-28 01:19:49 28 4
gpt4 key购买 nike

所以我有这些移动的动画框。它们从下往上无限移动。在他们到达顶峰之后,他们重新开始。我最初可以使用一些 sass 和它们的 random() 函数来改变它们的大小和速度。但每次都以相同的速度前进,所以看起来很陈旧。

所以我尝试使用 javascript 来改变每个盒子每次动画时的持续时间。我这样做了:

let ignBox = document.querySelectorAll('.ign-box');
let $rand = 0;
ignBox.forEach(box =>{
box.addEventListener('animationiteration', function(){

$rand = (Math.floor(Math.random() * 20) + 3);
console.log(this);
this.style.animationDuration = $rand + 's';
});
});

它有效。但是它为每个元素发射了很多次。似乎动画持续时间的变化再次立即触发了事件!所以一个元素可能有 8s 然后它跳到 20s 然后跳到 5s。在启用 JS 的情况下,他们现在跳得很起伏。这是一个代码笔: https://codepen.io/saltnpixels/pen/yqzZBb

最佳答案

这是因为 animationiteration 在每次新迭代开始时触发,而更改 animationDuration 实际上会重新启动动画,因此它会进入半无限循环。

一种方法是只运行 1 次 css 动画,然后在 animationend 事件中,更改 animationDurationand 并再次重新启动动画。

CSS:

.animated{
animation: slowMoveUp 3s linear 1;
}

js:

//change box animation times to vary things up
let ignBox = document.querySelectorAll('.ign-box');
let $rand = 0;
ignBox.forEach(box =>{
box.classList.add("animated");
box.addEventListener('animationend', function(){
this.classList.remove("animated");
$rand = (Math.floor(Math.random() * 20) + 3);
console.log(this);
this.style.animationDuration = $rand + 's';
void this.offsetWidth; // hack to reflow css animation
this.classList.add("animated");
});
});

归功于 this link关于如何重新启动 css 动画和 hack。

关于javascript - 每次迭代后更改动画持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51562051/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com