displayで表示非表示を制御するとフェードイン、フェードアウトができない

例となるコード

うっすらと表示するフェードイン、うっすらと消えるフェードアウト。

HTML&CSSでフェードイン、フェードアウトを実装する際に、下記のようにdisplay:none;とdisplay:block;で制御しようとすると書くとアニメーションが利かず、いきなり消えたり、いきなり表示されてしまう。

<style>
div#sample{
   width:200px;
   height:200px;
   background:red;
}
div#sample2{
   width:200px;
   height:200px;
   background:blue;
   display:none;
   transition:.2s ease;
}
div#sample:hover div#sample2{
   display:block;
}
</style>
<div id="sample">
<div id="sample2">
</div>
</div>

原因

アニメーションは数値で連続性のあるプロパティが変化する際に、最初と最後の間の値を保管することでアニメーションとなる。一方displayは離散的なプロパティなので、値同士の間みたいなものがないので、補完しようがない。という理解。

また、displayはレイアウトを変更するプロパティなので、値が変わるとそもそものレイアウトが再計算されてしまうので、アニメーションが適用されないという記事もあった。

解決策

opacityを使用して、透明度を制御することでアニメーションができる。

<style>
div#sample{
   width:200px;
   height:200px;
   background:red;
}
div#sample2{
   width:200px;
   height:200px;
   background:blue;
   opacity:0;
   transition:.2s ease;
}
div#sample:hover div#sample2{
   opacity:1;
}
</style>
<div id="sample">
<div id="sample2">
</div>
</div>

コメント

タイトルとURLをコピーしました