2010-12-06 22 views
2

私はdivbuttonという単純なhtmlを持っています。 CSS3トランジションのCSSクラスもあります。すぐに同じCSSクラスを追加して削除してください

.animate 
{ 
    -webkit-animation-name: animation; 
    -webkit-animation-duration: 0.3s; 
    -webkit-animation-iteration-count: 2; 
} 

ボタンをクリックしてアニメーションを開始します。だから、すぐに削除して.animateクラスをdivに追加するスクリプトを書いたのですが、残念ながらそれは動作しません。確認してください:

("#button").click(function(){ 
    startAnimation(); 
    }); 

    function startAnimation() 
    { 
     if ($("#test-div").hasClass('animate')==true) 
     { 
      $("#test-div").removeClass('animate'); 
      startAnimation(); 
     } 
     else 
     { 
      $("#test-div").addClass('animate'); 
     } 
    } 

なぜjqueryは同じクラスをすぐに削除できないのですか?どうすれば修正できますか?

さらに、セレクタをクリックしてcss3トランジションを開始する別の方法がありますか?

ありがとうございました。

UPD。私は、これはややWebKitの実装では合法的なバグ、または非常に予想外の少なくとも何かのように思える(これは単純に間違っていたので、私のオリジナルの答えは、編集を経て「削除」された。)

jsfiddle.net/PfzZN/1/

+1

私はあなたがCSSアニメーションの上にきめの細かい制御を持ってしようとし、その後JavaScriptでアニメーションを使用して簡単に時間を持っていると思います。 – alex

+2

クラスが既に存在する場合は、追加しないでください**。 –

+0

関連するコードでjsFiddleを作成した場合、デバッグが容易になります:) – Domenic

答えて

8

DOMを変更するスクリプトが同じスレッド内にある場合、何らかの理由でスレッドが終了するまで変更が適用されません。したがって、あなたの方法で、ブラウザは、アニメーションクラスが削除され、同じスレッドに追加されるため、何も起こらなかったかのように見えます。

回避策として、これで十分でしょうか?

function startAnimation() 
{ 
    $("#flash-message").removeClass('animate'); 
    setTimeout(function(){ 
     $("#flash-message").addClass('animate') 
    },1); 
} 
0

でスクリプトをアップロード。 setTimeoutの場合は、次のようになります。

function startAnimation() 
{ 
    $("#flash-message").toggleClass('animate');  
    if (!$("#flash-message").hasClass('animate')) 
    { 
     setTimeout(function() 
     { 
      $("#flash-message").addClass('animate');  
     }, 1); 
    } 
} 

次に動作します。つまり、後になるまでクラスの追加を遅らせることは、Webkitがアニメーションを再起動する必要があることを認識させるようです。

偉大な解決策ではありませんが、1ミリ秒であるという事実setTimeoutは、少なくともタイミング問題ではありません...しかし、かなり奇妙です。

+0

再び私のポストを読んでください。私は "魔法の元に戻す"必要はありません、私はちょうどボタンをクリックするたびに同じアニメーションを繰り返す必要があります(そして私はアニメーション 'div'ではなく、'ボタン ')。 'toggleClass'は動作させますが、2回目のクリックだけで動作します。だから、私は自分のスクリプトを使用して、ワンクリックでアニメーションを作成しようとしています - セレクタのためのcssを 'removeClass'でリセットし、即座に' addClass'によって再度設定しようとしています。 – nukl

+0

'toggleClass'がそれを動作させる場合(他のすべての時間であっても)、アニメーションシステムの理解が間違っていると思います。この投稿を削除する必要があります。 – Domenic

+0

あなた自身を見てください:http://jsfiddle.net/PfzZN/。もちろん、Webkitベースのブラウザでのみ動作します。 – nukl

0

また、JSを使用してアニメーションイベントをリッスンすることもできます。これは難しいですが、将来あなたのアニメーションに関係しない任意のタイムアウトなどより優れています。これをチェックアウト:

http://www.w3.org/TR/css3-animations/#animation-events-

関連する問題