light-dark() を使用して CSS のカラーパターンに依存する色を使用する

システムカラーには、現在使用されている color-scheme 値に反応する機能があります。light-dark() 関数は、同じ機能を作成者に公開します。

CSS のシステムカラー

CSS では、多数の色空間のうち 1 つからさまざまな色を使用できます。たとえば、名前付きの色、16 進数色コード、特定の色空間にリンクされたカラー関数、より一般的な color() 関数を使用できます。

たとえば、名前付きの色 cornflowerblue は、#6495EDhsl(218.54deg 79.19% 66.08%)color(display-p3 0.43 0.58 0.9) などで表すこともできます。

これらのさまざまな名前や形式に加えて、CSS には、CSS カラー モジュール レベル 4 で指定されている、システムカラーとして記述されている色があります。これらのシステムカラーはブラウザによって定義される色であり、キーワードで表されます。

たとえば、システムカラー Canvas は「アプリのコンテンツまたはドキュメントの背景」を表します(<canvas> 要素と混同しないでください)。これは、「アプリケーションのコンテンツまたはドキュメント内のテキスト」を表す CanvasText と適切に連携し、これらと組み合わせて使用することも意図しています。

CSS では次のように使用します。

body {
  color: CanvasText;
  background-color: Canvas;
}

デフォルトでは、CanvasTextblack に近い色になります。Canvaswhite に近い色です。実際の実装はブラウザによって異なります。たとえば、Chrome の CanvasText では #121212 になりますが、Safari では少し明るい #1e1e1e として指定されます。

これらのシステムカラーの隠れた利点は、color-scheme プロパティの計算値に応答できることです。たとえば、使用された color-schemedark の場合、CanvasTextCanvas の値が反転します。

:root {
  color-scheme: dark;
}

body {
  color: CanvasText;
  background-color: Canvas;
}

次のデモでは、:root に設定された color-scheme の値を変更し、ページがどのように反応するかを確認できます。

  • light dark に設定すると、要素がライトモードとダークモードの両方をサポートしていることを示します。どの値を使用するかは、prefers-color-scheme メディア条件の値に応じて選択します。
  • light に設定すると、要素がライト カラーパターンをサポートしていることを示します。
  • dark に設定すると、要素がダーク カラーパターンをサポートしていることを示します。
color-scheme の値を変更できるページ。変更すると、body 要素の宣言が同じままであっても、明るい色から暗い色(またはその逆)にページの色が変化します。

light-dark() のご紹介

対応ブラウザ

  • Chrome: 123。 <ph type="x-smartling-placeholder">
  • Edge: 123。 <ph type="x-smartling-placeholder">
  • Firefox: 120。 <ph type="x-smartling-placeholder">
  • Safari: 17.5。 <ph type="x-smartling-placeholder">

ソース

これまでは、使用された color-scheme 値への対応は、システムカラー用に予約されていたものでした。CSS カラー モジュール レベル 5 で指定されている light-dark() のおかげで、同じ機能も使えるようになりました。

light-dark() は、2 つの引数(どちらも <color> である必要があります)を受け入れる関数です。使用するカラーパターンに応じて、いずれか 1 つが選択されます。

  • 使用されたカラーパターンが light または不明な場合は、最初の値の計算値が返されます。
  • 使用されたカラーパターンが dark の場合は、2 番目の色の計算値が返されます。

light-dark() の結果は <color> です。<color> が受け入れられる場所であれば、どこでも CSS で使用できます。たとえば、color プロパティと background-color プロパティだけでなく、linear-gradient() などの関数でもこれに該当します。

次の例では、使用される背景色は、ダークモードでは #333、ライトモード(または不明なモード)では #ccc です。

:root {
  color-scheme: light dark;
}

body {
  background-color: light-dark(#ccc, #333);
}

light-dark() を正しく動作させるには、color-scheme を指定する必要があります。このプロパティは継承されるため、通常は :root で設定しますが、必要に応じて特定の要素で設定することもできます。

実践的応用

次の例では、いくつかのカスタム プロパティがページ上の色を表しています。ダークモードに対応するため、これらのカスタム プロパティの値は、prefers-color-scheme メディア条件の別の値で上書きされます。

:root {
  --primary-color: #333;
  --primary-background: #e4e4e4;
  --highlight-color: hotpink;
}

@media (prefers-color-scheme: dark) {
  :root {
    --primary-color: #fafafa;
    --primary-background: #121212;
    --highlight-color: lime;
  }
}
prefers-color-scheme を介してライトモードまたはダークモードに応答するページ。
メディアクエリを使用して CSS で色の値を変更します。

light-dark() のおかげで、このコードを簡略化できます。:rootcolor-schemelight dark に設定されているため、OS をライトモードからダークモードに、またはその逆に、これらの色の値は自動的に変更されます。

:root {
  color-scheme: light dark;
  --primary-color: light-dark(#333, #fafafa);
  --primary-background: light-dark(#e4e4e4, #121212);
  --highlight-color: light-dark(hotpink, lime);
}
prefers-color-scheme を使用してライトモードまたはダークモードに応答するページ。
色の値は light-dark() を使用して変更されます。

さらに、color-schemedark または light に設定することで、DOM の特定のサブツリーでライトモードまたはダークモードのみを使用するように強制することもできます。次の例では、これは :root に適用されます。

prefers-color-scheme を使用してライトモードまたはダークモードに応答するページ。
色の値は light-dark() を使用して変更されます。
いずれかのオプションを使用して、ライトモードまたはダークモードを強制的に適用できます。これは、color-scheme 値を操作することで実現されます。