focus-visible
キーボード操作など、フォーカスの位置を示す必要があるときだけ当たる擬似クラス。 マウスで押したときの枠を消すために、キーボードで操作する人の枠まで消していたoutline: noneを置き換えられます。
今の書き方
枠を示す必要があるかどうかは、ブラウザが判断します。
独自の枠を:focus-visibleに付ければ、マウスで押したときには出ず、キーボードで操作したときには出ます。
button:focus-visible {
outline: 2px solid #06c;
outline-offset: 2px;
}以前の書き方
マウスで押したときに出る枠を消すため、:focusの枠をまとめて消していました。
キーボードで操作する人は、フォーカスの位置が分からなくなります。
button:focus {
outline: none;
}置き換えるときの注意点
- テキスト入力は、マウスでクリックしても
:focus-visibleが当たります。 入力欄の枠もoutline: noneで消していた場合は、置き換えるとクリックしたときにも枠が出るようになります。 - ブラウザ既定の枠は、すでに
:focus-visibleと同じ基準で出ています。 独自の枠が要らなければ、outline: noneを消すだけで済みます。 - 独自の枠は、背景と3:1以上のコントラストにします(WCAG 2.1の達成基準1.4.11)。
- Safariでは、設定の「詳細」にある「Tabキーを押したときにウェブページ上の各項目を強調表示」を入れないと、Tabキーでボタンやリンクに移動しません。 Safariでボタンの枠を確かめるときは、この設定を入れます。
フォールバック
対象の5ブラウザはすべて対応済みなので、通常は:focus-visibleだけで足ります。
古いブラウザも支える必要がある場合は、:focusに枠を付け、:focus:not(:focus-visible)で消します。
:focus-visibleを知らないブラウザでは2つ目のルールごと無視されるため、枠が出る側に倒れます。
button:focus {
outline: 2px solid #06c;
outline-offset: 2px;
}
button:focus:not(:focus-visible) {
outline: none;
}Browser Support
Chrome
v86+2020-10-20Edge
v86+2020-10-09Safari
v15.4+2022-03-14Safari (iOS)
v15.4+2022-03-14Firefox
v85+2021-01-26フォールバック
v4から:-moz-focusring