• CSSのopacityとrgba()は子要素まで透明にするかで使い分ける

CSSのopacityとrgba()は子要素まで透明にするかで使い分ける

公開日: 執筆:佐藤

文字や子要素を含む要素全体を半透明にするならopacity、背景色や境界線など一つの色だけを半透明にするならrgba()を使います。

背景だけを透かしたい要素へopacityを指定すると、上に載せた文字やボタンも薄くなります。子要素へopacity: 1を指定しても、親要素の透明化を取り消せません。透明にする対象を先に決め、要素全体と色を分けます。

opacityは子要素を描画した後の全体へ適用される

次の指定では、背景色だけでなく、文字、境界線、子要素も半透明になります。

<div class="notice">
  <p>入力内容を確認してください。</p>
  <button type="button">確認する</button>
</div>
.notice {
  background-color: #244c66;
  color: #fff;
  opacity: 0.5;
}

opacityは、要素とその子孫を一度一つの画像として描画し、その全体を現在の背景へ合成する処理として定義されています。opacity: 0.5は、箱の背景だけに50%の透明度を指定するものではありません。

値は0から1までです。0は完全な透明、1は完全な不透明で、初期値は1です。範囲外の値は0から1の範囲へ収められます。

子要素のopacityを1にしても親の透明度は戻らない

親要素へopacity: 0.5を指定した後で、ボタンだけを不透明に戻そうとしても、次の指定では戻りません。

.notice {
  opacity: 0.5;
}

.notice button {
  opacity: 1;
}

ボタンのopacity: 1は、ボタン自身を描画するときの値です。その後、ボタンを含む.notice全体へ0.5の透明度が適用されます。子要素から親要素の合成結果を打ち消すことはできません。

背景画像だけを薄くし、文字を不透明に保つ場合も同じです。画像のある要素へ文字を子要素として入れてからopacityを指定せず、背景用の要素と内容用の要素を分けます。

rgba()は指定した色のアルファ値だけを変える

背景色だけを半透明にするなら、background-colorへrgba()を指定します。

.notice {
  background-color: rgba(36, 76, 102, 0.5);
  color: #fff;
}

この指定では、背景色だけが半透明になり、文字と子要素は通常の不透明度で描画されます。rgba()は、赤、緑、青の三成分へアルファ値を加えた色の指定です。最後の0.5が色の透明度を示します。

rgba()は背景専用ではありません。色を受け付けるプロパティへ使えます。

.notice {
  background-color: rgba(36, 76, 102, 0.5);
  border: 1px solid rgba(36, 76, 102, 0.8);
  color: rgba(255, 255, 255, 1);
}

背景色、境界線、文字色へ別々のアルファ値を指定できます。透明にする範囲を色ごとに分けられる点が、要素全体へ適用するopacityとの違いです。

opacityとrgba()は目的から選ぶ

目的 選ぶ指定 影響する範囲
部品全体を薄く見せる opacity 背景、境界線、文字、子要素を含む描画全体
背景色だけを透かす background-color: rgba() 背景色だけ
境界線だけを透かす border-color: rgba() 境界線の色だけ
背景画像だけを透かす 背景用要素を分けてopacity 分けた背景用要素の描画全体

設定箇所が少ないという理由だけで選びません。文字まで薄くしてよいか、背景の下にある色や画像を見せたいか、子要素を独立して見せる必要があるかを決めます。

半透明の背景上に文字を置く場合は、下に見える画像や色によって文字との明暗差が変わります。一つの背景だけで読めても、別の画像へ替えると読みにくくなることがあります。実際に使う背景をすべて確認します。

opacityが1未満の要素は新しいstacking contextを作る

opacityが1未満の要素は、一つの画像として合成されるため、新しいstacking contextを作ります。子要素のz-indexを大きくしても、その子だけを親のstacking contextの外へ出すことはできません。

透明度を指定した後で重なり順が変わったように見える場合は、z-indexの数値だけを増やさず、どの要素がstacking contextを作っているかを確認します。背景色へrgba()を指定しただけなら、opacityによるこの規則は適用されません。

まず、半透明にしたい部品を一つ選び、背景、境界線、文字、子要素のうち、どれを透かすかを書き出してください。全体ならopacity、一つの色ならrgba()を指定します。文字を不透明に保ったまま背景画像だけを薄くする場合は、二つを別の要素へ分けてから重なり順を確認します。

戻る