Webで使える色

CSSで使える色の指定方法を総合的に解説する。CSS Color Module Level 4準拠。

目次

  1. 指定名カラーキーワード
  2. 16進数表記(HEX)
  3. rgb() / rgba()
  4. hsl() / hsla()
  5. hwb()
  6. モダンカラー関数(lab, lch, oklab, oklch)
  7. color()関数
  8. color-mix()
  9. 相対カラー構文(Relative Color Syntax)
  10. 特殊なキーワード
  11. 表記方法の比較
  12. 実践的な使い方

1. 指定名カラーキーワード

CSS Color Level 4では、148個の指定名カラーが定義されている。nameとcolorの対応関係はW3C仕様で定められている。

基本カラーキーワード(8個):

black
#000000
silver
#c0c0c0
gray
#808080
white
#ffffff
maroon
#800000
red
#ff0000
purple
#800080
green
#008000
olive
#808000
teal
#008080
navy
#000080
blue
#0000ff

拡張カラーキーワード(CSS Color Level 3で定義):

tomato
#ff6347
dodgerblue
#1e90ff
goldenrod
#daa520
orchid
#da70d6
crimson
#dc143c
slateblue
#6a5acd
mediumseagreen
#3cb371
rebeccapurple
#663399

CSS Color Level 4では、graygreyが同義(spelling variant)。grey表記のカラーも全て用意されている。

注意:仕様上は148個だが、一部のカラーは perceptually inconsistent(例:darkgraygrayより明るい)。現実的には sRGB色空間上の不規則な分布である。

2. 16進数表記(HEX)

Red・Green・Blueの各チャンネルを2桁の16進数で指定する。Web開発で最も一般的な表記。

表記形式
#RGB3桁(各1ビット)#f0f → magenta
#RRGGBB6桁(各8ビット)#ff00ff → magenta
#RRGGBBAA8桁(アルファ付き)#ff00ff80 → 半透明magenta
#RGBA4桁(アルファ付き)#f0f8 → 半透明magenta

3桁/4桁表記は、各文字を2回繰り返した値と等価。つまり#f0f#ff00ffと同値。

/* 不透明な青 */
color: #0000ff;
color: #00f;       /* 同値 */

/* 50%透過の赤 */
color: #ff000080;
color: #f008;       /* 同値 */

3. rgb() / rgba()

Red・Green・Blueの各チャンネルを0〜255の数値で指定する。アルファチャンネルはスラッシュ/で区切る。

/* 色空间指定なし(sRGB、推奨) */
color: rgb(255 128 0);             /* オレンジ */
color: rgb(255 128 0 / 50%);      /* 50%透過 */

/* パーセンテージ表記 */
color: rgb(100% 50% 0%);          /* オレンジ */

/* カンマ区切り(レガシー、非推奨) */
color: rgb(255, 128, 0);          /* まだ有効だが非推奨 */
推奨:カンマ区切りの旧構文は非推奨。スペース区切りの新構文を使うこと。新構文はnoneキーワード(欠損チャンネル)にも対応している。

4. hsl() / hsla()

Hue(色相)・Saturation(彩度)・Lightness(明度)で色を指定する。直感的に色を調整しやすい。

color: hsl(210 80% 50%);           /* 青 */
color: hsl(210 80% 50% / 0.5);   /* 50%透過の青 */

/* 角度指定 */
color: hsl(210deg 80% 50%);

/* パーセンテージで彩度・明度 */
color: hsl(210 80% 50%);

Hueは0〜360度の回転環。赤(0)→黄(60)→緑(120)→シアン(180)→青(240)→マゼンタ(300)→赤(360)。

HSLの限界:HSLは知覚的に均一でない。同じLightness値でも、青は緑より暗く見える。パレット作成にはoklch()の方が適している。

5. hwb()

Hue(色相)・Whiteness(白の量)・Blackness(黒の量)で色を指定する。HSLより直感的だが、実際にはほとんど使われていない。

color: hwb(210 10% 20%);          /* 青に白と黒を混ぜた色 */
color: hwb(210 10% 20% / 0.5);  /* 透過 */

6. モダンカラー関数

CSS Color Level 4で導入された、知覚的に均一な色空間ベースの関数。HSLの問題を解決し、より正確な色操作が可能。

oklch()(推奨)

Oklab色空間の円柱座標版。新規プロジェクトでのデフォルトとして推奨されている。明度・彩度・色相の各チャンネルが知覚的に均一に振れる。

color: oklch(0.7 0.15 250);          /* 青系 */
color: oklch(0.7 0.15 250 / 0.8);  /* 透過 */
パラメータ範囲説明
L(明度)0%〜100%0%=黒、100%=白
C(彩度)0〜0.40=グレー、値が大きいほど鮮やか
H(色相)0〜360deg色相環上の角度

oklab()

Oklab色空間の直交座標版。oklchと同一の色を表現するが、軸がa(赤緑軸)とb(青黄軸)。

color: oklab(0.7 -0.05 -0.13);

lab() / lch()

CIELAB色空間ベース。印刷・画像処理の世界で長く使われてきた。oklab/oklchがより均一だが、Photoshop等から値をコピーする場合に有用。

