1. showModal 的焦点陷阱(focus trap)、top layer 渲染与 ::backdrop 样式化的协作,以及非模态 show() 的差异
dialog 元素调用 showModal() 与 show() 有何差异?模态对话框的焦点陷阱、top layer 渲染与 ::backdrop 是如何协作的?
- showModal 进入 top layer 并启用焦点陷阱,show 仅按普通文档流渲染
- ::backdrop 伪元素提供模态遮罩的样式入口
- Esc 关闭、cancel 事件与焦点恢复的行为
dialog 的 showModal() 会把元素放入 top layer(顶层渲染层),浮于文档之上,不受 z-index 与祖先 overflow 裁剪影响,同时启用焦点陷阱,Tab 焦点在对话框内循环,避免逃逸到背景。::backdrop 伪元素代表对话框背后的全屏遮罩,可设置背景色、模糊或动画。非模态 show() 只是普通渲染,不进入 top layer、不锁焦点、不屏蔽背景交互,适合非阻塞提示。模态对话框按 Esc 先触发 cancel 事件,可阻止关闭,关闭后触发 close 事件并通过 returnValue 获取结果。
考察原生 dialog 的模态机制:showModal 与 show 的核心差异在于 top layer 与焦点陷阱,::backdrop 是配套遮罩样式入口;掌握三者协作关系,才能正确实现无障碍模态交互,避免自造焦点管理。