You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GSAP中showMenuList菜单动画无法反向播放的问题如何解决

GSAP粉色菜单反向播放失效修复

核心错误点

  • 动画实例重复创建:showMenuList每次点击触发时都会新建一个GSAP时间线实例,之前的动画状态完全没有被保存,调用reverse()时操作的是刚创建的空实例,没有任何效果。
  • 配置属性拼写错误:GSAP时间线的暂停配置属性为paused,原代码写为pause缺少尾字母d,配置不生效。
  • 执行顺序错误:原代码先调用play()/reverse()控制播放,之后才往时间线里添加动画补间,控制指令执行时时间线还是空的,后续添加的动画不会响应之前的控制逻辑。
  • 冗余写法:GSAP 3.x版本不需要用css: {}包裹CSS动画属性,直接写属性即可被自动识别。

修正后完整JS代码

const menuToggler = document.querySelector(".toggler");
const menuTogglerHamburger = document.querySelector(".toggler .hamburger");

// 在外层作用域初始化时间线,全局仅创建一次
const showMenuTl = gsap.timeline({ paused: true });
// 提前配置好所有动画补间
showMenuTl
  .to(".nav-menu", 0.8, { top: "50%" })
  .to(".nav-menu", 0.4, { width: "140vw", height: "140vw" });

menuToggler.addEventListener("click", function () {
  // 处理汉堡按钮旋转动画
  if (menuTogglerHamburger.classList.contains("animationToggler")) {
    menuTogglerHamburger.classList.remove("animationToggler");
    void menuTogglerHamburger.offsetWidth;
    menuTogglerHamburger.classList.add("animationToggler");
  }
  menuTogglerHamburger.classList.add("animationToggler");

  // 切换菜单显示状态
  menuToggler.classList.toggle("show");
  // 直接复用已创建的时间线实例控制播放方向
  menuToggler.classList.contains("show")
    ? showMenuTl.play()
    : showMenuTl.reverse();

  setTimeout(() => {
    // 处理汉堡按钮转叉号动画
    menuTogglerHamburger.classList.toggle("active");
  }, 200);
});

补充说明

原代码的CSS和HTML部分不需要做任何修改,替换上述JS代码后即可实现菜单展开/收起的正向、反向动画效果。如果需要调整动画速度、缓动效果,直接修改时间线里对应补间的参数即可。

内容的提问来源于stack exchange,提问作者karamba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:31:11