2016-04-13 1 views
1

.test divをクリックするたびに時計回りに180°回転させようとしています。警告モーダルを含めるとCSSの回転方向に影響するのはなぜですか?

私が行っていることは本質的である:

  • 何の回転が発生していない場合は、180˚に回転させます。
  • 180度に回転している場合は360度に回転します。
  • 360度回転している場合は、transformtransitionのプロパティを削除し、180度に回転します。

$(".test").click(function(){ 
    var angle; 
    var matrix = $(this).css("-webkit-transform") 
    if (matrix == "none") { //div hasn't been rotated yet 
     angle = 0; 
    } 
    else { 
     var values = matrix.split('(')[1].split(')')[0].split(','); 
     var a = values[0]; //should be -1 if div is upside down, 1 if it is normal. 
     if(a == 1) { 
      $(this).removeAttr('style'); 
      angle = 0; 
     } 
     else { 
      angle = 180; 
     } 
    } 
    $(this).css({ 
     "-webkit-transform": "rotate("+(angle+180)+"deg)", 
     "-moz-transform": "rotate("+(angle+180)+"deg)", 
     "transform": "rotate("+(angle+180)+"deg)", 
     "-webkit-transition": "-webkit-transform 0.3s ease-in", 
    }); 
}); 

これは最初の2回のクリックのために正常に動作しますが、それは、私はすでにきたという事実にもかかわらず、360˚から180˚に回転だかのように第三のクリックで、div要素は、反時計回りに回転style属性を削除しました。

は、ここで作業フィドルです:https://jsfiddle.net/wwny5q5d/3/

さて、私は本当に好奇心持っている事は、私が.css()を呼び出す前にalertまたはdebugger追加した場合、私は、時計回りにそれをしたいと、第3の回転が行くということです。

alert("Now it will always rotate clockwise") 
$(this).css({ 
    "-webkit-transform": "rotate("+(angle+180)+"deg)", 
    "-moz-transform": "rotate("+(angle+180)+"deg)", 
    "transform": "rotate("+(angle+180)+"deg)", 
    "-webkit-transition": "-webkit-transform 0.3s ease-in", 
}); 

だから私の質問は:なぜ私のdivが第三クリックで時計回りに回転しない、そしてなぜalertを含めることは、それを動作させるのでしょうか?

+0

@ゴートなぜなら、何種類かのカウンタを使用しない限り、0度または360度の角度を区別することができないからです。これは、たくさんの '.test' divがあるために必要ではありません。だから、私が180度か540度に回転したいのかどうか分かりますか? – digglemister

+0

@ゴート私は私が従うかどうかわからない。現在のローテーションに180を追加するだけですか?問題は、すでにどれだけ回転しているのかわからないため、回転行列の値はmod360と同じです。 – digglemister

+0

はい、http://stackoverflow.com/questions/13592384/how-to-retrieve-the-angle-in-css3-rotateを参照してください –

答えて

2

使用

this.style.cssText.match(/\((\d+)deg\)/)[1]) 

を見ることができます。

JS Fiddle demoを参照してください。

+0

すごく、そうするよ、本当に助けてくれてありがとう。私の元のコードで、スタイル属性が削除される前にローテーションが適用されている理由は何ですか? – digglemister

+0

@snookieordie 'style'要素を削除した直後に新しいスタイル*を追加しているので、 'setTimeout(function(){0、0}'で新しいスタイルの設定を遅らせた場合、ブラウザは要素を再描画し、再描画された要素に新しいスタイルを適用します。 –

+0

@snookieordie理解を深めるために、JS Fiddleの2つの例を挙げておきます。 [最初の](https://jsfiddle.net/03mpau55/)では、 'div'を2回目にクリックすると、古いスタイルが削除された直後に新しいスタイルが適用され、ブラウザの解釈が行われるため、拡大されませんそれは「何も変えられていない」。しかし、[2番目の](https://jsfiddle.net/schnkjhp/)では、古いスタイルブラウザを削除した後、ブラウザは 'div'を再ペイントし、その後に新しいスタイルを適用します。 –

0

あなたのフィドルでは、スタイルがdivから削除される前の360で、回転がdivに適用されています。したがって角度を0に設定し、angle = 0に基づいて180に戻します。アラートダイアログでは、CSSが設定される前に遅延が加えられ、スタイリングの除去が可能になり、角度は0に設定されます。 CSSが適用されます。上記の@Gothdoが言っていることは、角度を0に戻すのではなく、div回転に180を続けて追加することです。あなたは、元の、非計算値を取得することで行わHere

+0

スタイルが削除される前に回転が適用されている理由はありますか?なぜ私のコードからこのことが起こるのかはわかりません。そして、あなたが示す例の問題は、カウンタに依存していることです。クリックごとに「回転」に5を加えたり、同様のものを追加します。私の問題は、それが避けられれば、100個の独立した部門ごとに100個の独立したカウンターを持つことは望まないということです。 – digglemister

関連する問題