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

CSS steps()实现精灵图动画异常问题求助

问题根源与解决方案

核心原因:steps(5)的工作逻辑与动画终点设置不匹配

你遇到的问题是对CSS steps()函数的阶段划分逻辑理解有偏差:

  • 默认的steps(5)等价于steps(5, jump-end),它会把动画时长分割为5个等长的静止阶段,每个阶段结束时跳转到下一帧。
  • 当你把动画关键帧设为0%到100%时,0%对应第1帧,20%对应第2帧,...,80%对应第5帧,100%的位置会直接跳回0%(第1帧)。这就导致第5帧仅在80%到100%的时间段显示,但循环时会立刻跳回起点,视觉上根本捕捉不到,Firefox动画检查器里也不会显示100%的停留(因为它是跳转点而非静止阶段)。
  • 你设为125%能生效,本质是把动画范围拉长,让100%刚好落在第5帧的静止阶段里,但这属于取巧的临时办法。

正确的两种解决方式

方式1:调整steps()的跳转时机

使用steps(5, jump-start),它会把跳转动作放在每个阶段的开始而非结束:

.hamster {
  width: 单帧宽度;
  height: 单帧高度;
  background: url(仓鼠精灵图) no-repeat;
  animation: run 1s steps(5, jump-start) infinite;
}

@keyframes run {
  0% { background-position: 0 0; }
  100% { background-position: -100% 0; }
}
  • 逻辑:0%时立刻跳转到第2帧,20%跳转到第3帧...80%跳转到第5帧并保持到100%,循环时从第5帧跳回第1帧,这样第5帧有完整的显示时长。

方式2:匹配帧数量与动画范围(更推荐)

对于5帧的精灵图,我们只需要4次跳转就能从第1帧切换到第5帧,所以用steps(4),同时把动画终点设为显示第5帧的位置(而非100%):

.hamster {
  width: 单帧宽度;
  height: 单帧高度;
  background: url(仓鼠精灵图) no-repeat;
  /* 精灵图总宽度是单帧的5倍,所以背景位置设为-400%显示第5帧 */
  animation: run 1s steps(4) infinite;
}

@keyframes run {
  0% { background-position: 0 0; }
  100% { background-position: -400% 0; }
}
  • 逻辑:steps(4)创建4个静止阶段,每个阶段对应一帧,从0%(第1帧)到100%(第5帧)刚好完成4次跳转,每帧都有均等的显示时间,循环时从第5帧平滑跳回第1帧。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:07:20