color: lab(50% 20 -20);           /* CIELAB */
color: lch(50% 60 300deg);        /* CIELABの円柱座標 */

各関数の使い分け

関数座標系色空間用途
oklch()円柱Oklab新規プロジェクト(推奨)
oklab()直交Oklabプログラム的な色操作
lch()円柱CIELABレガシーデザインツールとの連携
lab()直交CIELAB画像処理・カラーマネジメント
hsl(240 100% 50%)
oklch(0.45 0.31 264)
#0000ff
rgb(0 0 255)

7. color()関数

任意の色空間で色を指定する汎用関数。広色域ディスプレイ(Display P3など)の色を直接指定できる。

/* sRGB(デフォルトと同等) */
color: color(srgb 1 0.5 0);

/* Display P3(広色域) */
color: color(display-p3 1 0.5 0);

/* 透過 */
color: color(display-p3 1 0.5 0 / 0.8);

対応する色空間:

互換性:ブラウザが指定した色空間に対応していない場合、最も近いsRGB色にマッピングされる。段階的な拡張(progressive enhancement)として使うのが安全。

8. color-mix()

2つの色を指定した色空間で混合する。Sass等のビルド時処理に代わり、ブラウザ上でパレットを動的に生成できる。

/* 50%ずつ混合 */
color-mix(in oklch, blue, red);

/* 比率を指定 */
color-mix(in oklch, blue 30%, red 70%);

/* 異なる色空間でも混合可能 */
color-mix(in hsl, hsl(0 50% 50%), #7acedd);

混合に使える色空間:srgboklchoklabhsllchlabhwbxyzなど。

色空間の選び方:
・彩度を保ちたい → oklch
・知覚的に均一なグラデーション → oklab
・光の混合を再現 → srgb-linear または xyz

9. 相対カラー構文(Relative Color Syntax)

既存の色から派生色を算出する。fromキーワードで基準色を指定し、各チャンネルを加工する。

/* 既存の色をベースに、明度だけ変更 */
--base: oklch(0.6 0.2 250);

.lighter { color: oklch(from var(--base) calc(l + 0.2) c h); }
.darker  { color: oklch(from var(--base) calc(l - 0.2) c h); }
.desaturated { color: oklch(from var(--base) l calc(c * 0.5) h); }

from以降の3つの引数は、基準色の各チャンネルに対応する。変更しないチャンネルは変数名そのままを書く。

10. 特殊なキーワード

transparent

完全に透明な色。rgb(0 0 0 / 0%)のショートカット。CSS Color Level 3で正式な色値になった。

background: transparent;

currentColor

要素のcolorプロパティの現在値を参照する。color以外のプロパティ(border-colorbackgroundなど)で使える。

a {
  color: blue;
  border: 1px solid currentColor; /* ボーダーも青になる */
}

system colors

ユーザーのOS・ブラウザ設定に連動する色。forced-colorsモード(ハイコントラストモード)での利用を想定。

@media (forced-colors: active) {
  .card {
    border: 1px solid ButtonText;
    forced-color-adjust: none;
  }
}

11. 表記方法の比較

表記記法透過対応色空間ブラウザサポート
redキーワード不可sRGB全ブラウザ
#ff000016進数可(#RRGGBBAA)sRGB全ブラウザ
rgb(255 0 0)関数sRGB全ブラウザ
hsl(0 100% 50%)関数sRGB全ブラウザ
hwb(0 0% 0%)関数sRGB全ブラウザ
oklch(0.63 0.26 29)関数OklabChrome 111+, Safari 15.4+
oklab(0.63 0.22 -0.1)関数OklabChrome 111+, Safari 15.4+
lab(50% 50 -20)関数CIELABChrome 111+, Safari 15.4+
lch(50% 60 300)関数CIELABChrome 111+, Safari 15.4+
color(display-p3 1 0.5 0)関数各色空間Chrome 111+, Safari 15+
color-mix()関数指定可能Chrome 111+, Safari 16.2+

12. 実践的な使い方

段階的な拡張(Progressive Enhancement)

モダンカラー関数は、古いブラウザで無視される。レガシーフォールバックを先に書く。

.button {
  background: #4f46e5;                         /* フォールバック */
  background: oklch(0.63 0.19 260deg);         /* モダンオーバーライド */
}

CSSカスタムプロパティでパレットを管理

:root {
  --primary: oklch(0.6 0.2 260);
  --primary-light: oklch(from var(--primary) calc(l + 0.15) c h);
  --primary-dark: oklch(from var(--primary) calc(l - 0.15) c h);
  --primary-bg: oklch(from var(--primary) 0.95 0.02 h);
}

ダークモード対応

:root {
  --text: oklch(0.2 0.01 260);
  --bg: oklch(0.98 0.005 260);
}

@media (prefers-color-scheme: dark) {
  :root {
    --text: oklch(0.9 0.01 260);
    --bg: oklch(0.15 0.01 260);
  }
}

カラーコントラストの確認

WCAG 2.1では、通常テキストは4.5:1以上、大きなテキストは3:1以上のコントラスト比が推奨されている。oklchのL値は知覚的明度に近いので、コントラストの概算に使える。


参考:CSS Color Module Level 4(W3C Candidate Recommendation)