ある要素にマウスホバーやクリックイベントを行い、非表示の要素を「display: none;
」から「display: block;
」に切り替える際、transition
を使用して要素を徐々に表示させようとすると、transition
が効かず要素が瞬時に出現してしまい困ったなという経験はないでしょうか。
今回の記事では、display
にtransition
が効かない時の対処法について解説します。
コンテンツ
displayにtransitonが効かない
今回はマウスホバーイベントで考えます。
HTML
<div class="content"></div>;
CSS
.content { display: none; //要素を非表示。 } .content:hover { display: block; //要素を表示。 transition: .3s; //アニメーションの速度を指定。 }
上記のようにdisplay
を使用しnone
からblock
に切り替えて非表示の要素を表示させる際、transition
は効かず要素が高速に出現します。
実はdisplay
プロパティにtransition
を指定しても動作しません。
なぜdisplayにtransitonが効かないのか
transition
は「2つの要素を対象にその状態間の変化を定義する」プロパティです。
要素を非表示にする「display: none;
」は存在が無効にされた状態であるため、transition
の対象にはならず、transition
を指定しても反応しないのです。
displayにtransitonが効かない時の対処法
transition
を使用して表示非表示の変化を指定したい時はdisplay
を使用するのではなく、visibility
とopacity
の2つのプロパティを併用することで、transition
を機能させることができます。
CSS
.content { visibility: hidden;//文書のレイアウトを変更することなく要素を非表示。 opacity: 0; } .content:hover { visibility: visible;//文書のレイアウトを変更することなく要素を表示。 opacity: 1; transition: .3s;//アニメーションの速度を指定。 }
visibilityとopacityの併用が必要な理由
visibility
とopacity
の二つのプロパティが必要な理由について、片方のみ指定した場合を考えてみます。
visibilityのみ指定した場合
visibility
プロパティはdisplay
と同様に要素の表示非表示を指定するプロパティですが、visibility: hidden;
はdisplay: none;
のように要素の存在を完全に無効にするわけではなく、レイアウト自体は変更されません。
見えないしクリックもできないが、そこにはあるというイメージです。
したがって要素自体は存在するので、transition
が適用されます。
しかし、visibility
を指定しただけではtransition
で要素を徐々に表示させることができません。display
を使用した時のように、要素が高速に表示されます。
visibility
はtransition
の適用対象ではありますが、単独で使用すると変化をつけられません。
.content { visibility: hidden;//文書のレイアウトを変更することなく要素を非表示。 } .content:hover { visibility: visible;//文書のレイアウトを変更することなく要素を表示。 transition: .3s;//アニメーションの速度を指定。 }
opacityのみ指定した場合
opacity
プロパティは要素の透明度を指定するプロパティです。二つの要素にopacity: 0;
とopacity: 1;
を指定し、transition
を使用してイベントを発生させると要素が徐々に表示されます。
しかし、opacity: 0;
で透明にした要素はdisplay
のように完全に消えるわけではないので、要素をクリックできてしまい非常に厄介です。非表示コンテンツの下にリンクなどがある場合、そのリンクをクリックすることができなくなります。
.content { opacity: 0; } .content:hover { opacity: 1; transition: .3s;//アニメーションの速度を指定。 }
visibilityとopacityを併用した場合
visibility
とopacity
を併用した場合、片方のみ指定した場合の問題をすべて解決することができます。
opacity
のおかげでtransition
の変化をつけることができ、visibility
のおかげで要素をクリックできなくなります。
お互いの短所を補っているわけです。
.content { visibility: hidden;//文書のレイアウトを変更することなく要素を非表示。 opacity: 0; } .content:hover { visibility: visible;//文書のレイアウトを変更することなく要素を表示。 opacity: 1; transition: .3s;//アニメーションの速度を指定。 }
まとめ
以上、display
にtransition
が効かない時の対処法について解説しました。
表示非表示の際にアニメーションをつけたい時はvisibility
とopacity
を使用すると良いでしょう。
参考
transition – CSS: カスケーディングスタイルシート
visibility – CSS: カスケーディングスタイルシート