この記事の目次
HTMLのdialog要素の使い方とは
<dialog> は、ダイアログ(確認画面、入力フォーム、通知など)を表すHTML要素です。JavaScriptで showModal() を呼ぶと、背面が操作できなくなるモーダルとして表示されます。以前は div とJS、フォーカストラップの自作が必要でしたが、dialog は次のような機能を標準で備えています。
- 背面のページを操作不可にする(inert化)。
- 最初のフォーカス可能な要素にフォーカスを移す。
- Escキーで閉じられる。
- 背景を
::backdropで装飾できる。
MDN によると、dialog は2022年3月から主要ブラウザで広く使える機能です。
基本(構文・仕組み)
| メソッド・属性 | 内容 |
|---|---|
| showModal() | モーダルとして開く。背面は操作不可。Escで閉じられる |
| show() | 非モーダルとして開く。背面も操作可能。Escでは閉じない |
| close(値) | 閉じる。値は returnValue に入る |
| returnValue | 閉じたときの戻り値(文字列) |
| open 属性 | 開いている状態。HTMLに直接書くと非モーダルで表示される |
| closedby 属性 | 閉じ方の制限。any・closerequest・none |
| cancel / close イベント | Esc 等で閉じようとしたとき / 閉じたとき |
closedby の値は、any(外側のクリックでも閉じる)、closerequest(Escなどの閉じる操作)、none(開発者が用意した方法だけ)です。既定は、モーダルが closerequest、非モーダルが none です。closedby は新しい属性で、MDN の互換性データ(2026年10月時点)では Chrome 134、Firefox 141 から対応し、Safari は正式版では未対応です。対応状況を確認してから使います。
<form method="dialog"> を使うと、送信時にダイアログが閉じ、押したボタンの value が returnValue に入ります。サーバーへのデータ送信は行われません。
サンプルコード(実行結果つき)
確認ダイアログの完成形です。
<button id="open">削除する</button>
<dialog id="dlg">
<form method="dialog">
<p>削除しますか?</p>
<button value="cancel">キャンセル</button>
<button value="ok">削除</button>
</form>
</dialog>
<script>
const dlg = document.getElementById("dlg");
document.getElementById("open").addEventListener("click", () => dlg.showModal());
dlg.addEventListener("close", () => {
console.log("returnValue:", dlg.returnValue); // "ok" または "cancel"
});
</script>
背景を暗くするCSSです。
dialog::backdrop { background: rgb(0 0 0 / .5); }
dialog { border: 0; border-radius: 8px; padding: 1.5rem; }
Escでの閉じを止めたい場合は、cancel イベントを止めます(使う場面は限定的です)。
dlg.addEventListener("cancel", (e) => e.preventDefault());
動作確認(検証環境と結果)
- 環境: Windows 11、headless Microsoft Edge 154.0.4258.53(Chromium系、
render.ps1)。 - 確認内容: 上記の確認ダイアログを読み込み、
showModal()を呼んだ直後と、「削除」ボタンをプログラムでクリックした後の状態を取得。 - 結果:
showModal()直後はopen=true、:modalに一致(matches(":modal")がtrue)。「削除」ボタンのクリック直後はopen=false、returnValue=ok。closeイベントも発火し、closed returnValue=ok open=falseを確認しました。 - 追加確認:
showModal()直後のdocument.activeElementは最初のボタン「キャンセル」でした。open属性付きで開いている非モーダルのdialogにshowModal()を呼ぶとInvalidStateErrorになりました。 - 未検証: Escキーでの閉じ、
::backdropの見た目、closedby属性の動作、閉じた後のフォーカスの戻り、スクリーンリーダーの読み上げ。 - ログ:
C:Tempks2techtestshtml-dialog.md、画面はC:Tempks2techtestst1dialog2.png。
HTMLのdialog要素の使い方の注意点
showModal()で開くとaria-modal="true"相当になり、背面は支援技術にも隠れます。show()ではそうなりません。open属性を付けて既に開いている(非モーダルの)状態でshowModal()を呼ぶと、InvalidStateErrorの例外になります(headless Edge で確認)。開閉はJSのメソッドで一貫させます。- ダイアログ内に必ず「閉じる」手段を用意します。モーダルでEscを無効にする場合は特に注意します。
- 閉じた後は、開く前にフォーカスしていた要素にフォーカスを戻すことが望ましい動作です。ブラウザの既定動作を確認してから自作の処理を足します。
- 重要な確認は、サーバー側でも検証します(クライアントの
dialogは見た目の制御に過ぎません)。
HTMLのdialog要素の使い方でよくあるミス
open属性を付けて表示して、モーダルになると思い込む(非モーダルになります)。divでモーダルを作り、フォーカスの閉じ込めとEscを自作して不具合が出る。- 閉じるボタンを
type="button"にし忘れ、form内で意図しない送信が起きる。 ::backdropに親要素の変数が継承されると期待する(別途指定が必要になる場合があります)。
ブラウザ対応・バージョン
dialog 要素自体は MDN で2022年3月から広く利用可能とされています。一方、closedby や requestClose() などの新しいAPIは対応が限られる可能性があるため、利用前に MDN の互換性表で最新を確認してください。
HTMLのdialog要素の使い方のチェックリスト
- [ ] モーダルは
showModal()で開いている。 - [ ] 閉じる手段(ボタン・Esc)を用意している。
- [ ]
form method="dialog"とreturnValueで結果を受け取っている。 - [ ] 背景のスタイルを
::backdropで指定している。 - [ ] 実機のキーボード操作とスクリーンリーダーで確認した。
HTMLのdialog要素の使い方のFAQ(よくある質問)
Q. 背景クリックで閉じるには。
A. closedby="any" が使えますが、新しい属性です。対応を確認するか、click イベントで要素の外側のクリックを判定します。
Q. ダイアログを閉じるときにアニメーションは付けられますか。
A. CSSで実現できる方法がありますが、この記事では未検証です。
Q. alert() や confirm() との違いは。
A. 見た目をCSSで自由に変えられ、alert() のようにスクリプトの実行を止めません(結果は close イベントなどで受け取ります)。
筆者の見解(HTMLのdialog要素の使い方)
私見では、モーダルは dialog を第一候補にしてよい段階に来ていると考えます。フォーカス管理やEscの処理を自作して漏れるリスクを避けられるからです。ただし、モーダルは操作を中断させる強い仕組みなので、本当に必要か、インライン表示や details で済まないかを先に検討するのが、使いやすさの面で重要だと考えます。
HTMLのdialog要素の使い方の関連項目
- details と summary
- フォームの label・name・autocomplete
- セマンティックHTML
- input type の種類
- 初心者必見!必要なタグはたったこれだけ!HTML超入門!

