淘宝分类导航核心是悬停时子菜单精准展开、父级高亮且不遮挡内容,需一级li设position: relative,子菜单用position: absolute; top: 100%; left: 0,并确保z-index层级合理、无transform干扰。
淘宝分类导航的核心不是“多级嵌套有多炫”,而是「鼠标悬停时子菜单精准展开 + 父级高亮 + 不遮挡内容」。用纯 HTML + CSS 就能实现,不需要 JS,但必须注意 position 层级、z-index 和触发时机这三点。
根本原因是父容器没设 position: relative,导致子级 position: absolute 脱离文档流后找不到定位参考点。
<li> 必须加 position: relative,否则内部的 .sub-menu 会相对于 <body> 定位.sub-menu 设 position: absolute; top: 100%; left: 0; 才能紧贴父项下方展开<li> 用了 float,又没清除浮动,可能导致高度塌陷,hover 区域变小甚至失效display: none + opacity: 0 双重隐藏——opacity: 0 仍响应 hover,容易误触淘宝二级栏里“女装 > 连衣裙/半身裙/衬衫”是横排的,靠的是 white-space: nowrap 和内联块布局,不是 flex。
<ul> 设 display: inline-block 或 display: flex,但注意:flex 在老浏览器(如 IE10)需加前缀<li> 设 display: inline-block; vertical-align: top;,再加 white-space: nowrap 防止文字折行width 是否固定、是否被外层 overflow: hidden 截断display: table-cell 模拟等宽分布,兼容性比 flex 更广淘宝每个一级分类后都有一个小三角 ▸,且和文字基线对齐;分类之间用 / 分隔——这些细节全靠 line-height、vertical-align 和伪元素控制。
立即学习“前端免费学习笔记(深入)”;
::after 生成,设 content: "▸"; font-size: 12px; vertical-align: middle;,避免撑高行高<li> 后面的 ::after 里,但最后一个 <li> 要用 :last-child::after { display: none; } 隐藏transition: background-color 0.2s,否则生硬;但别给 height 或 opacity 加 transition——会导致子菜单展开抖动visibility: hidden/visible,而不是只靠 opacity最易被忽略的是:所有悬停菜单都必须有明确的 z-index 值(比如 z-index: 100),且其父级容器不能有 transform 或 will-change,否则会创建新的层叠上下文,导致菜单被盖住——这点在加了轮播图或 sticky header 的页面里特别致命。