これは本当に奇妙な問題です。コードで何か間違ったことをしているとは思いません。現在のブラウザーの実装にはバグがあるだけです。
CSS トランジションでこの種の一見明らかなバグに遭遇したことがあります。ケース、私のWebKitの修正)。
私はこれを深く掘り下げましたが、レイアウト エンジン (WebKit、Gecko、および Presto) をサポートする 3 つの主要なトランジションで機能するクリーンなソリューションを思いつくことができませんでした。とはいえ、ここに私が見つけたものがあります。うまくいけば、私よりも賢い人 (または新鮮な目でこれに来る人) がこの答えを真の解決策に変えることができます.
Gecko と Presto (WebKit は除く)
(私はブラウザー エンジニアでもなく、仕様に精通していません) の現在または以前の値は、transition-property
必要かどうかに関係なく引き続きレンダリングされるようです。したがって、 の値を変更してもtransition-property
、ブラウザは引き続きバックグラウンドで高さの遷移をレンダリングしており、高さを元に戻すと、その末尾が表示されます。
ただし、解決策があります。JavaScript で作成しtransition
(スタイル シートのどこにも配置しないでください)、削除し (その後、DOM のどこにもtransition
ルールが適用されません#upper
)、高さを変更してから、再度追加します。 . 完璧ではありませんが、バグ依存のハックでもありません。
http://jsfiddle.net/grantheaslip/e3quW/
JavaScript
upper.style.removeProperty('transition');
upper.style.removeProperty('-o-transition');
upper.style.removeProperty('-moz-transition');
upper.style.removeProperty('-webkit-transition');
upper.style.removeProperty('height');
// force a reflow
// if (upper.offsetParent) { /* empty */ }
upper.style['transition'] = 'height 1000ms';
upper.style['-o-transition'] = 'height 1000ms';
upper.style['-moz-transition'] = 'height 1000ms';
upper.style['-webkit-transition'] = 'height 1000ms';
スタイルシート
#upper {
background-color: red;
}
WebKit (Gecko や Presto ではありません!)
1 ミリ秒のタイムアウトが原因でしか機能しないものは、おそらく実稼働に近づくべきではありませんが、誰かがこの問題の根底に到達するのに役立つ場合に備えて、これは指摘する価値があると思います.
私の推測では、WebKit には Presto や Gecko と同じ問題はありませんが、代わりに、同じ関数で適用されたスタイル変更を収集して一度に適用する最適化が含まれています。繰り返しますが、WebKit のソースまたは CSS3 仕様に近づいたことのない誰かからの純粋な憶測です。
http://jsfiddle.net/grantheaslip/DFcg9/
JavaScript
window.setTimeout(function() {
upper.style.removeProperty('transition-property');
upper.style.removeProperty('-o-transition-property');
upper.style.removeProperty('-moz-transition-property');
upper.style.removeProperty('-webkit-transition-property');
upper.style.removeProperty('opacity');
lower.style.removeProperty('opacity');
}, 1);
Gecko、Presto、および WebKit
両方のソリューションを組み合わせたものを次に示します。繰り返しますが、タイムアウトのハックのため、これは実際には使用しないでください。
http://jsfiddle.net/grantheaslip/N3NrB/