使用实现wai-aria合规弹窗需确保语义正确(aria-labelledby/aria-label)、初始隐藏、手动管理焦点流(trap focus)、设置inert遮罩、同步aria-modal状态,并响应esc/backdrop关闭及事件监听。

使用 <dialog></dialog> 标签实现符合 WAI-ARIA 标准的弹窗,核心在于语义正确、焦点管理、键盘可访问性与状态同步。原生 <dialog></dialog> 已内置部分 ARIA 行为(如 role="dialog"、aria-modal="true"),但需手动补全关键可访问性细节才能真正达标。
确保语义结构与初始状态正确
必须为 <dialog></dialog> 提供明确的可访问名称(accessible name),且默认隐藏(不渲染在 DOM 流中)。不能依赖 CSS display: none 或 visibility: hidden 隐藏——这会破坏屏幕阅读器感知。
- 用
aria-labelledby指向弹窗标题元素(<h2></h2>或带id的<div>),或用 <code>aria-label直接提供简明文本 - 初始化时不要设
open属性,避免页面加载即触发弹窗(违反 WCAG 2.2.2 中断原则) - 示例:
<dialog id="confirm-dialog" aria-labelledby="dialog-title"><h2 id="dialog-title">确认删除?</h2> <p>该操作不可撤销。</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8272" title="anything-to-html"><img src="https://img.php.cn/upload/skill/000/000/081/179195588450431.jpg" alt="anything-to-html" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill8272" title="anything-to-html" class="overflowclass">anything-to-html</a> <p class="overflowclass">将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。</p> </div> <a rel="nofollow" href="/xiazai/skill8272" title="anything-to-html" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <button id="confirm-btn">确定</button> <button id="cancel-btn">取消</button> </dialog>
- 调用
showModal()后,立即将焦点设到弹窗内首个可聚焦元素(如第一个按钮或输入框) - 监听
keydown,拦截Tab键,确保焦点在弹窗内循环(trap focus):按 Tab 到最后一个可聚焦项时,跳回第一个;Shift+Tab 则反向 - 用
inert属性(或 aria-hidden + 手动禁用)标记背景内容,防止屏幕阅读器读取非模态区域(<dialog></dialog>自身不自动设置inert) -
Esc键必须关闭弹窗(调用.close()),且焦点需返回触发按钮 - 点击 backdrop(灰色遮罩层)应关闭弹窗(
<dialog></dialog>默认支持,但需验证是否触发close事件) - “确定/取消”类按钮应有明确
type="submit"或type="button",避免表单意外提交 - 对关键操作按钮(如“删除”)添加
aria-describedby指向说明性文字,增强上下文理解 - 打开时:确保
aria-modal="true"存在(现代浏览器showModal()会自动添加,但建议显式声明) - 关闭后:移除
open属性,清除inert,并将焦点还原至触发源(记录document.activeElement或用data-focus-return标记) - 监听
dialog的close和cancel事件(cancel对应 Esc 或 backdrop 点击),而非仅依赖click,保证辅助技术事件链完整
严格控制焦点流与模态遮罩
原生 <dialog></dialog> 调用 .showModal() 后,浏览器自动禁用背景交互并尝试聚焦第一个可聚焦子元素——但这个行为不可靠,必须手动接管。
支持完整键盘导航与快捷键
除 Tab 导航外,还需响应标准弹窗快捷键,并保持与系统级行为一致:
同步状态并暴露给辅助技术
屏幕阅读器需实时感知弹窗打开/关闭状态变化。仅靠 open 属性切换不够,需补充 ARIA 状态属性:










