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

纯CSS动画切换类时无法正常反向播放问题求助

问题解决:点击切换类反向播放CSS动画无过渡效果

问题根源

元素初始动画执行完毕后,通过animation-fill-mode: forwards停在了动画的最终帧(绿色背景)。此时直接添加反向动画类,浏览器会判定该动画已经完成过,不会重新触发动画流程,直接跳到反向动画的最终帧(红色背景),导致看不到过渡效果。

解决方案

切换类时,先强制重置元素的动画状态,让浏览器重新识别动画触发:

修改后的代码

<div>
  <button>click</button>
  <span class="initial-animate"></span>
</div>

<style>
span {
  display: block;
  width: 100px;
  height: 100px;
}

@keyframes a {
  from { background: red; }
  to { background: lime; }
}

.initial-animate {
  animation: a 1s forwards;
  animation-delay: 3s;
}

.opened {
  animation: a 1s reverse forwards;
  animation-delay: 3s;
}
</style>

<script>
$("button").click(function(){
  const $span = $("span");
  // 先移除所有动画类,重置状态
  $span.removeClass("initial-animate opened");
  // 触发浏览器重绘,确保后续类变更能触发动画
  void $span[0].offsetWidth;
  // 根据之前状态切换目标类
  const isInitial = !$span.hasClass("initial-animate");
  $span.addClass(isInitial ? "initial-animate" : "opened");
});
</script>

关键步骤说明

  • 重置动画类:移除所有和动画相关的类,让元素回到未执行动画的初始红色背景状态。
  • 强制重绘:void $span[0].offsetWidth 会迫使浏览器重新计算元素布局,避免类变更被浏览器优化跳过动画触发。
  • 重新添加类:根据元素之前的状态添加对应动画类,此时浏览器会完整执行动画流程,包括设置的3秒延迟效果。

另一种简化方案(动态修改动画属性)

如果不想频繁切换类,也可以直接修改元素的动画属性实现双向切换:

<div>
  <button>click</button>
  <span></span>
</div>

<style>
span {
  display: block;
  width: 100px;
  height: 100px;
  animation: a 1s forwards;
  animation-delay: 3s;
}

@keyframes a {
  from { background: red; }
  to { background: lime; }
}
</style>

<script>
$("button").click(function(){
  const $span = $("span");
  const currentDir = $span.css("animation-direction");
  
  // 重置元素到初始状态
  $span.css({
    animation: "none",
    background: "red"
  });
  void $span[0].offsetWidth;
  
  // 切换动画方向并重新触发
  $span.css({
    animation: `a 1s ${currentDir === "normal" ? "reverse" : ""} forwards`,
    animationDelay: "3s"
  });
});
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:48:32