こんにちは、さち です。
上の画像のように、コンテンツの上に半透明の黒い背景をかけて、さらにその上に別のコンテンツを表示する。こんなデザインをよく見かけると思います。
このようなデザインを CSS の opacity
を使って実装しようとしたんですが、上手くいきません……。
今回は、その解決方法について書いていきます。
「opacity」の継承は上書きできない
下図のように、「親要素」のコンテンツの上に、半透明の黒背景を持つ「子要素」を重ねて、さらにその上の「孫要素」にコンテンツを表示しようと思います。
そこで、下記のような HTML を用意します。
<div id="vertical"> <div id="dark"> <div id="horizontal"></div> </div> </div>
CSS はこんな感じです。
html, body, div { height: 100%; } /* 縦シマ(青) */ #vertical { background-image: linear-gradient(90deg, blue 25%, transparent 25%); background-size: 36px 36px; padding: 8%; } /* 黒背景 */ #dark { opacity: 0.6; background-color: black; padding: 8%; } /* 横シマ(赤) */ #horizontal { opacity: 1; background-image: linear-gradient(red 25%, transparent 25%); background-size: 36px 36px; }
親要素 #vertical
は、背景に「縦しま(青)」を設定。
子要素 #dark
は、opacity: 0.6;
を設定して半透明の黒い背景に。
孫要素 #horizontal
は、opacity: 1;
で再び不透明に。背景には「横しま(赤)」 を設定しています。
実際に表示するとこうなります。
ダメじゃん。
#horizontal
に opacity: 1;
を設定したのに半透明のまま。赤い横シマが透けてしまい、青い縦シマが見えています。
実は、opacity
の子要素への継承は上書きできない仕様なんです。不便っ!!
「rgba()」を使って実装する
仕様上、opacity
では実装できないので、黒背景 #dark
の背景色の指定に rgba()
を使います。
rgba()
は、色を指定する「RGB(赤・緑・青)」に加えて、不透明度を指定する「A(アルファ)」も記述できる形式です。
今回の場合、欲しい色は不透明度 0.6(opacity: 0.6;
) の黒色なので、rgba(0, 0, 0, 0.6)
と記述します。
/* 縦シマ(青) */ #vertical { background-image: linear-gradient(90deg, blue 25%, transparent 25%); background-size: 36px 36px; padding: 8%; } /* 黒背景 */ #dark { background-color: rgba(0, 0, 0, 0.6); padding: 8%; } /* 横シマ(赤) */ #horizontal { background-image: linear-gradient(red 25%, transparent 25%); background-size: 36px 36px; }
これを実際に表示するとこうなります。
上手くいきました。
黒背景 #dark
を半透明にしつつ、#horizontal
を完全な不透明にできました。赤い横シマも透けていません。
コメント