二级横向下拉菜单需用嵌套结构,父设position: relative,子用position: absolute + top: 100%对齐,避免空隙导致hover中断;移动端须用js+aria支持touch和键盘导航。

二级横向下拉菜单在实际项目里经常要手写,不是所有场景都适合用现成框架——尤其当你要控制样式、兼容性或 SEO 时,原生 HTML + CSS 就够用,关键得避开几个典型坑。
HTML 结构怎么写才不卡住下拉
下拉菜单本质是嵌套关系,<ul></ul> 套 <ul></ul> 是最稳妥的写法。父级 <li> 必须是相对定位容器,否则子菜单会脱标;子级 <ul></ul> 要绝对定位并设 top: 100% 对齐父项底部。
- 别用
<div> 包菜单项——语义错、键盘导航失效、屏幕阅读器不识别 <li>每个一级 <code><li>必须包裹<a></a>和二级<ul></ul>,不能把<ul></ul>放到<li>外面 - 二级
<ul></ul>默认display: none,hover 时改display: block或用visibility+opacity实现过渡(后者更稳) - 给一级
<li>设position: relative,二级<ul></ul>设position: absolute; top: 100%; left: 0 - 确保二级
<ul></ul>的top值刚好接住一级<li>底边,不要留白;必要时加margin-top: -1px补缝 - 避免用
display: none+display: block切换——会导致重排,过渡不自然;改用opacity: 0+visibility: hidden配合transition - 给一级
<a></a>加role="button"和aria-expanded="false",点击时切换状态和aria-expanded值 - 用
aria-haspopup="true"标明该链接有弹出菜单 - 移动端默认收起,用
max-height: 0+overflow: hidden动画展开,比display更易控制过渡 - 别忘了
touchstart事件监听——iOS Safari 对click有 300ms 延迟
CSS hover 触发为啥点不动或闪退
这是最常遇到的问题:鼠标一移就消失,或者点不到二级项。根本原因是 DOM 层级间隙断开了 hover 路径——二级菜单和一级菜单之间有空隙,鼠标经过空隙时 hover 状态中断。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
移动端适配不能只靠 display:none
单纯用 @media 把二级菜单设为 display: none 在手机上不管用:触屏没有 hover,用户点不开。必须加 JS 控制展开/收起逻辑,且要兼顾可访问性。
真正麻烦的不是写出来,而是让键盘 Tab 可达、屏幕阅读器能读、小屏点得稳、IE11 还不崩——这些细节堆在一起,才决定它到底能不能上线。










