2017-10-16 13 views
0

前に変更されます:10pxの広いそれを作る、私はスタイルが最初に適用されることを期待するクラスは、次のスニペットを参照してくださいスタイル

$('div').click(function(){ 
 
    $(this).css('width', '10px').addClass('wide'); 
 
});
div {width: 100px; height: 100px; background-color: green;} 
 
div.wide {width: 200px !important; transition: width 2s;}
<div></div> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

をし、クラスがそれを引き起こして追加します200ピクセルに拡大しますしかし、そうではありません。インスペクタを見ると、スタイル属性の前にクラス属性が変更されているのがわかります。なぜこれが、どのように私はそれが正しい方法で動作させることができますか?

ありがとうございます!

+0

は '私は、彼らが同じ時間 –

+0

' $(この)の.cssに変更、その高速で見ることができないattribute'スタイル前に変更されています( 'width'、 '10px')。promise()。then(()=> $(this).addClass( 'wide')); –

+0

あなたのコンピュータは私のものより高速かもしれません。私は間違いなく違いを見ることができます。 –

答えて

0

クラスを追加する前にちょっと待ってください。コンピュータの速度が速すぎる2つの時間の差は決してわかりません。

これは、javascriptが非同期であり、各コマンドの間にDOMをレンダリングしない方法についてのさらなる質問です。そこにタイムアウトを置くと、javascriptには今のところ何かをしてコンテキストをレンダリングに切り替えることができます。

$('div').click(function(){ 
 
    $(this).css('width', '10px'); 
 
    var smallBox = this; 
 
    setTimeout(function(){ 
 
     $(smallBox).addClass('wide'); 
 
    }, 0); 
 
});
div {width: 100px; height: 100px; background-color: green;} 
 
div.wide {width: 200px !important; transition: width 2s;}
<div></div> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

+0

確かにそれは動作します。しかし、なぜそれは正常に動作しないのですか? –

+0

ブラウザにはUIを表示するためにコンテキストを戻す理由が必要なので、タイムアウトに入れる時間は問題になりません。これは、jsが非同期であり、レンダリングと変更の変数である2つのことを同時に行うことができないためです。 –

+0

0のタイムアウトはかなり良いアイデアです。私はそれが非同期だが、それは常にそれがクラスを最初に変えて奇妙ではないのですか? –

0

jQueryの.css()方法は.css().addClass()が同時に発火することを意味し、コールバック関数を許可していないので、あなたの方法がうまくいかない理由があります。あなたができることは、代わりに.animate()メソッドを試してみることです。

$("div").click(function() { 
 
    $(this).animate({ 
 
    width: 10 
 
    }, function() { 
 
    $(this).addClass('wide'); 
 
    }); 
 
});
div {width: 100px; height: 100px; background-color: green;} 
 
div.wide {width: 200px !important; transition: width 2s;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div></div>

+0

コールバックを使用しないのに順番どおりに実行する必要がありますか? –

+0

はい、実行順序は常に上から下に、左から右に開始されます。コードは0.05秒以下で実行されているため、画面上でクリックした瞬間にその違いは表示されません。 – Vincent1989

0

javascriptのは、同じ時間に2つの仕事を、非同期です。この問題を解決するには、setTimeoutを使用できます。あなたはインスペクタで見れば、あなたがクラス属性を見ることができます setTimeout

$('div').click(function(){ 
    $(this).css('width', '10px'); 
    setTimeout(function(){ 
    $(this).addClass('wide'); 
}, 3000);}); 
関連する問題