スタイル フォーカス

フォーカス インジケーター(「フォーカス リング」とも呼ばれます)は、現在の 要素を追加します。マウスを使用できないユーザーには、 パフォーマンス指標の代わりとなるため、極めて重要 移動します。

ブラウザのデフォルトのフォーカス インジケーターがデザインと一致しない場合は、 スタイルを変更します。ただし、キーボード ユーザーを念頭に置くようにしてください。

:focus を使用して常にフォーカス インジケーターを表示する

:focus 疑似クラスは、入力に関係なく、要素がフォーカスされると常に適用されます。 フォーカスするために使用したデバイス(マウス、キーボード、タッチペンなど)や方法。たとえば 以下の <div> には tabindex があり、フォーカス可能になっています。また、 :focus 状態のカスタム スタイル:

div[tabindex="0"]:focus {
  outline: 4px dashed orange;
}

マウスでクリックする場合でもキーボードで 操作する場合でも <div> は常に同じに見えます。

残念ながら、ブラウザによってはフォーカスの適用方法に一貫性がない場合があります。または どの要素がフォーカスされるかは、ブラウザやオペレーティング ありません

たとえば、以下の <button> には、:focus のカスタム スタイルもあります。 あります。

button:focus {
  outline: 4px dashed orange;
}

macOS の Chrome で <button> をマウスでクリックすると、 カスタム フォーカス スタイル。ただし、カスタム フォーカス スタイルを macOS の Safari で <button> をクリックします。なぜなら、 Safari では、要素をクリックしてもフォーカスされません。

フォーカスの動作に一貫性がないため、テストが必要になる場合があります フォーカス スタイルがユーザーに適しているかを確認します。

:focus-visible を使用してフォーカス インジケーターを選択的に表示します

新しい :focus-visible 疑似クラスは、要素がフォーカスを受け取り、 ブラウザがヒューリスティックにより、フォーカス インジケーターを表示するかどうかを 提供します。特に、直近のユーザー操作が キーボード経由であり、キーの押下がメタ(ALT / OPTION)を含んでいなかった または CONTROL キーを使用した場合、:focus-visible が一致します。

以下の例のボタンは、フォーカス インジケーターを選択的に表示します。条件 マウスでクリックしたときの動作は Tab キーで移動します

button:focus-visible {
  outline: 4px dashed orange;
}

:focus-within を使用して、フォーカスされている要素の親のスタイルを設定する

:focus-within 要素に疑似クラスが適用されるのは、要素自体が その要素内の別の要素がフォーカスを受け取ったときに発生します。

ページの特定の領域をハイライトして、 その部分にユーザーの注意が向くようにしますたとえば、以下のフォームは、 フォーム自体が選択されているときと ラジオボタンがオンになっているときに 選択済みです。

form:focus-within {
  background: #ffecb3;
}

フォーカス インジケーターを表示するタイミング

目安として、「ユーザーがこのコントロールをクリックしたのに キーボードが表示されると思いますか?」

答えが「はい」の場合コントロールにはおそらく常にフォーカスが どの入力デバイスでもフォーカスできます。わかりやすい例が <input type="text"> 要素。ユーザーは、アプリに入力を送信する必要があります。 その入力要素が最初に受け取った方法に関係なく、キーボードで フォーカス インジケーターを常に表示することをおすすめします。

答えが「いいえ」の場合コントロールでは選択的にフォーカスを 表示されます。わかりやすい例は <button> 要素です。ユーザーが広告をクリックして マウスまたはタッチ スクリーンで操作が完了すると、フォーカス インジケーターが できます。ただし、ユーザーがキーボードで移動している場合は、 フォーカス インジケーターを表示してユーザーが後で判断できるようにする ENTER キーまたは SPACE キーを使用してコントロールをクリックします。

outline: none を避ける

ブラウザがフォーカス インジケーターを描画するタイミングを決定する方法は、率直に言って、 混乱を招きますCSS を使用して <button> 要素の外観を変更するか、 要素。tabindex はブラウザのデフォルトのフォーカス リングの動作を 始まります

非常に一般的なアンチパターンは、次のような CSS を使用してフォーカス インジケーターを削除することです。

/* Don't do this!!! */
:focus {
  outline: none;
}

この問題を回避するには、:focus:focus-visible ポリフィルです。以下の最初のコードブロックは、 その下のサンプルアプリで、API 呼び出しの ボタンのフォーカス インジケーターを変更するために使用できます。

/*
  This will hide the focus indicator if the element receives focus via the
  mouse, but it will still show up on keyboard focus.
*/
.js-focus-visible :focus:not(.focus-visible) {
  outline: none;
}

/*
  Optionally: Define a strong focus indicator for keyboard focus.
  If you choose to skip this step, then the browser's default focus
  indicator will be displayed instead.
*/
.js-focus-visible .focus-visible {
  
}