本文へ移動
ご相談

独自デザインのボタンでフォーカスが見えない

CSSリセットでフォーカスの枠を消したまま、代わりの表示を用意していません。

WCAG 2.4.7 確認方法 キーボードスクリーンリーダーズーム強制配色 エージェント向けMarkdown
問題あり フォーカス中。でも分からない。
修正後 フォーカス中。枠で分かる。
同じ操作部品の、修正前と修正後。
01

問題

キーボード利用者が、ページ上の現在位置を確認できません。

場面 フォーカスは移動するが、表示されない。 詳しく読む閉じる

独自の背景色を使った画面で、Tabキーを押して操作要素を順に選択します。フォーカスは移動していますが、表示が変わるのはマウスを重ねたときだけで、選択中の位置が分かりません。

確認できる問題 outline: noneを指定し、代わりの表示がない。 詳しく読む閉じる

outline: none でフォーカスの枠を消しています。明るいページと暗いバナーのどちらでも見える、代わりの :focus-visible スタイルがありません。

利用者への影響 キーボード利用者が、Enterで何が実行されるか推測するしかない。 詳しく読む閉じる

どの要素が選択されているか分からず、Enterキーを押した結果を予測できません。削除ボタンや、同じ操作が複数並ぶ画面では、特に操作が難しくなります。

自動チェックとAIの限界 コードは正しく見えても、画面では確認できない。 詳しく読む閉じる

HTMLの構造が正しくても、フォーカス表示が見えるとは限りません。自動チェックでは、すべての背景や枠の欠けまで確認できません。生成された枠の色が白い背景では見えても、サイト独自の背景色に埋もれることがあります。

02

試してみる

Tabキーを押して、ボタンを見てください。

Tabキーで、両方の背景のボタンを順に移動してください。

再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。

03

修正方法

リセットを削除し、背景ごとに見えるフォーカス枠を加えます。

  1. 1:focus-visibleを使い、キーボード操作のときだけ枠を表示する。
  2. 2背景とのコントラスト比を3:1以上にする。
  3. 3影だけに頼らず、強制配色でも輪郭線を残す。
修正前 代わりのないリセット
*:focus {  outline: none;}.brand-button:hover {  background: var(--brand-dark);}
修正後 背景ごとのフォーカス表示
.brand-button:focus-visible {  outline: 3px solid var(--focus-ring);  outline-offset: 3px;}/* 暗いバナーの上では、背景と区別できる色に切り替えます。 */.banner .brand-button:focus-visible {  outline-color: var(--focus-ring-on-dark);}@media (forced-colors: active) {  .brand-button:focus-visible {    outline-color: Highlight;  }}
この修正で直る理由

このリセットは、すべての操作要素からブラウザーのフォーカス表示を消し、代わりの表示もありません。ホバーのスタイルはポインターにしか反応しないため、キーボード利用者には何も変化が見えません。

要素ごとに上書きするのではなく、リセット自体を削除してから、見えるフォーカス表示を追加します。

:focus-visible は、キーボードでフォーカスしたときに枠を表示し、マウスでクリックするたびには表示しません。枠は、置かれた背景に対して3:1以上のコントラストが必要です。明るいページと暗いバナーの両方で見える色は少ないため、背景ごとに色を決めるか、どちらの背景でも見える2色の枠を使います。

実装の判断

outlineは、親要素の overflow: hidden によって欠けることがあります。必要な余白を確保するか、親要素のスタイルを調整します。影だけでフォーカスを示すと、強制配色では表示されない場合があるため、影を加える場合もoutlineは残します。固定ヘッダーやCookieバナーがフォーカス中の要素を覆うことがあるため、固定要素には scroll-padding-top を指定します。

スクリーンショットだけで判断せず、実際のページで、その要素が置かれるすべての背景を操作して確認してください。

04

修正の確認

マウスを使わない4つの確認

4件中0件を確認済み

OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のテーマやコンポーネントのスタイルを変更した際は、再度確認します。

制限

このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。コード内のトークン名は、実際のデザイントークンに置き換えてください。実際の背景で、操作全体を確認してください。

よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。

参考資料: www.w3.org

コードを更新しても、使いやすさを保つために

ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。

再テストの進め方