コンテンツにスキップ

Dialog

ネイティブの dialog 要素を使ったモーダル UI。トリガーや ARIA 属性の関連付け、背景クリックで閉じる操作に対応します。

<pe-dialog>
<button type="button" class="Trigger" data-dialog-trigger>Open dialog</button>

<dialog class="Dialog">
  <header class="Header">
    <h2 class="Title" data-dialog-title>Example dialog</h2>
    <button type="button" class="Close" data-dialog-close>Close</button>
  </header>
  <p class="Description" data-dialog-description>
    A native modal dialog enhanced with trigger wiring and ARIA sync.
  </p>
</dialog>
</pe-dialog>

Dialog はモーダルタスクや確認に使います。背景操作で閉じる場合だけ data-dialog-dismiss を指定し、単純な確認・キャンセルにはネイティブの form method="dialog" を使います。

パーツ セレクター 役割
ホスト <pe-dialog> 1 つの <dialog> の状態とライフサイクルを管理します
Dialog <dialog> モーダルとして表示するネイティブ要素
トリガー [data-dialog-trigger] ダイアログを開きます。値が空なら、同じホスト内のダイアログが対象です
タイトル [data-dialog-title] 明示的なラベルがないとき aria-labelledby を設定します
説明 [data-dialog-description] aria-describedby を設定します
閉じる [data-dialog-close] クリックでダイアログを閉じます
背景クリック <dialog> 上の data-dialog-dismiss 背景を押したときにダイアログを閉じます

すぐに応答が必要な短いメッセージには role="alertdialog" を指定します。

<button type="button" class="Trigger" data-dialog-trigger="delete-dialog">
Delete item
</button>

<pe-dialog id="delete-dialog">
<dialog class="Dialog" role="alertdialog" aria-modal="true">
  <h2 class="Title" data-dialog-title>Delete this item?</h2>
  <p class="Description" data-dialog-description>
    This action cannot be undone.
  </p>

  <form class="Actions" method="dialog">
    <button value="cancel" autofocus>Cancel</button>
    <button class="ButtonDanger" value="confirm">Delete</button>
  </form>
</dialog>
</pe-dialog>

<p id="delete-result" class="Status" role="status"></p>
  • 名前と説明を用意する。
  • data-dialog-dismiss は指定しない。
  • 最も安全なボタンに autofocus を付ける。
  • 明示的なフォーム確認後だけ処理を実行する。
const host = document.querySelector("#delete-dialog");
host.addEventListener("pe-dialog:close", (event) => {
const { dialog, reason } = event.detail;
if (reason === "form" && dialog.returnValue === "confirm") {
deleteItem();
}
});
名前説明
isOpenboolean (readonly)ダイアログが現在開いているかどうかを読み取ります。
open(trigger?)voidshowModal() でダイアログを開きます。JavaScript から開く場合は、フォーカスを戻す要素として、操作元のトリガーを渡せます。
close(returnValue?)voidダイアログを閉じます。returnValue を指定すると、HTMLDialogElement.close() へ渡されます。
toggle(trigger?)void閉じていれば開き、開いていれば閉じます。
名前説明
data-dialog-triggerダイアログを開く要素に指定します。値が空なら同じホスト内、ホストの id を指定した場合は対応する外部ダイアログが対象です。
data-dialog-closeクリックまたはキーボードで操作すると、ダイアログを閉じます。
data-dialog-titlearia-labelledby で参照するタイトル要素を示します。
data-dialog-descriptionaria-describedby で参照する説明要素を示します。
data-dialog-dismiss<dialog> に指定すると、背景を押したときにダイアログを閉じます。
data-stateホスト、ダイアログ、トリガーに "open" または "closed" を設定します。トリガーが複数ある場合、実際に開いたトリガーだけが "open" になります。
名前説明
pe-dialog:openダイアログが開いた後に発火します。detail には dialog、オプションの trigger、reason が含まれます。
pe-dialog:closeダイアログが閉じた後に発火します。detail には dialog、オプションの trigger、reason が含まれます。
pe-dialog:cancelネイティブの cancel イベントを処理した後に発火します。detail には dialog、任意の trigger、reason、ネイティブイベントがキャンセルされたかどうかが含まれます。

detail.reason には、閉じた理由として triggerclose-controlformcanceldismissprogrammaticnative のいずれかが入ります。

ネイティブの cancel イベントがキャンセルされた場合、detail.defaultPreventedtruepe-dialog:cancel が発火します。ダイアログは開いたままとなり、pe-dialog:close は発火しません。

<pe-dialog> を別のダイアログ内に置くと、ダイアログを入れ子にできます。フォーカスを戻す処理と閉じる操作は、最前面にあるダイアログに対して行われます。

<button type="button" class="Trigger" data-dialog-trigger="parent-dialog">
Open parent dialog
</button>

<pe-dialog id="parent-dialog">
<dialog class="Dialog" data-dialog-dismiss>
  <header class="Header">
    <h2 class="Title" data-dialog-title>Parent dialog</h2>
    <button type="button" class="Close" data-dialog-close>Close parent</button>
  </header>
  <p class="Description" data-dialog-description>
    Open a child dialog without closing this parent dialog.
  </p>
  <button type="button" class="Trigger" data-dialog-trigger="child-dialog">
    Open child dialog
  </button>

  <pe-dialog id="child-dialog">
    <dialog class="Dialog">
      <header class="Header">
        <h2 class="Title" data-dialog-title>Child dialog</h2>
        <button type="button" class="Close" data-dialog-close>Close child</button>
      </header>
      <p class="Description" data-dialog-description>
        Closing this dialog restores focus to its trigger in the parent dialog.
      </p>
    </dialog>
  </pe-dialog>
</dialog>
</pe-dialog>

ネストされたダイアログでは次のスタイリングフックを利用できます。

名前 説明
data-nested ダイアログが別のダイアログ内にネストされているときに存在します。
data-nested-dialog-open このダイアログ内に、開いている子ダイアログがある場合に付きます。
--nested-dialogs 開いている間のネスト深度(ルートダイアログは 0、子は 1、以下同様)。