はじめに
これまでモーダルを表示したときのTABによるフォーカス移動でバックグラウンドに移動するのを防ぐための実装をしてきた。この方法は「フォーカストラップ」と呼ぶらしい。*1
注釈のサイトにユーザビリティやスクリーンリーダによるTAB移動問題の指摘もあったので、今後はこの実装をやめる。
また、最近dialog
要素を知り簡単に実装できたので記事にした。
過去の記事
モーダルなコンポーネントのフォーカス管理 - my coding note
続・モーダルなコンポーネントのフォーカス管理(Nuxt.js版) - my coding note
続々・モーダルなコンポーネントのフォーカス管理(Nuxt.js版 2) - my coding note
dialog要素でモーダルダイアログを作る(Vue.js)
基本的な使い方は下記のサイトが詳しいので、説明は省く。
成果物
Google Chrome 117.0.5938.149で確認したもの
今までのフォーカストラップ方式と異なり、TABによるフォーカス移動はアドレスバーに行ってしまう。
- ユーザビリティ的にはこちらの方がいいんじゃない?(言い訳)
解説
showModal()
でモーダルでダイアログを表示する。モーダレスはshow()
を使う。@cancel.prevent
=onCancel
でpreventDefault()
- Escapeキーでダイアログが閉じるのがデフォルトのため、閉じさせたくない場合に利用する
close()
メソッドで渡した値はclose
イベントでreturnValue
(文字列)として取得できる。- CSSは一切なし。ブラウザのデフォルトでダイアログのセンタリングや背景色が設定されている。
- VueのライブラリはES Module形式で呼び出した。(公式そのまま)
以上!簡単!
所感
知らないうちにブラウザのサポートする機能がどんどん増えていた。 そして各ブラウザのサポートも早く感じる。
dialog
要素を調べる過程で inert
属性という、サブツリーの要素を一括無効化できる属性を発見できた。