ホームページ  >  記事  >  ウェブフロントエンド  >  トランジションアニメーションとdisplay_html/css_WEB-ITnoseの間の競合を解決するためのいくつかの方法

トランジションアニメーションとdisplay_html/css_WEB-ITnoseの間の競合を解決するためのいくつかの方法

WBOY
WBOYオリジナル
2016-06-21 08:53:511280ブラウズ

デモに示されているように (表示されない場合は、ソース アドレス http://jsfiddle.net/ihardcoder/HNduT/2/ を確認してください)、基本的な効果は、 「Translate」ボタンをクリックすると、青い領域の透明度が 0 になり、display:none が非表示になります。Reset ボタンをクリックすると、最初に青い領域の display:block が表示され、その後徐々に透明度が 1 に戻ります。コードは次のとおりです。

 1 var btn1 = $("#testbtn1"); 2 var btn2 = $("#testbtn2"); 3 var container = $("#container"); 4  5 btn1.on('click', function(e) { 6     container.css({ 7         "transition": "opacity 1s", 8         "-webkit-transition": "opacity 1s", 9         "-moz-transition": "opacity 1s",10         "-o-transition": "opacity 1s",11         "-ms-transition": "opacity 1s",12         "opacity": "0.1"13          });14     setTimeout(function() {15         container.css("display", "none");16     }, 1000);17 });18 btn2.on('click', function(e) {19     container.css("display","block");20     container.css("display");21     container.css("opacity","1");22 });

上記のコードの 20 行目は、このコードの機能を疑問視する人もいるかもしれません。実際、このコードがないと、[リセット] をクリックした後に得られる効果は次のとおりです。即座に表示され、透明度変更のトランジション効果はありません。

この現象の原因については、CSS3のトランジションが表示変更をサポートしていないので、14章で説明するようにしています。この線は、不透明度の遷移アニメーションを setTimeout による表示操作から分離します。

コードの 20 行目の目的については、ブラウザの UI スレッドが UI 操作を処理するときに、複数の css 属性の set 操作を同じティックに追加する、と私は理解しています (ブラウザについて To)ティック メカニズムを処理する場合は、http://www.infoq.com/cn/articles/javascript-high-performance-animation-and-page-rendering?utm_source=infoq&utm_medium=popular_links_homepage) を参照してください。コードの 20 行目を挿入すると、19 行目と 21 行目の css 属性の set 操作が同時に実行されるため、その効果は即座に表示されます。コードの 20 行目は、実際には css 属性の get 操作です。つまり、2 つの CSS 属性の set 操作の間に get 操作が挿入され、表示操作と不透明度操作が異なるティックで実行され、トランジション効果が得られます。欲しい。

2 番目の方法は、遷移時の表示に破壊的な影響があるため、ハッキングする別の方法があります。それには何も問題はありません。setTimeout です。 (これは完全に js の大きな致命的です!) コードは次のとおりです:

1  btn2.on('click', function(e) {2     container.css("display","block");3     setTimeout(function(){4        container.css("opacity","1");5     },delay);6  });

しかし、setTimeout メソッドの使用には欠点があります。5 行目の遅延はブラウザーごとに異なります。同じブラウザの異なるバージョンであっても)、ブラウザで異なる値を設定する必要があります)。私がテストした結果、chrome35 と IE10 では late=0 で十分であり、Firefox30 では late>=14 で十分でした。

3 番目の解決策は、window.requestAnimationFrame を使用することです。コードは次のとおりです。

1 btn2.on('click', function(e) {2       container.css("display","block");3       requestanimationframe(function(){4          container.css("opacity","1");5       });6    });

requestAnimationFrame の機能は、不透明度の操作を次のティックに延期し、それによって表示操作を分離することです。 setTimeout と同じです。

さらに、なぜ表示によって遷移アニメーションが破壊されるのかについては、その内部メカニズムを証明する関連情報がまだ見つかりません。私の個人的な理解では、表示操作がブラウザのリフロー操作をトリガーし、遷移がサポートされていると考えています。この効果は、ブラウザの再描画操作をトリガーするだけです。上記のデモに戻ると、visibility 属性によって表示と非表示を制御すると、トランジションの効果は破壊されません。したがって、一時的に考えられるのは、リフローとリペイントを組み合わせるとトランジションのアニメーション効果が損なわれるということです。詳しい理由については、ちょっとお教えください~

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。