Tailwind CSSのカラー:v4のOKLCHパレット、カスタムカラーとシェード
Tailwind CSS v4には、50から950まで11段階のシェードを持つカラースケールが26種類あり、合計286色がOKLCHで定義され、--color-blue-500 のようなCSS変数として使えます。独自の色は @theme { --color-brand-500: oklch(...) } で追加します。同じ段階の番号でも明度は同じではありません。白背景で4.5:1を満たす最も明るい青はblue-600ですが、黄色は700が必要です。
1分で読めます
Tailwindのカラーパレットの構成
Tailwind v4.3のデフォルトパレットには、名前付きのスケールが26種類あります。有彩色は17種類で、red、orange、amber、yellow、lime、green、emerald、teal、cyan、sky、blue、indigo、violet、purple、fuchsia、pink、roseです。ニュートラルは9種類で、v3からあるslate、gray、zinc、neutral、stoneに、v4で追加されたmauve、olive、mist、taupeが加わります。さらにblackとwhiteがあります。
どのスケールも同じ11段階で構成されています。50、100、200から900まで、そして950です。50はほぼ白、950はほぼ黒です。クラス名はユーティリティに色と段階を付けた形で、bg-blue-500、text-rose-700、border-zinc-200のようになります。
段階の番号はスケール内の位置であって、明度の値ではありません。500の段階でも、OKLCHの明度はgrayの55.1%からyellowの79.5%まで幅があります。yellow-500とblue-500を文字色にしたときの扱いがまったく違うのはこのためです。
| クラス | OKLCHの値 | HEXフォールバック | 白背景でのコントラスト |
|---|---|---|---|
| yellow-500 | oklch(79.5% 0.184 86.047) | #efb100 | 1.92:1 |
| amber-500 | oklch(76.9% 0.188 70.08) | #fd9a00 | 2.14:1 |
| green-500 | oklch(72.3% 0.219 149.579) | #00c950 | 2.22:1 |
| cyan-500 | oklch(71.5% 0.143 215.221) | #00b8db | 2.37:1 |
| orange-500 | oklch(70.5% 0.213 47.604) | #ff6900 | 2.89:1 |
| red-500 | oklch(63.7% 0.237 25.331) | #fb2c36 | 3.81:1 |
| blue-500 | oklch(62.3% 0.214 259.815) | #2b7fff | 3.76:1 |
| indigo-500 | oklch(58.5% 0.233 277.117) | #615fff | 4.58:1 |
| gray-500 | oklch(55.1% 0.027 264.364) | #6a7282 | 4.84:1 |
Tailwindのblue:全シェードのOKLCH、HEX、コントラスト
Tailwind v4が定義するblueのスケール全体です。HEXの列は、明度と色相を保ったままクロマを下げて求めた最も近いsRGBの色です。コントラスト比はそのHEXで測ったWCAG 2の値です。
白背景で本文テキストの4.5:1を満たす最初の段階はblue-600です。blue-500は黒背景では5.58:1で合格しますが、白背景では3.76:1で不合格です。白と黒の両方で4.5:1を満たすblueの段階はないため、ライトテーマとダークテーマでは別の段階を使う必要があります。
| クラス | OKLCHの値 | HEXフォールバック | 白背景 | 黒背景 |
|---|---|---|---|---|
| blue-50 | oklch(97% 0.014 254.604) | #eff6ff | 1.09:1 | 19.30:1 |
| blue-100 | oklch(93.2% 0.032 255.585) | #dbeafe | 1.22:1 | 17.21:1 |
| blue-200 | oklch(88.2% 0.059 254.128) | #bedbff | 1.42:1 | 14.77:1 |
| blue-300 | oklch(80.9% 0.105 251.813) | #8ec5ff | 1.81:1 | 11.58:1 |
| blue-400 | oklch(70.7% 0.165 254.624) | #51a2ff | 2.64:1 | 7.96:1 |
| blue-500 | oklch(62.3% 0.214 259.815) | #2b7fff | 3.76:1 | 5.58:1 |
| blue-600 | oklch(54.6% 0.245 262.881) | #155dfc | 5.25:1 | 4.00:1 |
| blue-700 | oklch(48.8% 0.243 264.376) | #1447e6 | 6.83:1 | 3.07:1 |
| blue-800 | oklch(42.4% 0.199 265.638) | #193cb8 | 8.82:1 | 2.38:1 |
| blue-900 | oklch(37.9% 0.146 265.522) | #1c398e | 10.37:1 | 2.03:1 |
| blue-950 | oklch(28.2% 0.091 267.935) | #162456 | 14.78:1 | 1.42:1 |
白背景でWCAG AAを満たすTailwindのシェード
合格する最も明るい段階は色相によって変わります。orange、amber、yellow、limeと、緑系、ティール系、シアン系、スカイ系は500ではまだ明るく、本文テキストには700が必要です。red、blue、violet、purple、fuchsia、pink、roseは600で、indigoは500で合格します。例外はyellowで、yellow-600でさえ2.93:1にとどまり、大きな文字の基準も満たしません。
結果を予測するには、段階の番号より明度のほうが確実です。286色すべてで、OKLCHの明度が58%未満のシェードは白背景で4.5:1を満たし、59.2%を超えるシェードはすべて満たしません。クラスの値のLを見れば、テストする前に答えがわかります。
| 色 | 4.5:1を満たす最も明るい段階 | Hex | コントラスト比 | 3:1を満たす最も明るい段階 |
|---|---|---|---|---|
| red | 600 | #e7000b | 4.77:1 | 500 |
| orange | 700 | #ca3500 | 5.22:1 | 600 |
| amber | 700 | #bb4d00 | 5.03:1 | 600 |
| yellow | 700 | #a65f00 | 4.93:1 | 700 |
| lime | 700 | #497d00 | 4.98:1 | 600 |
| green | 700 | #008236 | 4.95:1 | 600 |
| emerald | 700 | #007a55 | 5.36:1 | 600 |
| teal | 700 | #00786f | 5.36:1 | 600 |
| cyan | 700 | #007595 | 5.28:1 | 600 |
| sky | 700 | #0069a8 | 5.86:1 | 600 |
| blue | 600 | #155dfc | 5.25:1 | 500 |
| indigo | 500 | #615fff | 4.58:1 | 400 |
| violet | 600 | #7f22fe | 5.89:1 | 500 |
| purple | 600 | #9810fa | 5.54:1 | 500 |
| fuchsia | 600 | #c800de | 4.66:1 | 500 |
| pink | 600 | #e60076 | 4.54:1 | 500 |
| rose | 600 | #ec003f | 4.53:1 | 500 |
| gray | 500 | #6a7282 | 4.84:1 | 500 |
| olive | 600 | #5b5b4b | 6.90:1 | 500 |
olive以外のニュートラルはすべて500で合格します。olive-500は明度58%で黄みがかった色相を持ち、4.25:1にしか届きません。gray-500とolive-500の文字色は置き換えがきかないということです。
Tailwind v3とv4のカラーの違い
v3では、色はtailwind.config.jsのtheme.extend.colorsにHEX値で定義していました。v4では設定がCSSに移り、色は@theme内のテーマ変数としてOKLCHで書かれ、CSS変数として公開されます。そのため、素のCSSやインラインスタイルでもvar(--color-blue-500)が使えます。
パレット自体は描き直されたのではなく、調整されただけです。OKLCHに変換すると、v3のblue-500(#3b82f6)はv4のblue-500と明度も色相もまったく同じです。上がったのはクロマだけで、0.188から0.214になりました。blueのほかの段階も同じ傾向ですが、blue-400だけは明度も0.7ポイント暗くなっています。コントラストはほとんど変わらず、色はより鮮やかに見えます。
増えたクロマはsRGBの外にまで及びます。v4の286色のうち94色はsRGBの外、Display P3の内側にあり、すべて有彩色です。orangeは11段階中9段階、blueは4段階(200〜500)が外側です。P3対応の画面では本来の色が表示され、sRGBの画面ではブラウザが近い色で表示します。v4の対象はSafari 16.4、Chrome 111、Firefox 128以降で、いずれもoklch()に対応しています。
| クラス | v3のHEX | v4のHEXフォールバック | クロマ v3→v4 | 白背景 v3→v4 |
|---|---|---|---|---|
| blue-400 | #60a5fa | #51a2ff | 0.143 → 0.165 | 2.54 → 2.64 |
| blue-500 | #3b82f6 | #2b7fff | 0.188 → 0.214 | 3.68 → 3.76 |
| blue-600 | #2563eb | #155dfc | 0.215 → 0.245 | 5.17 → 5.25 |
| blue-700 | #1d4ed8 | #1447e6 | 0.217 → 0.243 | 6.70 → 6.83 |
CSS
@theme {
--color-blue-500: oklch(62.3% 0.214 259.815);
}
.card {
border-color: var(--color-blue-500);
}Tailwind v4でカスタムカラーを追加する方法
@theme内で、--color- の名前空間に変数を宣言します。--color- より後ろの部分がクラス名になるので、--color-brand を定義すればbg-brand、text-brand、border-brand、ring-brandなどすべてのカラーユーティリティと、CSSのvar(--color-brand)が使えるようになります。値にはHEX、rgb()、hsl()、oklch()のどれでも使えます。
デフォルトパレットを拡張するのではなく置き換えたい場合は、まず --color-*: initial で名前空間をリセットしてから、必要な色だけを定義します。ユーティリティは実際に使ったクラスの分しか生成されないので、ほとんどのプロジェクトはデフォルトを残したままにしています。
CSS
@import 'tailwindcss';
@theme {
--color-brand: #e4572e;
--color-ink: oklch(21% 0.02 260);
}アクセントカラーが1色だけなら --color-brand ひとつで十分です。hover時の色、淡い背景色、ダークモードが必要になったら、番号付きの段階を持つスケール全体を定義しましょう。
50〜950のカスタムスケールを作る方法
下のスケールは #e4572e から生成したものです。この色の明度63.7%は500の段階に一致するので、ブランドカラーはそのまま500に収まります。ほかの段階はTailwindの明度カーブに沿い、色相は同じまま、クロマは500と600で最大になって両端に向かって小さくなります。すべてsRGBの範囲に収まっているため、HEX値は正確です。
Tailwind自身の暖色系と同じく、このスケールも白背景の本文テキストには600が必要です。brand-500は3.68:1で、大きな文字とアイコンにしか使えません。
| クラス | Hex | 白背景 |
|---|---|---|
| brand-50 | #fcf3f0 | 1.09:1 |
| brand-100 | #fae4de | 1.22:1 |
| brand-200 | #f8cec3 | 1.44:1 |
| brand-300 | #f3ae9a | 1.85:1 |
| brand-400 | #ed7d5e | 2.73:1 |
| brand-500 | #e4572e | 3.68:1 |
| brand-600 | #ce3a00 | 4.97:1 |
| brand-700 | #ae3000 | 6.52:1 |
| brand-800 | #912600 | 8.46:1 |
| brand-900 | #77260e | 10.15:1 |
| brand-950 | #441508 | 15.48:1 |
CSS
@theme {
--color-brand-50: oklch(97% 0.01103 36.478);
--color-brand-100: oklch(93.477% 0.02574 36.478);
--color-brand-200: oklch(88.485% 0.04964 36.478);
--color-brand-300: oklch(81.145% 0.08641 36.478);
--color-brand-400: oklch(71.064% 0.14524 36.478);
--color-brand-500: oklch(63.723% 0.18385 36.478);
--color-brand-600: oklch(56.583% 0.19167 36.478);
--color-brand-700: oklch(49.952% 0.16921 36.478);
--color-brand-800: oklch(43.729% 0.14814 36.478);
--color-brand-900: oklch(38.935% 0.11766 36.478);
--color-brand-950: oklch(27% 0.07538 36.478);
}貼り付けるときは精度を落とさないでください。明度を0.1%単位、クロマを小数点以下3桁に丸めると、brand-600がわずかにsRGBの外に出ます。実害はありませんが、HEXとは正確に一致しなくなります。
bg-blue-500/50のような不透明度モディファイアの仕組み
色の後ろにスラッシュを付けるとアルファ値を指定できます。bg-blue-500/50は、不透明度50%のblue-500です。v3ではこれがrgb(59 130 246 / 0.5)にコンパイルされていたため、Tailwindがチャンネルに分解できる色でしか使えませんでした。CSS変数で定義したカスタムカラーには、rgb(var(--brand) / <alpha-value>)という特別な書式が必要でした。
v4ではモディファイアがOklabのcolor-mix()にコンパイルされ、色をtransparentと混ぜます。そのため、テーマ変数、bg-[#e4572e]/50のような任意の値、独自のCSS変数など、どんな色でも使えます。
不透明度はコントラストに影響します。白の上では、blue-500/50は #95bfff、blue-500/10は #eaf2ff として表示されます。blue-600の文字は5.25:1ですが、text-blue-600/60にすると2.62:1まで下がり、大きな文字の基準すら満たしません。
CSS
.bg-blue-500\/50 {
background-color: color-mix(in oklab, var(--color-blue-500) 50%, transparent);
}任意のHEXに最も近いTailwindのクラスを探す方法
HEXを286色すべてのシェードと、Oklabでの知覚的な距離(ΔEOK)で比較します。約0.02未満なら並べても差がほとんどわからないので、Tailwindのクラスで置き換えられます。約0.04を超える場合は、カスタムカラーを追加しましょう。
表は実際の一致例です。v3の古いHEX値はv4の同じクラスに対応し、#ff5733 のような典型的なブランドオレンジはorange-600とred-400の中間に位置します。PickShadeのTailwindページでは、どんな色でもこの検索を行い、最も近い3つのクラスを表示します。
| あなたの色 | 最も近いv4のクラス | クラスのフォールバック | ΔEOK |
|---|---|---|---|
| #635bff | indigo-500 | #615fff | 0.008 |
| #1da1f2 | sky-500 | #00a6f4 | 0.020 |
| #10b981 | emerald-500 | #00bc7d | 0.021 |
| #3b82f6 | blue-500 | #2b7fff | 0.026 |
| #e4572e | orange-600 | #f54900 | 0.042 |
| #ff5733 | orange-600 | #f54900 | 0.046 |
よくある質問
Tailwind CSSには何色ありますか?
Tailwind CSS v4.3には、50から950まで11段階のシェードを持つカラースケールが26種類あり、合計286色にblackとwhiteが加わります。17種類が有彩色、9種類がニュートラル(slate、gray、zinc、neutral、stone、mauve、olive、mist、taupe)です。
Tailwindのblue-500のカラーコードは?
Tailwind v4のblue-500はoklch(62.3% 0.214 259.815)で、わずかにsRGBの外にあります。最も近いHEXは #2b7fff です。Tailwind v3のblue-500は #3b82f6 で、明度と色相は同じですがクロマが低めでした。
Tailwind v4でカスタムカラーを追加するには?
CSSの@theme内で、--color- の名前空間に変数を追加します。たとえば @theme { --color-brand-500: oklch(63.7% 0.184 36.48); } です。するとTailwindがbg-brand-500、text-brand-500などすべてのカラーユーティリティを生成し、値はvar(--color-brand-500)としても使えます。
白背景でアクセシブルなTailwindの色は?
白背景で本文テキストの4.5:1を満たすには、red、blue、violet、purple、fuchsia、pink、roseは600、orange、amber、yellow、lime、green、emerald、teal、cyan、skyは700、indigoとほとんどのニュートラルは500を使います。ニュートラルの中ではoliveが例外で、600が必要です。
Tailwind v4の色がv3より鮮やかに見えるのはなぜですか?
Tailwind v4は色をOKLCHで定義し、クロマを引き上げたからです。たとえばblueのスケールでは、明度と色相はv3とほぼ同じまま、中間の段階のクロマが0.02〜0.03上がりました。286色のうち94色がsRGBの外にあり、より広いDisplay P3の色域を使うため、最近のiPhoneやMacなどP3対応の画面ではより鮮やかに見えます。
Tailwind v4の@themeでHEXカラーは使えますか?
はい。テーマ変数にはHEX、rgb()、hsl()、oklch()を含むあらゆるCSSカラーを指定できます。v4は不透明度モディファイアをcolor-mix()で生成するため、どの形式でも不透明度モディファイアが使えます。