「とりあえず `outline: none;` しておけばデザイン崩れないだろ?」……もし後輩がコードレビューでそんなことを言っていたら、私はその場でPCを閉じさせるかもしれない。
フロントエンドの現場において、アクセシビリティとデザインのバランスは永遠の課題だ。デザイナーがこだわった美しいUIに、ブラウザ標準のあの太くて野暮ったい青い枠線(フォーカスリング)が乗っかると、確かに「うわっ」となる気持ちはわかる。しかし、それを単に消すのは「キーボードユーザーを無視する」という、プロとしてあってはならない怠慢だ。
そこで登場するのが `:focus-visible` だ。今日は、この現代CSSの必須知識について、現場の勘所を交えて深掘りしていく。
—
1. なぜ `:focus` ではなく `:focus-visible` なのか?
かつて、僕らは `:focus` を制御するために血眼になっていた。しかし、`:focus` は「マウスでクリックした時」も「キーボードでタブ移動した時」も等しく反応してしまう。
結果として、クリック時に出る不格好な枠線を消すために `outline: none` を書く。すると今度は、キーボードで操作するユーザーが「今どこにフォーカスがあるか」を完全に見失う。これはアクセシビリティの観点からは致命的な欠陥だ。
`:focus-visible` は、ブラウザが「この要素に視覚的なインジケーターを表示すべきかどうか」を推論してくれるという極めて優秀な擬似クラスだ。
ブラウザが裏側でやっていること
ブラウザは、ユーザーの入力モードを常に監視している。
- マウス操作: 「意図的にクリックしたんだから、わざわざ枠線で強調しなくてもわかるでしょ?」という判断(インジケーターを非表示)。
- キーボード操作: 「タブ移動でここに来たんだな。視覚的な手がかりがないと迷子になるよね」という判断(インジケーターを表示)。
この「空気の読み方」をCSS側で制御できるようになったおかげで、僕らは「マウスユーザーには美しく、キーボードユーザーには親切なUI」を両立できるようになったんだ。
—
2. 現場で使える「最強のデフォルト設定」
実務で私が必ずと言っていいほどグローバルCSS(あるいはリセットCSSの直後)に入れている設定がこれだ。まずはこれをエディタに貼ってほしい。
/
- 1. まずブラウザ標準の枠線を一度リセットする。
- ただし、ユーザーエージェントスタイルを完全に殺さないよう注意が必要。
/
:focus:not(:focus-visible) {
outline: none;
}
/
- 2. キーボード操作によるフォーカス時のみ、
- デザイナーが指定した「ブランドカラーの枠線」を適用する。
/
:focus-visible {
outline: 3px solid var(–color-primary);
outline-offset: 2px;
/
- outline-offsetを使うのがコツだ。
- これで要素から少し離れた位置に枠線が描画されるので、
- ボタンのデザインを損なわずに視認性を確保できる。
/
}
このコードのポイントは、`:focus:not(:focus-visible)` というセレクタの使い方にある。「フォーカスはされているが、それが `:focus-visible` ではない時(=マウス操作時)」という条件で `outline` を消す。これが一番スマートな解決策だ。
—
3. 実践:カスタムボタンでの活用例
例えば、`div` や `span` に `tabindex=”0″` を与えて無理やりボタンにするような、少し複雑なコンポーネントを作る時こそ、このプロパティが真価を発揮する。
.custom-button {
background-color: #333;
color: #fff;
border: none;
padding: 10px 20px;
transition: background-color 0.2s;
}
/ マウスホバー時はシンプルに色を変えるだけ /
.custom-button:hover {
background-color: #555;
}
/ キーボードで到達した時だけ、特別なエフェクトを出す /
.custom-button:focus-visible {
outline: 2px solid #000;
outline-offset: 4px;
box-shadow: 0 0 0 2px #fff; / 枠線を二重にして視認性を高めるテクニック /
}
—
4. 最後に:エンジニアとしての矜持
CSSにおいて `:focus-visible` を使いこなすことは、単なるコーディングスキルの向上ではない。「誰がこのサービスを使うのか」という想像力の証明だ。
マウスしか使わないユーザー、画面読み上げソフトを使うユーザー、あるいはマウスが故障してキーボードで操作せざるを得ないユーザー。彼らにとって、あなたの書いたCSSが「迷い」を解決する灯台になる。
「なんとなく `outline: none` で消しておこう」という安直な選択から卒業して、`:focus-visible` という繊細な武器を使いこなしてほしい。それが、フロントエンドのスペシャリストとしての第一歩だ。
何か実装で詰まったら、いつでも聞いてくれ。現場のコードは、綺麗に書くだけじゃなく、使う人に優しくないと意味がないからな。

コメント