opacity・display・visibilityを使って
CSSのみで要素を表示/非表示にする方法と注意点
コーディングをしていく中で、とある条件によっては表示して、とある条件によっては非表示にしたいという事はよく起こります。
特にレスポンシブデザインなどのコーディングにおいては、PC/SPに応じて要素を出したり隠したりというのはしょっちゅうかもしれません。
この表示・非表示は、今ではCSSだけで行えるのですがやり方は大きく分けて3種類あり、それぞれに特徴があり、表示・非表示だけでない他の設定にも絡んで来ることもあるため、それぞれどういうケースならどの設定を使えばというのを知っておく必要があります。
今回はそんなCSSのみで要素を表示・非表示にする方法を見ていきましょう。
CSSで要素の表示・非表示を変えるのは大きくわけて3種類
先ほども書いてきたように、CSSを使って要素の表示もしくは非表示にする方法は、下記の3つが主な設定方法になります。
- opacity: 0; / opacity: 1;
- display: none; / display: block;
- visibility: hidden; visibility: visible;
この設定を使う事で、表示と非表示を切り替える事ができます。
それぞれ同じ「表示・非表示」ですが書いてきたようにそれぞれに特徴があります。
opacity: 0 / 1 での表示・非表示
ではopacity
について見ていきたいと思います。opacity
はその要素の透明度を設定するものになります。
値は0~1になりますが、実際には0.01~1までの100分の1単位の値で指定することができ、1がデフォルトの初期値で表示、0にすれば透明=非表示という形になります。
<p class="opacity1">opacity: 1の設定。opacity: 1の設定。</p>
<p class="opacity08">opacity: 0.8の設定。opacity: 0.8の設定。</p>
<p class="opacity06">opacity: 0.6の設定。opacity: 0.6の設定。</p>
<p class="opacity04">opacity: 0.4の設定。opacity: 0.4の設定。</p>
<p class="opacity02">opacity: 0.2の設定。opacity: 0.2の設定。</p>
<p class="opacity0">opacity: 0の設定。opacity: 0の設定。</p>
.opacity1{
opacity: 1;
}
.opacity08{
opacity: 0.8;
}
.opacity06{
opacity: 0.6;
}
.opacity04{
opacity: 0.4;
}
.opacity02{
opacity: 0.2;
}
.opacity0{
opacity: 0;
}
display: none / block での表示・非表示
次にdisplay
について見ていきたいと思います。
こちらはopacity
のような数値の値はなく、表示か非表示かをそのまま指定します。
<p class="dis-block">
display: blockで表示している
</p>
<p class="dis-none">
display: noneで非表示にしている
</p>
<p>
テキストの途中や色々な要素に使えます。<br class="dis-none">
こうすると改行が非表示になります。
</p>
.dis-block{
display: block;
}
.dis-none{
display: none;
}
visibility: hidden / visible での表示・非表示
最後が、visibility
を使った表示・非表示になります。
とはいえ、先述のopacity
やdisplay
と比較するとそこまで使用する機会はなく、ほとんどのケースで、opacity
やdisplay
が使われる事が多いです。
<p class="visible">visibility: visibleで表示している</p>
<p class="hidden">visibility: hiddenで非表示にしている</p>
.visible{
visibility: visible;
}
.hidden{
visibility: hidden;
}
それぞれの違いや特徴について
同じ表示・非表示という設定になりますが、何度も書いていたようにそれぞれ似てはいるものの細かなところで違いそれぞれに特徴があります。
単に非表示にすれば良いという事では無く、どういう時にどれを使えば良いかというのも変わってくるため、それぞれの違い・特徴はしっかりとおさえておく必要があります。
ブラウザがレンダリングするかどうか
opacity: 0 | display: none | visibility: hidden |
---|---|---|
○ | × | ○ |
opacity: 0;
および、visibility: hidden;
ともにブラウザにレンダリングされます。
レンダリングはされるのですが、非表示設定になるため、結果的に要素の中にあるコンテンツや背景カラーなども非表示となります。
ただ、その場に何も表示されないブロックができる形になります。
そのため、仮に非表示にした要素が、高さのある設定になっているとその高さ分だけは非表示だけれども存在していることになり、見た目何もない余白だけが表示されるという形になります。
その一方で、display:none;
はレンダリングがされない仕様になっていますので、高さを設定していたとしても関係ありません。
クリックやコピペなどができるかかどうか
opacity: 0 | display: none | visibility: hidden |
---|---|---|
○ | × | × |
クリックやコピペは、opacity: 0;
でのみ可能になります。
非表示にはなっているものの、コピペもクリックも可能な一方、display: none;
やvisibility: hidden;
はコピペやクリックなどはできない仕様になっています。
CSS Transitionに対応するか
opacity: 0 | display: none | visibility: hidden |
---|---|---|
○ | × | △(実質×) |
cssのtransition
については、opacity
とvisibility
は対応していますが、display: none;
に関しては対応していません。
cssで動きを付けるために、transition
を設定することは多々あるかと思いますが、このtransition
と相性が良いのは、opacity
になり、最も良い感じの想定している通りのtransition
が動いてくれ、徐々に非表示から表示、表示から非表示へと切り替わってくれます。
visibility
もtransition
に対応という事にはなるのですが、非表示から表示とする場合は即表示という性質を持っていて、逆に表示から非表示の場合も、transition
が完了後に非表示という動きになり、直前までコンテンツが表示されてしまうという事になり、一般的に想定しているtransition
の動きにはならず、対応はしてるけれど実質対応してないようなものです。
どれをどういうシーンで使うのが良いのか
それぞれに特徴があって違いがあるものの、結局のところ、それぞれはどういうシーンに使うのかおちうのはよく悩むポイントかと思います。
transitionなどアニメーション的な動きを要するかどうか
これに尽きるのかなと思います。transition
などを使いたい場合は、どうしてもdisplay: none;
からdisplay: block;に
切り替える際は、transition
が効かずに即表示になってしまい相性が悪いところがあります。
一方、opacity:0
はtransition
が完全に効いてくれるのですが、opacity: 0;
は見えないだけどその領域にコンテンツが存在するため、クリックができるなどのデメリットがあります。しかしながら、実はopacity:0
とvisibility: hidden;
は両方同時に設定することで、非表示にしつつクリックすることもできなくし、さらにtransitionも効かす事ができるという理想的な使い方が可能になります。
opacity
とvisibility
は併用することで、それぞれのデメリットを補う事が可能になっています。
半透明や薄く表示の際はopacityを使って表示
何かの上に表示したり、重ねて表示をして上側の表示領域を少しだけ半透明にして表示といった使い方をデザインなどではよくしますが、そういったシーンでは、opacity
をよく使われます。
例えば、画像にマウスオーバーをした際に、少し薄く表示したりする場合などは
a:hover img{
opacity: 0.7;
}
といったような使われ方は、よくしているのではないかと思います。
レスポンシブなどで非表示にしたい場合にdisplay:noneを使う
display: none;
を使うシーンとして多いのは、やはりレスポンシブなどでPC向けとスマホ向けでデザインが変わったりするシーンかなと思います。
PCでは情報が多めに掲載できるけれど、スマホでは多すぎて一部をカットするという事はデザインによって起こりえますが、そういったシーンでは、PCでは通常通り表示して、スマホ用だけ非表示にしたい箇所にdisplay: none;
を設定するというのはよく使います。
また、スマホなどでは端末毎でサイズが異なったり仕様や設定も変わることになるため、改行位置を設定しないという使い方をすることもあり、そういう場合は、br
タグにdisplay: none;
を設定してスマホでは改行を固定しないという使い方もよく使われます。
全てコードとしては存在するのでSEOスパムには注意
かなり昔にSEOで隠しテキストなどが流行った時代がありました。
ソースコード上ではテキストを書いているものの、それらを全てdisplay: none;
で隠すというやり方です。
もちろん今はこんなテクニックは廃れに廃れ行う人はまずいませんが、今回の3つの表示・非表示の設定は全て、見た目上は消えるもののソースコード上には表示されるものになり、検索エンジンにもしっかりと読み込まれます。
通常通りの使い方であれば問題ありませんが、ちょっとSEO目的に多めに書いて、残りはdisplay: none;
で非表示にしておこうといったような使い方は推奨されませんし、あまりに非表示要素が多いのも好ましいとも言えませんので、どう使うかなどはしっかり考えた上で使いましょう。
まとめ
cssだけでできる表示・非表示についてまとめました。
方法としては3種ありますが、実際に現場として使うシーンとしては、display: none;
を使うか、opacity
&visibility
をセットで使うかというシーンが多いのではないかなと思います。
完全に非表示として扱うか、表示非表示の際にフェードなどのアニメーション的な要素を組み合わせて使いたいのか、そういったシーンに応じてそれぞれ使い分ける必要があります。
どれも実際にコーディングする際に使われるものですので、用途に合わせて使えるようにしておきたいですね。
記事のシェアにご協力お願いします