CSS3トランジションに基づいて非jQueryレスポンシブイメージスライダーを構築しています。
構造はシンプルです。ビューポートと、左に浮いたLIを備えた相対的に配置されたULです。
私はそのような状況で問題に直面しています:
none 0s linear
に設定して、アニメーションの変更を防ぎます。この瞬間、UL CSSの左の値をスライダーの幅(たとえば、0pxから-1200px)だけ減らして、ビューを同じようにします。all 0.2s ease-out
に変更しています。何が問題ですか?ブラウザは変更を簡素化し、アニメーションを作成しません。
Stoyan Stefanovはブログでリフローの問題について書いています here ですが、この場合、要素にリフローを強制しようとしても機能しません。
これはこれを行うコードの一部です(簡単にするためにブラウザーのプレフィックスをスキップしました)。
ul.style.transition = 'none 0s linear 0s';
ul.style.left = '-600px';
ul.style.transition = 'all 0.2s ease-out';
ul.style.left = '0px';
問題のアクションを見るためのフィドル: http://jsfiddle.net/9WX5b/1/
要素のoffsetHeight
をリクエストすると、すべてがうまくいきます。この関数を使用して強制的にリフローを実行し、スタイルが変更された要素を渡すことができます。
_function reflow(elt){
console.log(elt.offsetHeight);
}
_
そして、リフローが必要な場所でこれを呼び出します。この例を参照してください: http://jsfiddle.net/9WX5b/2/
編集:最近これを行う必要があり、console.logするよりも良い方法があるかどうか疑問に思いました。 _elt.offsetHeight
_を独自のステートメントとして記述することはできません。オプティマイザ(少なくともChromeのもの)はリフローをトリガーしないのは、ゲッターセットなしでプロパティにアクセスするだけで、評価する必要もないためです。したがって、void
に副作用があるかどうかは確かではないため、これを行う最も安価な方法はvoid(elt.offsetHeight)
です。 (オーバーライドされるか、idk)。
function reflow( element ) {
if ( element === undefined ) {
element = document.documentElement;
}
void( element.offsetHeight );
}
ChromeとFFで問題なく動作し、ATMを実行する最も簡単で移植性の高い方法のようです。