火次果
火次果

暂无菜单项

首页/文章/技术文章/web前端/HTML5/
打开 MD 链接

导航展开收起动画不触发:挂错了对象

发布于 1周前
1

点击收起时没有动画,展开却有。一类原因是收起操作直接把元素隐藏,动画还没播完元素就消失;另一类原因是动画挂在父容器上,而实际位移发生在子列表。

屏幕上显示的网页开发代码
动画对象与状态切换时机是两个关键点

结构

<nav class='mobile-nav'>
  <ul class='nav-list'>...</ul>
</nav>

动画应作用在子列表上。挂在导航容器上时,容器高度由内容决定,位移看不出变化。

写法

.nav-list { transform: translateY(-8px); opacity: 0; }
.mobile-nav.is-open .nav-list { animation: slide-in 240ms ease forwards; }
.mobile-nav.is-closing .nav-list { animation: slide-out 200ms ease forwards; }
@keyframes slide-in { to { transform: none; opacity: 1; } }
@keyframes slide-out { to { transform: translateY(-8px); opacity: 0; } }

收起为什么看不到

直接移除展开类会立刻回到初始态,收起动画没有机会播放。做法是增加一个收起状态类,等动画结束事件触发后再移除。

nav.addEventListener('animationend', () => {
  if (nav.classList.contains('is-closing')) {
    nav.classList.remove('is-closing', 'is-open');
  }
});

注意点

  • 两个方向的动画分别定义,不要用同一组关键帧反向播放,时长曲线对不上。
  • 初始状态写在基础选择器里,避免动画结束后样式跳回。
  • 位移用 transform,不对 height 做动画,后者会触发布局计算。
  • 尊重系统的减少动效偏好,用媒体查询关闭动画。

常见问题(FAQ)

展开有动画、收起没有?
收起时元素被立即隐藏,需要单独的收起状态类,并在动画结束后再移除。
动画应该挂在哪一层?
挂在实际发生位移的子列表上,父容器的高度由内容决定。
动画结束后样式跳回?
用 forwards 保留结束态,并把初始状态写在基础选择器里。
展开时页面抖动?
用 transform 做位移,避免对 height 做动画触发重排。
需要适配减少动效设置吗?
需要,用 prefers-reduced-motion 媒体查询关闭动画。
animation属性CSS动画transform动画收起动画移动端导航
支持作者
如果这篇内容对你有帮助,可以请作者喝杯咖啡
0 点赞
0 收藏
分享
0 讨论
反馈
0 / 600
细中粗
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
所有的成功,都源自一个勇敢的开始
创作
社区
购物
会员
近期热门

暂无数据

火次果
火次果
首页
资迅中心
小店
AI导航
社区
所有的成功,都源自一个勇敢的开始
不辜负每一个勇敢的开始
关于FAQ协议
火次果 © 2026鲁ICP备2025164830号-1