CSS の色域:sRGB / Display P3 / Rec2020 / OKLCH の違いと使い分け

約9分

CSS で色を書くときの色域は長らく sRGB(hex / rgb / hsl)に固定でしたが、CSS Color Module Level 4 と Display P3 ディスプレイの普及で、より広い色域(Display P3、Rec2020)が現実に使えるようになりました。本記事では各色域がカバーする色の範囲、CSS での書き方、ディスプレイ・ブラウザ側の対応状況、そして OKLCH のような知覚均等な空間との関係を整理します。

色域とは

「色域(gamut)」は、ある色空間で表現できる色の集合。広いほど鮮やかな色が出せるが、対応するディスプレイがないと意味がありません。

各色域がカバーする CIE 1931 chromaticity diagram 上の三角形面積(おおよそ):

色域占有率主な用途
sRGB35%従来の Web、HD 動画
Display P345%iPhone・Mac・最新スマホ
Rec202075%UHD/4K HDR コンテンツ
Rec2100Rec2020 と同じHDR10 / HLG

数字は「人間が見える全色のうちこの色空間でどれだけ表現できるか」のおおよその割合。Rec2020 を完全に表示できるディスプレイはまだ少ないですが、Display P3 はモダン端末で標準です。

CSS での書き方

従来:sRGB に固定

color: #ff0000;
color: rgb(255, 0, 0);
color: hsl(0, 100%, 50%);

これらはすべて sRGB 空間。Display P3 の赤を表現できない(最大値 255 でも sRGB の範囲を超えられない)。

color() 関数:色空間を明示

color: color(display-p3 1 0 0);
color: color(rec2020 1 0 0);

color() 関数で色空間を明示して指定。display-p3(1, 0, 0) は sRGB の (1, 0, 0) より鮮やかな赤

oklch():知覚均等な空間

color: oklch(70% 0.2 30);

OKLCH(Oklab を極座標で書いたもの)は、人間の視覚に均等になるように設計された色空間。

  • L(明度):0% - 100%
  • C(彩度、chroma):0 - 0.4 程度
  • H(色相):0deg - 360deg

OKLCH は色域ではなく色の表現方法。OKLCH の値は Display P3 や Rec2020 の色域もカバーできます(C を大きくすれば sRGB 域外の色も表せる)。

display-p3 キーワード

color: rgb(from #ff0000 r g b / display-p3);
/* CSS Color 5 の機能、まだ広くは未対応 */

CSS Color Module Level 5 では from 構文での色空間変換が定義されていますが、サポートはまだ限定的。

なぜ OKLCH が推されるのか

hsl(0deg, 100%, 50%) のような HSL は記述しやすいが、色相を変えても明度が一定にならない

hsl(0deg, 100%, 50%)    /* 純赤 */
hsl(60deg, 100%, 50%)   /* 黄色 — 同じ "50% 明度" のはずが眩しい */
hsl(240deg, 100%, 50%)  /* 純青 — 黒に近い */

HSL の「明度 50%」は計算上の値で、人間が感じる明るさは色相によって大きくぶれる。OKLCH はこの問題を解消:

oklch(70% 0.2 0)    /* 明度 70% の赤 */
oklch(70% 0.2 60)   /* 明度 70% の黄色 — 知覚的に同じ明るさ */
oklch(70% 0.2 240)  /* 明度 70% の青 — 同じく */

「明度 70% の色相違いセット」を作るときに色相間で明度が揃う。デザインシステムのカラーパレット定義が圧倒的に楽になります。

ディスプレイの対応状況

端末色域備考
iPhone 7 以降Display P39 年連続で標準
MacBook 2015 以降Display P3iMac 5K 以降標準
iPad ProDisplay P3iPad Air 第 4 世代以降も対応
Galaxy S 系・最新 PixelDisplay P3Android はメーカー差大
PC モニター(ハイエンド)Display P3 / Adobe RGBEizo・Apple Studio Display 等
PC モニター(一般)sRGB(70-99%)4K でも sRGB 止まりの製品多数

ユーザーの端末が Display P3 をサポートしていない場合、color(display-p3 1 0 0)ブラウザが sRGB の最も近い色にマップして表示します(ガマットマッピング)。色は出るが、Display P3 の旨味は失われる。

color-gamut メディアクエリ

ユーザーのディスプレイ性能で出し分け:

.brand-red {
	color: #ff0000;
}

@media (color-gamut: p3) {
	.brand-red {
		color: color(display-p3 1 0 0);
	}
}

@media (color-gamut: rec2020) {
	.brand-red {
		color: color(rec2020 1 0 0);
	}
}

Display P3 で見ているユーザーには P3 の鮮やかな赤、sRGB ディスプレイには互換の sRGB 赤」という出し分け。

用途別の推奨

ブランドカラー・アクセント色

OKLCH or Display P3 をベース、sRGB をフォールバック:

.btn-primary {
	background: #c84b1f; /* sRGB フォールバック */
	background: color(display-p3 0.78 0.3 0.13); /* P3 で鮮やか */
}

CSS は最後に解釈できる宣言を採用するので、ブラウザが color() を理解できれば P3、理解できなければ sRGB hex を使用。

デザインシステム全体

OKLCH で統一し、CSS variables で抽象化:

:root {
	--color-red-500: oklch(60% 0.2 25);
	--color-red-400: oklch(70% 0.18 25);
	--color-red-600: oklch(50% 0.2 25);
}

明度・彩度を一貫した刻みで定義でき、tailwind のような階段状パレットを手動でも作りやすい

写真と動画

色プロファイルを画像・動画ファイルに埋め込み、CSS で介入しない。ブラウザが ICC プロファイルを見てディスプレイに合わせて表示。

ブラウザサポート(2026 年)

機能ChromeFirefoxSafari
color(display-p3 ...)✓ (111+)✓ (113+)✓ (15+)
color(rec2020 ...)✓ (111+)✓ (113+)✓ (15+)
oklch() / oklab()✓ (111+)✓ (113+)✓ (15.4+)
@media (color-gamut)
color-mix()✓ (111+)✓ (113+)✓ (16.2+)

主要機能はモダンブラウザ全対応。ただし、Internet Explorer 系は完全非対応で切り捨て前提。

実装の落とし穴

1. P3 ディスプレイで sRGB 値を表示すると鮮やかすぎる場合

ブラウザによっては「sRGB 値を P3 ディスプレイに表示するときに、わざと P3 の色域に拡張する」設定があり、見た目が変わることがあります。意図した色を出したいなら明示的に色空間を指定する。

2. スクリーンショットで色が変わる

Display P3 の色を含むページのスクショを sRGB の Slack に貼ると色が変わって見えることがあります。これはツール側の色管理問題で、CSS の問題ではない。

3. プリンタ印刷では sRGB が前提

Web で見える色と紙に印刷した色は色域が違うので、Web で Display P3 の鮮やかな赤を選んでも印刷では再現できない。印刷も意識するならブランドカラーは Adobe RGB か CMYK で定義し、Web では sRGB に落とす。

まとめ

CSS の色域は sRGB の固定から、color()oklch() で広色域・知覚均等な空間が選べる時代に入りました。Display P3 はモダン端末で標準化済みなので、ブランドカラーは Display P3、デザインシステムは OKLCH、フォールバックは sRGB hex という 3 段構えが 2026 年の標準的な書き方です。@media (color-gamut) で出し分けると、対応端末では鮮やかさを引き出しつつ、互換性も保てます。

色コードの相互変換・色域比較は カラー変換ツール で確認できます。