【CSS】背景色だけ透過させる方法|rgba・color-mix・実務パターンまで完全解説

【CSS】背景色だけ透過させる方法|rgba・color-mix・実務パターンまで完全解説 HTML/CSS

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;  /* テキストも画像もすべて半透明に */
}

opacity: 0.4
テキストも透けてしまう
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);    /* 薄い半透明の赤 */
}


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と混ぜることで、任意の色を任意の透明度にできるのがポイントです。

20%
40%
60%
80%

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()や相対カラー構文が必須の知識になりつつあります。プロジェクトの要件に合わせて最適な方法を選択してください。

関連記事