dialog要素を使った実装を試してみます。
dialog要素について
dialog要素は名前の通り、ダイアログやモーダルなどのUIを実装するための要素です。
open属性を設定することで表示されますが、open属性を直接操作するのではなく、JavaScriptのshow()メソッドかshowModal()メソッドを使用して表示することが推奨されています。
dialog要素はアクセシビリティの面も考慮された実装になっています。
実例は後述していますが、キーボード操作でダイアログを開いた際はダイアログ内にフォーカスが移動して、ダイアログを閉じた際はダイアログを開く前のフォーカス位置に戻ります。
showModal()メソッドを使ったダイアログの場合、Escキーでもダイアログを閉じることができます。
対応ブラウザに関して、主要なブラウザでは特に問題なくサポートされているようですが、Safariが15.4からの対応になるので、場合によっては注意が必要かもしれません。
サンプルコード
dialog要素を実際に使ってみます。
<button id="open-btn">dialogを開く</button> <dialog id="dialog"> <p>dialogの内容</p> <p><a href="#">リンクテスト</a></p> <p><button id="close-btn">dialogを閉じる</button></p> <form method="dialog"> <button>dialogを閉じる2</button> </form> </dialog>
前述の通り、dialog要素を表示する際はshow()メソッドかshowModal()メソッドを使用します。
まずはshow()メソッドを使用した場合です。
// dialogを開く document.getElementById('open-btn').addEventListener('click', function() { document.getElementById('dialog').show(); }); // dialogを閉じる document.getElementById('close-btn').addEventListener('click', function() { document.getElementById('dialog').close(); });
dialogを閉じる際はclose()メソッドを使用するか、form要素のmethod属性にdialogを指定したフォームを送信します。
これでdialogの開閉ができました。
show()メソッドでdialogを表示するデモページ
次にshowModal()メソッドを使用した場合です。
// dialogを開く document.getElementById('open-btn').addEventListener('click', function() { document.getElementById('dialog').showModal(); }); // dialogを閉じる document.getElementById('close-btn').addEventListener('click', function() { document.getElementById('dialog').close(); });
show()メソッドで実装した場合と少し違い、黒透過の背景付きで表示されるようになりました。
showModal()メソッドでdialogを表示するデモページ
chromeのデベロッパーツールで確認すると、showModal()での実装の方はtop-layerというレイヤーがdocumentの外側に配置されているのが分かります。
このTop layer(最上位レイヤー)は他レイヤーの最上位に位置するため、z-indexなどの考慮が必要なくなります。
showModal()の黒透過部分は::backdrop疑似要素で設定されています。
背景部分を含めてdialogのスタイルを変更してみます。
<dialog id="dialog" class="dialog"> <p>dialogの内容</p> <p><a href="#">リンクテスト</a></p> <p><button id="close-btn">dialogを閉じる</button></p> <form method="dialog"> <button>dialogを閉じる2</button> </form> ~略~ <p>dialogの内容</p> </dialog>
.dialog { border: none; padding: 0; width: 300px; } .dialog::backdrop { background: rgba(255, 0, 0, 0.6); }
画面高さよりコンテンツ量が多い場合、スクロールバーが表示されます。
dialogのスタイルを変更するデモページ
コメントが承認されるまで時間がかかります。