用 max-height + overflow: hidden + transition 实现折叠动画更平滑兼容,因 height: auto 无法插值导致跳变;需设足够但不过大的 max-height 值(如 260px),配 overflow: hidden;媒体查询推荐 min-width 且只覆盖关键样式;JS 切换时注意 body 滚动、触控区域和 focus 状态。
直接用 max-height + overflow: hidden + transition 实现折叠动画,比切 display 更平滑、兼容性更好,也更容易控制过渡节奏。
浏览器无法对 height: auto 进行动画插值——它不是确定数值,transition 会直接跳变。常见错误是写成:
.nav-menu { transition: height 0.3s; }.nav-menu.open { height: auto; }
结果就是:收起时瞬间消失,展开时无动画。必须换思路。
max-height 是可动画的数值属性,设为 0 和一个足够大的固定值(如 300px),就能触发渐变效果max-height: 260px 比设 9999px 更自然overflow: hidden,否则内容会在过渡过程中溢出推荐统一用 @media (min-width: 768px) 控制桌面端样式,而不是反着写 @media (max-width: 767px)。原因很实际:
max-width 媒体查询时可能触发两次重排,导致布局抖动768px(平板竖屏)比 600px 更稳妥——Pixel 4、iPhone 12 等设备宽度接近 390–414px,不会误判为桌面flex-direction、display、margin-left: auto 就够了用 classList.toggle('open') 看似简单,但几个边界情况常被忽略:
document.body.style.overflow = 'hidden' 防止背景滚动;关闭时必须设回空字符串 '',而不是 'auto',否则 iOS 可能强制重绘并卡顿44px × 44px,小屏下用 padding 扩展,别只靠字体大小撑空间click 事件里调用 event.preventDefault()——它会干掉按钮的焦点状态,影响键盘用户和屏幕阅读器position: fixed 的菜单层,加 touch-action: none,否则某些安卓机型拖拽时底层页面仍会滚动真正难的不是写出第一版折叠菜单,而是让 max-height 值刚好够用、@media 不在 Safari 失效、JS 切换时不锁死滚动——这些地方没调试到位,用户一上手就卡住。