トピックを検索
ハイコントラストモードで消えるフォーカス・アイコン・選択状態
選択中の項目を背景の塗りだけで示し、フォーカスの枠を影で描き、アイコンの色を固定しているため、コントラストテーマで3つとも消えます。
input:checked + label { background: #1a1a1a; } 問題
コントラストテーマを使う人が、どのサイズを選んだか、フォーカスがどこにあるか、保存ボタンがあることが分かりません。
衣料品店の商品ページに、S、M、L、XLのサイズの選択肢と、セーターをお気に入りに保存するハートのボタンがあります。店舗本来の色では問題ありません。選んだサイズは白い文字の暗い四角になり、フォーカスは青い枠で、ハートは白の上の暗いアイコンです。
ここで、ロービジョンの利用者の多くがするように、Windowsで暗いコントラストテーマを有効にします。どの選択肢も黒地に白い枠線になり、選んだサイズがほかと見分けられません。Tabキーで選択肢やハートに移動しても、枠は表示されません。ハート自体も消え、ボタンがあるはずの場所は空白になります。
コントラストテーマ(CSSでは強制配色、forced colors)は、ページの色を利用者自身の配色に置き換えます。ブラウザーはプロパティごとに置き換え、この店の3つの指定はそこで失われます。
- 選んだサイズは
background-colorだけで示されています。テーマはすべての背景を同じ色にするため、選択肢の唯一の違いがなくなります。 - フォーカスの枠は
outline: noneのうえでbox-shadowを使っています。強制配色では影はnoneになり、色を付け替えるoutlineも残っていません。 - ハートのパスは
fill="#1a1a1a"です。インラインSVGは、文字色から来る色以外は元の色を保つため、黒に近いアイコンが黒い背景の上に残ります。
WCAG 1.4.11はページ本来の色で測定し、その色ではこのページは基準を満たします。しかしこの基準は、操作要素とその状態を識別できるようにするためのものです。コントラストテーマを使う人にとっては、こちらが実際に見るページです。枠線がなく塗りだけで描いた入力欄も、同じように消えます。
主な原因は、Windowsの「設定」、「アクセシビリティ」、「コントラスト テーマ」です。Windows上のChromium系ブラウザーとFirefoxはこれに従い、Firefoxはどのシステムでもページの色を上書きできます。ロービジョンではなく、明るい画面がつらいために暗いテーマを使う人もいて、同じように影響を受けます。
10グループ中2グループに影響
自動チェックやコントラストの測定ツールは、スタイルシートが指定する色を測ります。コントラストテーマを有効にするものはないため、すべての自動チェックに合格したページでも、テーマではフォーカスの枠が消えることがあります。生成されたコンポーネントでは特に起きやすく、Tailwindの ring-* も、多くのデザインシステムのフォーカス表示も影で描かれ、outline-none と組み合わされがちです。塗りで示す選択状態は、どのデザイン案でも完成して見えます。
試してみる
コントラストテーマをオンにし、サイズを選んでから、Tabを押してください。
スイッチは、Windowsの暗いコントラストテーマが描くようにページを表示します。選んだサイズ、フォーカスの位置、保存ボタンが分かりますか?
問題あり 修正できますか?
メリノのクルーネックセーター
オートミール · 89.00
修正方法
状態、フォーカス、アイコンを、コントラストテーマが残すもので描くか、システムカラーで描き直します。
- 1選択状態には、塗り以外の手がかり(枠線、チェックマーク、システムカラー)を付ける。
- 2フォーカスには、影だけでなく、透明でもよいのでoutlineを付ける。
- 3操作要素のアイコンはcurrentColorかシステムカラーに従わせ、色を固定しない。
<fieldset class="sizes"> <legend>サイズ</legend> <input type="radio" name="size" id="size-m" value="m" checked> <label for="size-m">M</label> …</fieldset><button class="save" aria-label="お気に入りに保存"> <svg viewBox="0 0 24 24" aria-hidden="true"> <path fill="#1a1a1a" d="…"/> </svg></button>コントラストテーマが残すスタイル
<fieldset class="sizes"> <legend>サイズ</legend> <input type="radio" name="size" id="size-m" value="m" checked> <label for="size-m"> <svg class="tick" viewBox="0 0 24 24" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="3" d="M5 12l5 5 9-10" /> </svg> M </label> …</fieldset><button class="save" aria-label="お気に入りに保存"> <svg viewBox="0 0 24 24" aria-hidden="true"> <path fill="currentColor" d="…"/> </svg></button>店舗本来の色では、どれも1.4.11を満たします。コントラストテーマでは、塗り、影、アイコンのコントラストがまさに失われるため、状態、フォーカス、ボタンがまとめて見えなくなります。
コントラストテーマは、枠線、outline、文字色を消さずに色を付け替えます。チェックマークは currentColor で描くため、どの配色でも表示され、色の区別がつきにくい人にも選んだサイズが伝わります。フォーカスの枠はoutlineになり、テーマのフォーカスの色で描かれます。ハートはボタンの文字色に従います。
どちらも、すべてのコントラストテーマで基準を満たします。テーマが残すスタイルは2組目のルールが要らず、同じ習慣に従う限り新しいコンポーネントにも効きますが、通常のデザインでも選んだサイズにチェックマークが付きます。forced-colorsのブロックはデザインを変えず、利用者自身の強調色を使いますが、コンポーネントが増えるたびにリストを増やす必要があります。多くのサイトは両方を使います。すべてのフォーカスをoutlineで、すべてのアイコンを currentColor で描くのは費用がかからないため常に行い、デザインを変えられない状態だけをブロックで描き直します。
デザイン上、影のフォーカス表示を残したい場合は、そのまま outline: 3px solid transparent を加えます。透明なoutlineは通常の配色では見えず、テーマが見える色に変えます。Tailwindの outline-hidden は強制配色でまさにこれを行い、outline-none は行いません。ring-* には outline-hidden を組み合わせてください。
塗りのボタンにも同じ習慣が役立ちます。border: none のボタンはコントラストテーマでただの文字になりますが、border: 2px solid transparent にすれば、通常のデザインを変えずに形が戻ります。
forced-color-adjust: none はページ本来の色を戻し、利用者のテーマが避けていた問題も一緒に戻します。商品の色見本のように色そのものが内容である場所だけに使い、見本には CanvasText の枠線を付けて輪郭を残します。
background-image、CSSのグラデーション、mask-image で描いたアイコンも消えます。テーマはファイル以外の背景画像を外し、マスクの背景を背景色に変えるためです。最も安全なのは currentColor のインラインSVGです。<img> のアイコンは元の色を保つため、暗いテーマと明るいテーマの両方で確認してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない5つの確認
確認方法: 強制配色、キーボード、コントラストの測定
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のコンポーネントのスタイルやアイコンのセットを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。コントラストテーマはWindowsのバージョンやブラウザーによって異なり、Firefox独自の色の上書きも少し異なる動作をします。通常の配色でのコントラストは別の要件で、コントラストが足りない入力欄・アイコン・フォーカス枠で扱います。コントラストテーマを毎日使う人と一緒に、ページ全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。