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-20
  • Edge

    v86+
    2020-10-09
  • Safari

    v15.4+
    2022-03-14
  • Safari (iOS)

    v15.4+
    2022-03-14
  • Firefox

    v85+
    2021-01-26
    フォールバック
    v4から
    :-moz-focusring

機能名やコードで検索できます

例:aspect-ratio、:has()、padding-top

別の言葉や、プロパティ名で試してください

検索を読み込めませんでした