私は(最終的に)問題を見たと思います。あなたのフィドルを見てみましょう:
$(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
アニメーションは 1 回しか表示されません。これにより、次の CoffeeScript バージョンを試すことができます。
animateIcon = ->
$('#change-color').removeClass('animate-color')
$('#change-color').addClass('animate-color')
setTimeout(animateIcon, 20000)
$(animateIcon)
クラスを再追加しanimate-color
て CSS アニメーションを再トリガーする必要があるように見えますが、そうではありません。なぜだめですか?2 回目のanimateIcon
実行で#change-color
はanimate-color
、関数の先頭にありanimate-color
、ブラウザーが再び制御を取得したときに最後に表示されます。のクラスは#change-color
変更されていない (つまり、前後で同じクラスを持つ) ため、何も起こりません。
この問題を回避するには、クラスが実際に変更されたとブラウザーに認識させる必要があります。これを実現する 1 つの方法は次のとおりです。
- のクラスと色をリセットします
#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/
遅れて申し訳ありません、私はこの質問を見失いました。