やーホント詰まった。「なんでできねぇんだよ」が久々に来たね。
英語圏兄貴の検索に引っかかることを願って、英単語まじえて説明していく。
◆したいこと
- htmlでbutton要素をclickする。
- focusは当てたい。けど見せたくない。つまるところ、outlineをhiddenしたい。outlineをinvisibleしたい。outline: none;したい。
- しかしながらtabで移動してきたときはfocusを当てたい。
◆前提知識:CSSの疑似クラス
条件によりCSSをあてたい時に使用。
◆試行錯誤(読まなくてよし)
▼擬似クラス:focusでoutline: none;
- Tabで移動してきたときにoutlineが消えちゃう。やだ。
▼擬似クラス:activeでoutline: none;
- mouseupしたときにoutlineが復活する。やだ。
▼buttonのonclickでthis.blur()
- holdしてるときにoutlineがでる。やだ。
- 「outlineが見えていない」じゃなくて「focusがはずれる」だ。やだ。
▼buttonのonmousedownとonmouseupでthis.blur()
同上。
◆疑似クラス:focus-visible
visibleって名前おかしいでしょ。「関係ないか」と思ってしまった。
:focus-visible 疑似クラスは、要素が :focus 疑似クラスに一致している時で、ユーザーエージェントが要素にフォーカスを明示するべきであると発見的に指定した場合 (多くのブラウザーではこの場合、「フォーカスリング」を表示します) に適用されます。
このセレクターは、ユーザーの入力方法 (マウスなのかキーボードなのか) によって異なるフォーカス表示を提供したい場合に便利です。
-出典 MDN::focus-visible
日本語しゃべって(懇願)
しかしまぁ、こいつを使えばいい。
◆つかう
◆問題発生
Vue.jsフレームワークを使って開発していたんだが、単一ファイルComponent配下のbuttonでfocus-visibleが効かない。outlineでちゃう。
◆対処
なんかfocus-visibleってまだらしいから、polyfillすりゃいいらしい。
-
yarn add -D focus-visible
する
- .vueファイルの<script>タグ内で
import 'focus-visible';
する
- .vueファイルの<style>タグ内で
button:focus:not(.focus-visible) { outline: none; }
する
※例は「button」要素になってるけど「.hoge」クラスでもいいし「#fuga」IDでもいいでしょうね。
◆以上
Chromeは当然として、IEでもEdgeでも動いてるし多分FireFoxでも動くでしょ。(楽観)
「わかんねぇ」とか「ポリフィルってなんだよ。やめろよ。」とかあったらコメントしろな。
コメントを残す