skysan's programming notebook

コーディングして思ったことなどを気ままに

続々々・モーダルなコンポーネントのフォーカス管理(dialog要素)

はじめに

これまでモーダルを表示したときのTABによるフォーカス移動でバックグラウンドに移動するのを防ぐための実装をしてきた。この方法は「フォーカストラップ」と呼ぶらしい。*1

注釈のサイトにユーザビリティやスクリーンリーダによるTAB移動問題の指摘もあったので、今後はこの実装をやめる。 また、最近dialog要素を知り簡単に実装できたので記事にした。

過去の記事

モーダルなコンポーネントのフォーカス管理 - my coding note

続・モーダルなコンポーネントのフォーカス管理(Nuxt.js版) - my coding note

続々・モーダルなコンポーネントのフォーカス管理(Nuxt.js版 2) - my coding note

dialog要素でモーダルダイアログを作る(Vue.js)

基本的な使い方は下記のサイトが詳しいので、説明は省く。

coliss.com

成果物

  • Google Chrome 117.0.5938.149で確認したもの

  • 今までのフォーカストラップ方式と異なり、TABによるフォーカス移動はアドレスバーに行ってしまう。

モーダルダイアログ

Vue3 dialog element sample

解説

  • showModal() でモーダルでダイアログを表示する。モーダレスはshow()を使う。
  • @cancel.prevent = onCancelpreventDefault()
    • Escapeキーでダイアログが閉じるのがデフォルトのため、閉じさせたくない場合に利用する
  • close()メソッドで渡した値はcloseイベントでreturnValue(文字列)として取得できる。
  • CSSは一切なし。ブラウザのデフォルトでダイアログのセンタリングや背景色が設定されている。
  • VueのライブラリはES Module形式で呼び出した。(公式そのまま)

以上!簡単!

所感

知らないうちにブラウザのサポートする機能がどんどん増えていた。 そして各ブラウザのサポートも早く感じる。

dialog要素を調べる過程で inert属性という、サブツリーの要素を一括無効化できる属性を発見できた。

HTMLElement: inert プロパティ - Web API | MDN