強制カラーモードでデザインを崩さない!CSS forced-color-adjustの使いこなし術


強制カラーモードとは?

強制カラーモードは、視覚障害のあるユーザーや、色覚異常のあるユーザーがウェブページをより見やすくするために、オペレーティングシステムまたはブラウザによって適用される配色設定です。このモードでは、ページ全体のカラーパレットが変更され、コントラストが強調されたり、特定の色が置き換えられたりします。

forced-color-adjust の役割

forced-color-adjust プロパティを使用すると、開発者は特定の要素に対して強制カラーモードの影響を無効化することができます。これは、以下の場合に役立ちます。

  • 写真や画像を含む要素
  • ユーザーが色を選択できるインタラクティブ要素 (例: ボタン、色見本)
  • 特定の色の組み合わせが重要であるデザイン要素 (例: ロゴ、ブランドカラー)

forced-color-adjust には、以下の2つの値があります。

  • none: この値を指定すると、要素は強制カラーモードの影響を受けません。
  • default: これが既定値であり、要素は強制カラーモードの影響を受けます。
.button {
  forced-color-adjust: none;
  background-color: #007bff; /* 青色のボタン */
}

.photo {
  forced-color-adjust: none;
  filter: none; /* 強制カラーモードによるフィルターを無効化 */
}

この例では、.button クラスと .photo クラスの要素は、強制カラーモードの影響を受けません。

  • forced-color-adjust と一緒に @media クエリを使用して、強制カラーモードが有効になっている場合にのみ適用されるスタイルを定義することもできます。
  • forced-color-adjust を使用する場合は、ユーザー設定を尊重することが重要です。強制カラーモードを無効化するのは、ユーザーが意図的に設定した配色設定を上書きすることになるため、慎重に行う必要があります。
  • forced-color-adjust は、比較的新しいプロパティであり、すべてのブラウザで完全にはサポートされていない場合があります。


例 1:ボタンのスタイルを強制カラーモードの影響から保護する

この例では、ボタンの背景色を常に青色 (#007bff) に保ち、強制カラーモードによる変更を防ぎます。

.button {
  forced-color-adjust: none;
  background-color: #007bff;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}

例 2:画像のフィルターを無効にする

この例では、画像のフィルターを無効にして、強制カラーモードによる色の変更を防ぎます。

.photo {
  forced-color-adjust: none;
  filter: none;
  width: 200px;
  height: 200px;
  object-fit: cover;
}

例 3:強制カラーモードが有効な場合にのみスタイルを適用する

この例では、@media クエリを使用して、強制カラーモードが有効な場合にのみ .highlight クラスのスタイルを適用します。

@media (forced-color: active) {
  .highlight {
    background-color: #ffff00; /* 黄色 */
  }
}

例 4:システムカラーを使用する

この例では、system キーワードを使用して、ボタンの背景色にシステムカラーを指定します。これにより、ユーザーのオペレーティングシステム設定に基づいて色が自動的に選択されます。

.button {
  forced-color-adjust: auto;
  background-color: system;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}
  • ユーザー設定を尊重することが重要です。強制カラーモードを無効化するのは、ユーザーが意図的に設定した配色設定を上書きすることになるため、慎重に行う必要があります。
  • forced-color-adjust は比較的新しいプロパティであり、すべてのブラウザで完全にはサポートされていない場合があります。
  • 上記の例はあくまで一例であり、さまざまな要件に合わせて調整する必要があります。


代替方法としては、以下の3つの方法が考えられます。

  1. メディアクエリを使用する

最も一般的な代替方法は、@media クエリを使用して、強制カラーモードが有効な場合にのみスタイルを適用することです。

@media (forced-color: active) {
  /* 強制カラーモードが有効な場合のスタイル */
}

この方法は、特定の要素のみを対象とすることができ、比較的柔軟性があります。

  1. JavaScriptを使用する

JavaScriptを使用して、ユーザーエージェントが強制カラーモードをサポートしているかどうかを検出し、それに応じてスタイルを動的に変更することもできます。

const supportsForcedColor = window.matchMedia('(forced-color: active)').matches;

if (supportsForcedColor) {
  // 強制カラーモードが有効な場合のスタイルを適用
} else {
  // 強制カラーモードが有効でない場合のスタイルを適用
}

この方法は、より複雑ですが、よりきめ細かな制御が可能になります。

  1. CSS変数を使用する

CSS変数を使用して、強制カラーモードで使用する配色を定義し、それをスタイルに適用することもできます。

:root {
  --color-text: #000;
  --color-background: #fff;
}

@media (forced-color: active) {
  :root {
    --color-text: #fff;
    --color-background: #000;
  }
}

.button {
  color: var(--color-text);
  background-color: var(--color-background);
}

この方法は、コードをより簡潔にするのに役立ちますが、すべてのブラウザでCSS変数がサポートされているわけではありません。

方法利点欠点
メディアクエリ比較的シンプル特定の要素のみを対象とすることができる
JavaScriptよりきめ細かな制御が可能より複雑
CSS変数コードがより簡潔になるすべてのブラウザでCSS変数がサポートされているわけではない
  • 代替方法を使用する場合は、フォールバックスタイルを必ず提供する必要があります。
  • ユーザー設定を尊重することが重要です。強制カラーモードを無効化するのは、ユーザーが意図的に設定した配色設定を上書きすることになるため、慎重に行う必要があります。