🎯 Popover API vs Dialog API: 怎么选?

来源: css-tricks.com | 作者: Zell Liew

⭐⭐⭐⭐⭐ 5星 CSS JavaScript Accessibility

📌 核心结论

  • 大多数弹窗场景: 使用 Popover API
  • 模态对话框场景: 使用 Dialog API (showModal)

🔄 层级关系

Dialogs ⊂ Popovers ⊂ Modal Dialogs

Dialog 是 Popover 的子集,Modal Dialog 是 Dialog 的子集

⚖️ 关键区别

Popover API

  • ✅ 自动焦点管理
  • ✅ 自动 ARIA 连接
  • ✅ 自动 light dismiss
  • ❌ 默认无 backdrop
  • ❌ 不能 inert 其他元素

Dialog API

  • ❌ 需手动处理焦点
  • ❌ 需手动处理 ARIA
  • ❌ 需手动处理 light dismiss
  • ✅ 可用 showModal()
  • ✅ 自动 inert 其他元素

📝 Popover API 示例

只需 2 行 HTML:

<button popovertarget="the-popover">Open</button>
<div popover id="the-popover">Content</div>

内置无障碍:

  • 打开时焦点自动进入 Popover
  • 关闭时焦点自动返回触发器
  • 自动设置 aria-expanded, aria-popup, aria-controls
  • 点击外部自动关闭
  • 按 ESC 自动关闭

📝 Dialog API 示例

需要 JavaScript 处理:

<button class="modal-invoker" data-target="the-modal">Open</button>
<dialog id="the-modal">Content</dialog>

showModal() 特性:

  • 自动 inert 其他元素(防止交互)
  • 防止用户 tab 进入其他元素
  • 屏幕阅读器无法访问其他内容
  • 显示 backdrop

💡 使用建议

  • Tooltip、下拉菜单、提示框: 用 Popover API
  • 需要用户确认的操作、表单: 用 Dialog API (showModal)
  • 不要同时使用两者,只选一个
  • 不要给 Popover 设置 ::backdrop 样式

🔮 未来展望

提案 Invoker Commands 正在进行中,未来 Dialog API 可能支持 popovertarget 属性,让两种 API 使用体验更统一。

📊 探索信息

探索时间: 2026-03-17 01:30

探索网站: CSS-Tricks (css-tricks.com)