【CSS】背景色だけ透過させる方法|rgba・color-mix・実務パターンまで完全解説
HTML/CSS
2022.11.04
CSSで背景を透過させようとしてopacityを使ったら、テキストや画像まで一緒に透明になってしまった——という経験はありませんか?背景色だけを透過させるにはrgba()で色を指定するのが基本ですが、最近のCSSではcolor-mix()や相対カラー構文など、より柔軟な方法も登場しています。
この記事では、基本のrgba()から最新のCSS Color Level 5の手法、そしてモーダル背景やすりガラスヘッダーなど実務ですぐ使えるパターンまで、背景透過のすべてを解説します。
CSSで背景色だけを透過させ、テキストや画像はそのまま表示する方法を解説します。rgba()の基本から、CSS変数と組み合わせられるcolor-mix()や相対カラー構文などの最新手法、モーダル背景やすりガラスヘッダーなどの実務コピペパターンまで網羅しています。
opacity で背景色を透過すると何が問題なのか
まず、多くの初心者がつまずく「opacity を使ったら子要素まで透明になった」という問題を確認しましょう。
/* opacity は要素全体(子要素含む)が透過される */
.overlay {
background-color: #000;
opacity: 0.5; /* テキストも画像もすべて半透明に */
}
rgba() で背景のみ透過
テキストはくっきり表示
左のopacityではテキストまで薄くなっていますが、右のrgba()では背景だけが透過し、テキストは100%の濃さで表示されています。
opacity と背景色透過の違い
| 方法 |
影響範囲 |
用途 |
opacity: 0.5 |
要素全体(背景・テキスト・子要素すべて) |
フェードイン/アウト、非活性表示 |
rgba() / hsla() |
指定したプロパティの色のみ |
背景色だけ透過、ボーダーだけ透過 |
transparent |
指定したプロパティを完全透明に |
背景を完全に消す、グラデーションの終点 |
rgba() で背景色だけを透過する(基本)
背景色だけを透過させる最も基本的な方法は、背景色をrgba()で指定することです。
/* rgba(赤, 緑, 青, 透明度) */
.semi-transparent {
background-color: rgba(0, 0, 0, 0.5); /* 黒の50%透過 */
}
/* 現代的な構文(CSS Color Level 4): スペース区切り + / */
.modern {
background-color: rgb(0 0 0 / 50%); /* 同じ結果 */
}
4番目の値(アルファチャンネル)が透明度です。0で完全に透明、1で完全に不透明になります。
0.1
ほぼ透明
0.3
0.5
半透明
0.7
1.0
不透明
CSS Color Level 4 の現代構文
CSS Color Level 4 以降、rgba()はrgb()のエイリアスになりました。つまり、rgb()に直接アルファ値を書けるようになっています。
/* 旧構文(引き続き有効) */
background-color: rgba(0, 0, 0, 0.5);
/* 現代構文(推奨) */
background-color: rgb(0 0 0 / 0.5);
/* パーセントでも指定可能 */
background-color: rgb(0 0 0 / 50%);
すべてのモダンブラウザで対応済みです。新規コードでは現代構文を使うことを推奨します。
hsl() / hsla() で直感的に透過させる
色相(Hue)・彩度(Saturation)・明度(Lightness)で色を指定するhsl()も、同様にアルファチャンネルを追加できます。
/* hsl(色相, 彩度, 明度 / 透明度) */
.blue-transparent {
background-color: hsl(220 90% 56% / 0.5); /* 半透明の青 */
}
.red-transparent {
background-color: hsl(0 80% 55% / 0.3); /* 薄い半透明の赤 */
}
0°
赤
30°
橙
60°
黄
120°
緑
220°
青
280°
紫
hsl()は色相を0°〜360°の角度で指定するため、「青をもう少し緑寄りにしたい」「彩度を落としたい」といった色の調整がRGBより直感的です。
color-mix() でCSS変数の色を半透明にする
CSS変数(カスタムプロパティ)で色を管理している場合、rgba()では直接透明度を追加できません。この問題を解決するのがcolor-mix()関数です。
CSS変数 + rgba() の問題
:root {
--brand-color: #3b82f6;
}
/* これは動かない */
.overlay {
background-color: rgba(var(--brand-color), 0.5); /* エラー */
}
rgba()はR/G/B の数値を個別に受け取るため、#3b82f6のような16進カラーをそのまま渡せません。
color-mix() で解決する
:root {
--brand-color: #3b82f6;
}
/* color-mix() で transparent と混ぜて透明度を作る */
.overlay {
background-color: color-mix(in srgb, var(--brand-color) 50%, transparent);
}
/* 30%の濃さ(=70%透過)にしたい場合 */
.light-overlay {
background-color: color-mix(in srgb, var(--brand-color) 30%, transparent);
}
color-mix(in srgb, 色A 割合%, 色B)で2つの色を指定した割合で混合します。transparentと混ぜることで、任意の色を任意の透明度にできるのがポイントです。
color-mix()は2023年にすべてのモダンブラウザで対応済み(Baseline 2023)です。
デザインシステムでの活用例
:root {
--primary: #3b82f6;
--danger: #ef4444;
--success: #22c55e;
}
/* 1つの色から透明度バリエーションを自動生成 */
.btn-primary {
background: var(--primary);
}
.btn-primary:hover {
background: color-mix(in srgb, var(--primary) 85%, transparent);
}
.btn-primary:disabled {
background: color-mix(in srgb, var(--primary) 40%, transparent);
}
/* アラート背景 */
.alert-danger {
background: color-mix(in srgb, var(--danger) 15%, transparent);
border-left: 4px solid var(--danger);
}
.alert-success {
background: color-mix(in srgb, var(--success) 15%, transparent);
border-left: 4px solid var(--success);
}
相対カラー構文(Relative Color Syntax)
CSS Color Level 5 で導入された相対カラー構文を使うと、既存の色のアルファチャンネルだけを変更できます。
:root {
--brand: #3b82f6;
}
/* 相対カラー構文: 元の色の r/g/b はそのままに、アルファだけ変更 */
.overlay {
background-color: rgb(from var(--brand) r g b / 50%);
}
/* hslでも使える: 色相・彩度はそのまま、明度を上げてアルファを追加 */
.light-overlay {
background-color: hsl(from var(--brand) h s 80% / 40%);
}
fromキーワードで元の色を参照し、チャンネルを個別に上書きできます。r g bをそのまま書けば元の色のRGB値が維持され、/ 50%でアルファだけ変更されます。
/* 実用例: ホバーで色を10%明るく + 20%透過 */
.card:hover {
background: hsl(from var(--brand) h s calc(l + 10%) / 80%);
}
/* テキストカラーから自動的に薄い背景色を生成 */
.tag {
color: var(--tag-color);
background: rgb(from var(--tag-color) r g b / 15%);
}
相対カラー構文は2024年にすべてのモダンブラウザで対応済み(Baseline 2024)です。
oklch() で知覚的に均一な透過を実現
oklch()はCSS Color Level 4で導入された色空間で、人間の知覚に基づいた均一な明るさを実現します。
/* oklch(明度 彩度 色相 / 透明度) */
.blue-transparent {
background-color: oklch(60% 0.2 250 / 0.5);
}
.red-transparent {
background-color: oklch(60% 0.2 25 / 0.5);
}
rgb() で同じ透明度 (0.5) の比較:
rgbでは同じ透明度0.5でも、色によって「濃く見える」「薄く見える」の差が出ます。oklchなら同じ明度パラメータ(L)で統一すると、どの色相でも同じ濃さに感じられます。ブランドカラーのバリエーションを作るときに特に有効です。
実務で使える透過パターン集
ここからは、実際のWebサイトでよく使う背景透過のコピペ可能なパターンを紹介します。
パターン1: モーダルの半透明オーバーレイ
/* モーダルの背景オーバーレイ */
.modal-overlay {
position: fixed;
inset: 0;
background-color: rgb(0 0 0 / 60%);
z-index: 100;
display: flex;
align-items: center;
justify-content: center;
}
/* モーダル本体 */
.modal-content {
background: #fff;
border-radius: 12px;
padding: 32px;
max-width: 500px;
width: 90%;
box-shadow: 0 25px 50px rgb(0 0 0 / 25%);
}
背景コンテンツがここに表示されます…
モーダルタイトル
背景は60%の黒で透過しています
パターン2: すりガラス風ヘッダー(backdrop-filter)
/* スクロール追従のすりガラスヘッダー */
.glass-header {
position: sticky;
top: 0;
background: rgb(255 255 255 / 70%);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px); /* Safari対応 */
border-bottom: 1px solid rgb(0 0 0 / 10%);
z-index: 50;
}
SiteTitle
Menu
コンテンツがここに表示されます。
背景のグラデーションがヘッダー越しにぼやけて見えます。
rgba()の半透明背景とbackdrop-filter: blur()を組み合わせることで、Apple風のすりガラス効果を実現できます。
パターン3: カード画像の上にカラーオーバーレイ
/* 画像の上に半透明オーバーレイ + テキスト */
.card-overlay {
position: relative;
overflow: hidden;
border-radius: 12px;
}
.card-overlay img {
width: 100%;
display: block;
}
.card-overlay::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(
to top,
rgb(0 0 0 / 80%) 0%,
rgb(0 0 0 / 0%) 60%
);
}
.card-overlay .text {
position: absolute;
bottom: 16px;
left: 16px;
right: 16px;
color: #fff;
z-index: 1;
}
カードタイトル
下部にかけて黒が濃くなるグラデーションオーバーレイ
画像の下部にかけて黒が濃くなるlinear-gradientをかぶせることで、テキストの可読性を確保しつつ画像も見せる定番テクニックです。
パターン4: ヒーローセクションのダーケニング
.hero {
position: relative;
background-image: url("hero.jpg");
background-size: cover;
background-position: center;
}
/* 擬似要素で背景画像の上にカラーフィルタ */
.hero::before {
content: "";
position: absolute;
inset: 0;
background: rgb(0 0 0 / 50%);
}
/* ブランドカラーのオーバーレイにするパターン */
.hero-brand::before {
background: rgb(59 130 246 / 60%);
}
パターン5: ツールチップの半透明背景
.tooltip {
background: rgb(15 23 42 / 90%);
color: #fff;
padding: 6px 12px;
border-radius: 6px;
font-size: 13px;
box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
}
パターン6: ローディング画面
.loading-overlay {
position: fixed;
inset: 0;
background: rgb(255 255 255 / 80%);
backdrop-filter: blur(4px);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
}
.spinner {
width: 40px;
height: 40px;
border: 3px solid rgb(0 0 0 / 10%);
border-top-color: #3b82f6;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
グラデーション背景の透過
linear-gradient()やradial-gradient()でも透過色を使えます。
/* 左から右へフェードアウト */
.fade-right {
background: linear-gradient(
to right,
rgb(59 130 246 / 80%),
rgb(59 130 246 / 0%)
);
}
/* 中央が透明な放射グラデーション(ビネット効果) */
.vignette {
background: radial-gradient(
circle,
transparent 40%,
rgb(0 0 0 / 60%) 100%
);
}
mix-blend-mode で透過風の表現
mix-blend-modeを使うと、要素の色を下の要素と混合して透過に似た効果を作れます。
/* 乗算(multiply): 暗い部分が残り、白は透明になる */
.multiply-overlay {
background: #3b82f6;
mix-blend-mode: multiply;
}
/* スクリーン(screen): 明るい部分が残り、黒は透明になる */
.screen-overlay {
background: #3b82f6;
mix-blend-mode: screen;
}
/* オーバーレイ: 暗い部分はより暗く、明るい部分はより明るく */
.overlay-blend {
background: #3b82f6;
mix-blend-mode: overlay;
}
rgba()による透過が「色を薄くする」のに対し、mix-blend-modeは「色の合成方法を変える」アプローチです。写真加工のようなクリエイティブな効果が得られます。
ダークモード対応の透過設計
ダークモードでは、ライトモードと同じ透明度では見え方が変わります。prefers-color-schemeで切り替えましょう。
/* ライトモード */
.card {
background: rgb(255 255 255 / 80%);
backdrop-filter: blur(12px);
border: 1px solid rgb(0 0 0 / 10%);
}
/* ダークモード: 透明度を調整 */
@media (prefers-color-scheme: dark) {
.card {
background: rgb(30 41 59 / 80%);
border: 1px solid rgb(255 255 255 / 10%);
}
}
/* CSS変数 + color-mix() でテーマ対応 */
:root {
--surface: #ffffff;
--surface-transparent: color-mix(in srgb, var(--surface) 80%, transparent);
}
@media (prefers-color-scheme: dark) {
:root {
--surface: #1e293b;
--surface-transparent: color-mix(in srgb, var(--surface) 80%, transparent);
}
}
アクセシビリティ: 透過背景のコントラスト比
半透明背景の上にテキストを置く場合、WCAG 2.1のコントラスト比基準を満たす必要があります。
| 基準 |
コントラスト比 |
対象 |
| AA(標準) |
4.5:1 以上 |
通常テキスト(18px未満) |
| AA(大きなテキスト) |
3:1 以上 |
大きなテキスト(18px以上 or 14px太字) |
| AAA(強化) |
7:1 以上 |
通常テキスト |
/* 注意: 透過度が高すぎるとテキストが読みにくくなる */
/* NG: 背景が薄すぎて白背景上で白文字が読めない */
.bad {
background: rgb(0 0 0 / 20%);
color: #fff;
}
/* OK: 十分な濃さを確保 */
.good {
background: rgb(0 0 0 / 70%);
color: #fff;
}
/* text-shadow で可読性を補助するテクニック */
.with-shadow {
background: rgb(0 0 0 / 40%);
color: #fff;
text-shadow: 0 1px 3px rgb(0 0 0 / 60%);
}
パフォーマンスの比較
透過の方法によってレンダリングコストが異なります。
| 方法 |
GPU負荷 |
備考 |
rgba() / hsl() |
低 |
単純な色指定。パフォーマンスへの影響はほぼない |
opacity |
低 |
GPUレイヤーで処理。アニメーションに最適 |
linear-gradient |
中 |
複雑なグラデーションは再描画コストが増加 |
backdrop-filter |
高 |
背後の要素を毎フレーム再合成。多用注意 |
mix-blend-mode |
高 |
レイヤー合成が必要。スクロール領域では注意 |
backdrop-filterは見た目が美しい反面、スクロール領域で多用するとモバイルでカクつく原因になります。固定ヘッダーやモーダルなど限定的な場面で使うのがベストです。
まとめ: 方法の選び方チャート
| やりたいこと |
使うべき方法 |
| 背景色だけ半透明にしたい |
rgb(R G B / 透明度) または rgba() |
| 色相で直感的に指定したい |
hsl(H S L / 透明度) |
| CSS変数の色を半透明にしたい |
color-mix(in srgb, var(--color) 50%, transparent) |
| CSS変数の色の透明度だけ変えたい |
rgb(from var(--color) r g b / 50%) |
| すりガラス効果を出したい |
rgba() + backdrop-filter: blur() |
| 画像にフェード効果をかけたい |
linear-gradient + rgba() |
| 要素全体をフェードさせたい |
opacity(子要素も透過して良い場合) |
| 色の合成(写真加工風)をしたい |
mix-blend-mode |
背景色の透過はrgba()が基本ですが、CSS変数を使うプロジェクトではcolor-mix()や相対カラー構文が必須の知識になりつつあります。プロジェクトの要件に合わせて最適な方法を選択してください。
関連記事