下拉菜单与弹出层模式
使用 CSS 定位和 Popover API 创建可访问的下拉菜单和弹出层。
下拉菜单与弹出层模式 是 CoddyKit 上的免费 CSS Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 CSS Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 CSS Academy 课程共包含 4 节课。
弹出层应用程序接口
HTML 弹出层应用程序接口(Chrome 114 及更高版本,已获得广泛支持)提供声明式的显示与隐藏行为:在目标元素上使用 popover 属性,在触发按钮上使用 popovertarget 属性。基本的打开和关闭无需 JavaScript,包括点按外部关闭以及 Esc 键处理。
设置弹出层样式
请使用 [popover] 或 :popover-open 选择弹出层元素。::backdrop 伪元素可用于使背景变暗。弹出层和对话框一样会渲染在顶层,因此不会出现层叠层级问题。
使用锚点定位设置下拉菜单位置
CSS 锚点定位(Chrome 125 及更高版本)可以在无需 JavaScript 的情况下,将弹出层定位在触发元素附近:在触发元素上设置 anchor-name: --btn,在弹出层上设置 position-anchor: --btn,然后使用 top: anchor(bottom); left: anchor(left) 将其对齐到触发元素下方。
使用绝对定位的回退方案
如果没有锚点定位,请使用经过定位的父级包装器:在容器上设置 position: relative,在下拉菜单上设置 position: absolute; top: 100%; left: 0。这种方式具有跨浏览器兼容性,但要求触发元素和下拉菜单在经过定位的容器中作为同级元素存在。
下拉菜单 CSS
请将下拉列表设置为 position: absolute; background: var(--color-surface); box-shadow: var(--shadow-md); border-radius: var(--radius-md); padding: var(--spacing-1) 0; min-width: 200px。菜单项使用内边距、悬停背景和全宽显示。
动画
请使用 @starting-style 制作弹出层打开动画,并使用 transition-behavior: allow-discrete 为 display 属性的变化添加动画。这样即可根据弹出层的打开或关闭状态,实现纯 CSS 的进入和退出动画。
键盘可访问性
下拉菜单必须支持键盘操作:使用方向键浏览菜单项,使用 Enter 或空格键激活获得焦点的项目,使用 Esc 键关闭菜单并将焦点返回触发元素。弹出层应用程序接口会自动处理 Esc 键;方向键导航则需要通过 JavaScript 处理事件。
自定义下拉菜单的 ARIA
对于自定义下拉菜单(不使用弹出层应用程序接口),请在触发元素上添加 aria-haspopup="listbox" 和 aria-expanded,在列表上添加 role="listbox",并在每个项目上添加 role="option" 和 aria-selected。屏幕阅读器会朗读展开状态和项目数量。
溢出与视口碰撞
定位在触发元素下方的下拉菜单可能会在视口底部溢出。请使用 IntersectionObserver 或 getBoundingClientRect 检测这种情况,并将下拉菜单翻转到触发元素上方。CSS 锚点定位可以通过 position-try-fallbacks 处理此问题。
多级下拉菜单
嵌套下拉菜单(子菜单)会增加复杂性。请将子菜单定位在父级项目的右侧。请在鼠标移出后、隐藏菜单前增加延迟(使用 CSS 过渡延迟或 JS 超时机制),以防止子菜单在鼠标沿对角线移动时关闭。
触摸设备注意事项
由悬停触发的下拉菜单在触摸设备上会失效,因为触摸设备没有悬停状态。请统一使用点击或点按触发器。通过弹出层应用程序接口的点按外部关闭功能,或通过关闭打开下拉菜单的文档点击监听器,都可以实现点按外部关闭。
知识检查
弹出层应用程序接口会自动提供哪些过去需要自定义 JavaScript 才能实现的功能?
总结
弹出层应用程序接口与 CSS 锚点定位结合后,可以实现声明式、尽量少用 JavaScript 的下拉菜单和弹出层模式。为了获得更广泛的浏览器支持,经过定位的容器模式也能可靠工作。键盘可访问性、ARIA 属性、视口碰撞处理和触摸设备支持共同构成了适用于生产环境的下拉菜单组件。
常见问题解答
「下拉菜单与弹出层模式」课时是免费的吗?
是的 — 「下拉菜单与弹出层模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 CSS Academy 课程的其余内容,请升级到 CoddyKit PRO。 CSS Academy 课程共包含 4 节课。
「下拉菜单与弹出层模式」这节课中我会学到什么?
使用 CSS 定位和 Popover API 创建可访问的下拉菜单和弹出层。 你通过在浏览器中直接运行的动手代码来练习 CSS Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 CSS Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 CSS Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「下拉菜单与弹出层模式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 CSS Academy 课中编写并运行代码吗?
能。每节 CSS Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。