具体例:業務での困りごと
Aさんは大量のデータをシステムに入力する業務を担当しており、作業をスピードアップするためキーボード操作で画面を移動しています。 ところが、フォーカスが見えない画面では、どのボタンが選択されているか分かりません。 その結果、登録ボタンを押すつもりがキャンセルを押してしまうなどのミスが頻発し、業務効率が下がりました。
結果的に、使いやすさが大きく損なわれ、「使えるのに使えない」状態に陥ります。
具体例:業務での困りごと
Aさんは大量のデータをシステムに入力する業務を担当しており、作業をスピードアップするためキーボード操作で画面を移動しています。 ところが、フォーカスが見えない画面では、どのボタンが選択されているか分かりません。 その結果、登録ボタンを押すつもりがキャンセルを押してしまうなどのミスが頻発し、業務効率が下がりました。
以下のデモでTabキーを押してフォーカスの違いを体験してください。
悪い例: フォーカスが見えない
良い例: フォーカスがしっかり見える
:focus-visible
擬似クラスでフォーカスリングを当てる最小限の実装例
要素と重ならない位置でフォーカススタイルを表示できます。
box-shadow
を使用するとより柔軟なデザインを実現できます。
tabindex
を使用する
tabindex="-1"
:JavaScriptからのみフォーカス可能tabindex="0"
:カスタム要素などを通常のタブ順序に含めるtabindex="1"
以上:タブ順序を強制的に変更する(使わない).container { display: flex; flex-direction: column;}.visual-first { order: -1;}
モーダル表示時にはフォーカスをモーダル内で循環させます。
多くのUIライブラリはこの機能を提供しているため、利用を検討してください。
自前で実装をする場合は以下のライブラリを検討してください。
Material-UIやChakra UIなどでは、テーマやコンポーネント単位でfocus-visible
スタイルの上書きが可能です。
まとめて適用することで、個別対応の手間を減らせます。
擬似クラス | 特徴 | 使用場面 |
---|---|---|
:focus | マウスでもキーボードでもフォーカス時に有効。古いブラウザでも使える | 後方互換性が必要な場合 |
:focus-visible | 基本的には推奨。キーボード操作時など、「フォーカスを表示するべき場合のみ」に有効 | モダンブラウザでのフォーカス表示 |
:focus-within | 子要素にフォーカスがある場合も親要素に適用される | フォーム全体やカードコンポーネントのハイライト |
box-shadow
を使用することで柔軟なデザインを実装できます。ただし、Windowsのハイコントラストモードでは表示されないため、outline: 2px solid transparent
と併用します。ハイコントラストモードではtransparent
が適切な色に変換されます。
:focus-visible { outline: 2px solid transparent; box-shadow: 0 0 0 3px red;}
:focus-visible { outline-offset: 0; transition: outline-offset 0.25s ease-out;}:focus-visible { outline-offset: 2px;}/* アニメーションを望まないユーザーにはアニメーションを無効化する */@media (prefers-reduced-motion: reduce) { :focus-visible { transition: none; }}
:root { --focus-ring: #005fcc;}@media (prefers-color-scheme: dark) { :root { --focus-ring: #4d9fff; }}:focus-visible { outline: 2px solid var(--focus-ring);}