我想我(终于)看到了问题所在。我们会看看你的小提琴:
$(document).ready(function(){
setTimeout(animateIcon, 20000);
});
function animateIcon() {
$("#change-color").addClass("animate-color");
setTimeout(animateIcon, 20000);
}
然后从那里去。每次animateIcon
调用时,都会:
$("#change-color").addClass("animate-color");
但是,如果#change-color
已经有这个animate-color
类,那什么也做不了,所以你只能看到animate-color
一次动画。这将导致我们尝试这个 CoffeeScript 版本:
animateIcon = ->
$('#change-color').removeClass('animate-color')
$('#change-color').addClass('animate-color')
setTimeout(animateIcon, 20000)
$(animateIcon)
看起来它应该重新添加animate-color
类并重新触发 CSS 动画,但它不会。为什么不?好吧,第二次animateIcon
运行,#change-color
将animate-color
在函数的开头,当浏览器再次获得控制权时,它将animate-color
在结束时;因为#change-color
's 的类没有改变(即它之前和之后将具有相同的类),所以什么都不会发生。
为了解决这个问题,你需要让浏览器认为类实际上已经改变了。实现这一点的一种方法是这样的:
- 重置 上的类和颜色
#change-color
。
- 将控制权交还给浏览器。
- 添加
animate-color
.
- 重新启动计时器。
- 将控制权交还给浏览器。
那么我们如何将控制权交还给浏览器呢?一个setTimeout(..., 0)
电话是一个常见的技巧。将上面的内容转换为 CoffeeScript 会给我们:
addClassAndRestart = ->
$('#change-color').addClass('animate-color')
setTimeout(animateIcon, 20000)
animateIcon = ->
$('#change-color').removeClass('animate-color').css('background', 'transparent')
setTimeout(addClassAndRestart, 0)
$(animateIcon)
可能需要也可能不需要,.css('background', 'transparent')
但这就是#change-color
开始的,所以我添加了它。
演示:http: //jsfiddle.net/ambiguous/BByJD/
抱歉耽搁了,我忘记了这个问题。