modalはdialogを使えばいい
2023年8月3日
2023年8月3日
目次
modalを作るときは、dialogタグで作ると良さそうです。
いろいろなことを考慮してくれます。
dialogの特徴
dialog.showModal();
で開く。dialog.close();
で閉じる- showModalを使った場合
- aria-modal="true"を考慮してくれる
inert
の実装はブラウザが提供しているため、気にしなくて良い。esc
を押したら閉じる- :modal 擬似クラスを使える
- 一方
<dialog>
がshow()
、またはopen
属性を使用して表示されたり、<dialog>
の既定のdisplay
を変更した場合はaria-modal="false"
として表示されます。
- showModalを使った場合
- role="dialog"と同じ仕様でブラウザが提供する
- ::backdropを使って背景色を変更できる。
dialog内のformの特徴
<form method="dialog">
を使うと良い- typeなしの
<button>
は基本閉じられる、type="button"
は閉じないその場合はformmethod="dialog"
をつけておいても閉じる。
- typeなしの
dialog.close();
時に、引数に値を渡すとdialog
のclose
のevent
でdialog.returnValue
を取得できる。- autofocusなるべく指定しておく
- 指定しない場合はブラウザ判断で、最初のform要素にfocusされる
tabindex
属性を<dialog>
要素で使用してはいけない
ARIA: dialog ロールについて
https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA/Roles/dialog_role
aria-labelledby
、aria-describedby
については「<dialog>: ダイアログ要素」で記述を見つけられなかった。
引用元: https://developer.mozilla.org/ja/docs/Web/HTML/Element/dialog
dialogの背景をクリックで閉じるための工夫
dialog.getBoundingClientRect
を使うことで、modalの領域外を判断して閉じる方法。event.target.closest
をつかってnull
かどうかを判断して閉じる方法
具体的には下記サイトに記載しています。
参考
modalを開いてる時にstyleを当てる
body:has(dialog:modal)
hasを使うとmodalが開いてるかどうかでstyleを指定できる
:modal
擬似クラスと:has
擬似クラスを使用することで、モーダルが表示されているときにだけスタイルを指定することが可能になります。
使えるブラウザ
参考
- 実装しながら理解するモーダルのアクセシビリティ with React
- アクセシブルなダイアログに必要なこと
- Dialogタグの使い方をしっかり理解モーダルを作成してみよう
- モーダルウィンドウのコンテナ要素に aria-modal 属性を適用する | Accessible & Usable
まとめ
ブラウザも主要な最新は対応してるので、inert
やrole
などの考慮もブラウザ任せにできるので
modal系にはdialogを使っていくのが良いかなと思います。