2 回答
TA贡献1824条经验 获得超5个赞
试试这个:
function flash(index, delay){
setTimeout( function() {
flashingSquare = document.getElementById(index);
flashingSquare.classList.add('flashing');
flashingSquare.addEventListener('animationend', function() {
flashingSquare.classList.remove('flashing');
}, delay);
});
}
不要删除动画,删除 class。
动画完成后直接删除类。所以浏览器有时间处理所有事情。当您在需要动画之前直接添加类时,浏览器可以触发所有需要的步骤来执行此操作。
您删除和添加课程的尝试很好,但速度很快。我认为浏览器和 DOM 优化了你的步骤并且什么都不做。
TA贡献1752条经验 获得超4个赞
经过一番研究,我想出了一个解决方法。我重写了函数,以便 setTimeout 嵌套在 for 循环中,setTimeout 嵌套在立即调用的函数表达式中(我仍然不完全理解,但是嘿,如果它有效)。新函数如下所示:
/*
function to display game sequence
length can be any integer greater than 1
speed is time between flashes in ms and can presently be set to 1000, 750, 500 and 250.
animation length for each speed is set by a corresponding speed class
in CSS main - .flashing1000 .flashing750 .flashing500 and .flashing250
*/
function displaySequence(length, speed) {
var sequence = generateSequence(length);
console.log(sequence);
for (i = 0; i < sequence.length; i++) {
console.log(sequence[i]);
// immediately invoked function expression
(function(i) {
setTimeout( function () {
var sq = document.getElementById(sequence[i]);
sq.classList.add('flashing' + speed.toString());
sq.addEventListener('animationend', function() {
sq.classList.remove('flashing' + speed.toString());
})
}, (speed * i))
})(i);
}
}
每个类的 CSS:
@keyframes flash {
0% {
background: #333;
}
50% {
background: orange
}
100% {
background: #333;
}
}
.flashing1000 {
animation: flash 975ms;
}
.flashing750 {
animation: flash 725ms;
}
.flashing500 {
animation: flash 475ms;
}
.flashing250 {
animation: flash 225ms;
}
我知道有一些懒惰的解决方法,但效果很好。
添加回答
举报