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

如何通过JavaScript正确实现CSS动画反向播放

问题根源

你的反向播放逻辑失效是两个逻辑问题导致的:

  • 执行顺序写反了:你先执行classList.toggle('animationToggler')再判断类是否存在。第二次点击触发时,toggle会先把绑定动画的animationToggler类直接删掉,元素上根本没有挂载animationTogglerMenu动画,此时设置animationDirection: reverse找不到作用的动画对象,自然不会生效。
  • 动画机制理解错了:只要把携带animation属性的类从元素上移除,浏览器会立刻终止动画,直接把元素状态重置为动画初始值,根本不会走反向播放的流程。
修复方案

不要反复增删绑定动画的类,直接把动画固定绑定在汉堡按钮元素上,通过切换动画方向、控制播放状态实现正反向旋转,完全匹配你要的交互效果:
首先修改CSS,把动画绑定到.hamburger类上,默认暂停、动画结束后保持最终状态,原来的.animationToggler类可以直接删除:

.hamburger {
  animation: animationTogglerMenu .8s ease forwards;
  animation-play-state: paused;
}

然后修改JS逻辑,点击时根据当前激活状态切换动画方向,重置播放进度后启动动画:

const menuToggler = document.querySelector('.toggler .hamburger');
menuToggler.addEventListener('click', function() {
  const isActive = this.classList.contains('active');
  // 未激活时正向播放旋转到720度,已激活时反向播放转回初始角度
  this.style.animationDirection = isActive ? 'reverse' : 'normal';
  // 重置动画进度到起点,保证每次点击动画都从头开始执行
  this.getAnimations()[0].currentTime = 0;
  this.style.animationPlayState = 'running';

  setTimeout(() => {
    this.classList.toggle('active');
    // 动画播放完成后暂停,避免页面重绘时动画意外触发
    this.style.animationPlayState = 'paused';
  }, 400)
});

这种写法比反复增删动画类稳定很多,不会出现动画不触发、状态跳变的问题,动画总时长保持原有的0.8s,延迟400ms切换菜单激活状态的交互逻辑完全没有改动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 05:01:02