概述原生 `dialog` 元素提供模态与非模态对话能力,结合内置的焦点捕获与返回值机制,可替代繁琐的自定义弹层与表单确认流程。关键参数与概念`HTMLDialogElement.show()/showModal()/close(returnValue)`: 打开非/模态对话框并关闭时返回值。表单协作:`formmethod="dialog"` 可在对话框内部提交后自动关闭并设置返回值。可访问性:模态时应限制背景交互、管理焦点与键盘导航(Esc 关闭)。实践示例<button id="open">删除项目</button>
<dialog id="confirm">
<form method="dialog">
<p>确定要删除该项目吗?此操作不可撤销。</p>
<menu>
<button value="cancel">取消</button>
<button value="ok">确认删除</button>
</menu>
</form>
</dialog>
<script>
const dlg = document.getElementById('confirm')
document.getElementById('open').addEventListener('click', () => dlg.showModal())
dlg.addEventListener('close', () => {
if (dlg.returnValue === 'ok') {
// 执行删除
console.log('删除确认')
}
})
</script>
焦点与样式打开后将焦点移入对话框的第一个可聚焦元素;关闭后焦点回到触发源。通过 `::backdrop` 自定义遮罩样式:dialog::backdrop { background: rgba(0,0,0,.25); backdrop-filter: blur(2px); }
验证方法兼容性:Chromium/Firefox/Safari 高版本验证;不支持时回退到自定义弹层(`position: fixed` + 焦点管理)。可访问性:检查 Tab 环路、Esc 关闭、屏幕阅读器读出标题与内容。返回值:验证 `close(returnValue)` 与 `formmethod="dialog"` 的协同行为。注意事项模态对话应避免阻塞长计算;对话内容精简、操作明确。避免嵌套多个模态导致焦点混乱;统一关闭策略与外部点击处理。

发表评论 取消回复