<dialog> 是用于模态框和对话框的原生元素。它处理焦点捕获、背景层、顶层、以及 Escape 键关闭功能——这些功能否则你需要用大量 JavaScript 和 ARIA 手动实现。
html
Confirm
Are you sure?
Cancel
OK
const modal = document.getElementById("myModal");
modal.showModal(); // opens as a MODAL: backdrop + focus trapped + Esc closes
modal.show(); // opens as a NON-modal (no backdrop, page stays interactive)
modal.close("ok"); // closes, sets returnValue
modal.addEventListener("close", () => {
console.log(modal.returnValue); // "ok" or "cancel" — from the button's value
});
::backdrop 自定义样式,点击外部可被检测。z-index 是多少,都渲染在所有内容上方。method="dialog" 关闭对话框并记录哪个按钮被提交。dialog::backdrop { background: rgba(0, 0, 0, 0.5); }
dialog { border: none; border-radius: 8px; padding: 2rem; }
在 <dialog> 出现之前,可访问的模态框需要手动焦点管理、ARIA 角色、滚动锁定和 Escape 键处理——这是 bug 的常见来源。
原生元素能够开箱即用地正确提供所有这些功能。
对于真正的模态框,使用 showModal();这是现代的、可访问的对话框默认方案。