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を使っていくのが良いかなと思います。



