必须重写 .navbar-collapse.show 的 transition 声明并同步调大 max-height 终点值才能改快或改慢移动端 Navbar 折叠菜单展开速度,因动画纯由 CSS max-height 过渡实现,且 transition 与 max-height 必须同步修改才生效。

改快或改慢移动端 Navbar 折叠菜单的展开速度,只有一条路:重写 .navbar-collapse.show 的 transition 声明,且必须同步调大 max-height 终点值。其他所有尝试——比如改 data-bs-* 属性、调 JS 参数、只覆盖基础态类——全无效。
为什么必须锁定 .navbar-collapse.show 这个选择器
Navbar 折叠动画不是靠 JavaScript 控制时长,也不是靠 data-bs-toggle 触发的 JS 逻辑在管速度。它纯靠 CSS 的 max-height 过渡实现:收起时是 max-height: 0,展开时靠 .show 类切换到一个更大的 max-height 值。动画是否生效、快慢如何,全取决于这个类上的 transition 声明。
- 只改
.navbar-collapse基础态没用,它收起时压根不参与过渡 - 只加
!important到transition-duration行内样式也不行,CSS transition 是整条声明(属性+时长+曲线),单改一部分会被忽略 - 自定义 CSS 文件必须放在 Bootstrap CSS 之后加载,否则被默认规则压制
transition 和 max-height 必须同步改,缺一不可
把动画从 0.35s 改成 0.6s 后菜单只显示前两行?这不是动画出错,是 max-height 终点值没跟着变大。浏览器对慢速过渡更严格:它会按你写的 max-height 值精确渲染高度,而 Bootstrap 默认的终点值(如 300px 或 1000px)是固定估算的,不随动画时长动态调整。
- 推荐写法:
.navbar-collapse.show { max-height: 120vh !important; transition: max-height 0.6s ease-in-out !important; } - 不能用
max-height: none——它不参与 transition,动画会立即跳到展开态 - 避免
max-height: 100%或fit-content——这些值无法作为 transition 的合法终点,浏览器会退回到 0 - 菜单项 ≤5 个时可写死像素值,例如
max-height: 240px,更轻量,减少低端机重排卡顿
下拉菜单(.dropdown)让动画“跳一下”怎么办
折叠菜单里嵌了 .dropdown,点开二级菜单时出现“先展开、再突然撑高”或“动画中途跳一下”,根本原因是 .dropdown-menu 默认 position: absolute,不占 .navbar-collapse 高度,但它的父容器(如 .nav-item)若有 padding-block 或 min-height,视觉上“变高”却没被 max-height 涵盖。
-
.nav-item去掉min-height,改用padding-block: 0.5rem控制间距 - 在
.navbar-collapse.show上加padding-bottom: 1rem预留空间,而非依赖自动撑开 - 真要让下拉菜单随文档流撑高:
.navbar-collapse.show .dropdown-menu { position: static !important; } - 排查是否在
@media里误写了.dropdown-menu { top: 100% }——移动端折叠态不需要这个
最常被忽略的一点:缓动函数别碰 linear,它在小屏触控场景下手感生硬;cubic-bezier(0.25, 0.46, 0.45, 0.94) 比 ease-in-out 更自然,能避开“弹跳感”。


















