color-mix() 非対応ブラウザ向けフォールバック戦略

プログレッシブエンハンスメントで color-mix() を安全に出荷:先に静的フォールバック色、その後にモダン宣言。@supports 検出も解説。

Advanced

詳細な説明

color-mix() を本番に出荷する

color-mix() のブラウザサポートは 2025 年時点で優秀 (グローバル トラフィックの 95%+) ですが、古い Safari や組み込み WebView ユーザー の一部はこれを利用できません。安全な 2 つのパターン:

1. 静的フォールバックを先に

.button {
  background: #5a3899;                                    /* fallback */
  background: color-mix(in oklch, red, blue);             /* modern  */
}

ブラウザは宣言を順番に解析します。古いエンジンは静的 hex を受け入れ、 下にある未知の関数を無視します。モダンエンジンは両方を受け入れ、 カスケードで後者を採用します。JS 不要、@supports ブロックも不要です。

2. レイアウトを分岐するための @supports

フォールバックが構造的に異なる場合 (例:color-mix 非対応時は要素を 完全に隠したい):

@supports (background: color-mix(in oklch, red, blue)) {
  .button { background: color-mix(in oklch, var(--brand), black 12%); }
}

@supports not (background: color-mix(in oklch, red, blue)) {
  .button { background: var(--brand-700); }
}

3. カスタムプロパティ内のフォールバック

カスタムプロパティでパレットを構築する場合、フォールバックを プロパティの初期値として設定します:

@property --brand-hover {
  syntax: "<color>";
  inherits: true;
  initial-value: #1d4ed8;     /* 手動調整したフォールバック */
}

:root {
  --brand-hover: color-mix(in oklch, var(--brand), black 18%);
}

color-mix サポート無しのブラウザは登録された initial-value に フォールバックします。

必要ならランタイム検出

CSS.supports("color", "color-mix(in oklch, red, blue)") が真偽値を 返します。控えめに使用してください — 宣言的フォールバックは、機能検出 された JS 分岐よりほぼ常にシンプルです。

ユースケース

古いブラウザサポートが必要な本番サイトのプログレッシブエンハンスメント。レガシー WebView ユーザーのロングテールを壊さずに今 color-mix() を採用できます。

試してみる — CSS color-mix() Generator

フルツールを開く