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

Animation-Iteration-Count与animation-fill-mode冲突问题求助

解决动画迭代后位移不累积的问题

你的问题核心在于CSS动画默认每次迭代都会替换之前的变换状态,而非叠加,所以即便设置了forwards,也只会保留最后一次迭代的100px位移,而非两次的累加结果。下面提供两种无需JavaScript的纯CSS解决方案,均支持给不同元素设置不同迭代次数:

方法一:使用animation-composition实现变换叠加

这个属性可以控制动画的合成方式,将默认的replace(替换)改为add(叠加),让每次迭代的位移效果累积:

div {
  width: 100px;
  height: 100px;
  background-color: red;
  --iterations: 2; /* 修改此值可调整重复次数,不同元素可单独设置 */
  --step-move: 100px; /* 每次迭代的移动距离 */
  animation: move 2s var(--iterations) forwards;
  animation-composition: add; /* 关键:让每次动画的transform叠加生效 */
}

@keyframes move {
  to {
    transform: translateX(var(--step-move));
  }
}

原理:第一次迭代后元素位移100px,第二次迭代会在这个基础上再叠加100px,最终停在200px位置,forwards会保留该最终状态。主流浏览器(Chrome、Firefox、Edge)均已支持该属性。

方法二:使用steps()分步动画(兼容性更优)

若需兼容更早版本的浏览器,可通过steps()时间函数配合calc()计算总位移,将动画拆分为多个分步移动:

div {
  width: 100px;
  height: 100px;
  background-color: red;
  --iterations: 2; /* 重复次数 */
  --step-move: 100px; /* 每次移动距离 */
  animation: move 2s forwards;
  animation-timing-function: steps(var(--iterations), end); /* 按次数拆分动画阶段 */
}

@keyframes move {
  to {
    transform: translateX(calc(var(--step-move) * var(--iterations)));
  }
}

原理:steps(2, end)会把2秒的动画拆分为两个1秒的阶段,每个阶段直接跳转到对应比例的位移位置,最终停在总位移200px处,效果和分步移动完全一致。

两种方法都可通过修改自定义属性--iterations和--step-move,快速给不同元素配置不同的动画参数,全程无需JavaScript。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:40:15