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

如何用秒数而非百分比定义CSS3 @keyframes动画?

用秒数定义CSS @keyframes的实用技巧

嘿,这个需求我太有共鸣了!每次用百分比写@keyframes都得掰着手指头算时间节点,要是能直接用秒数定义简直爽翻。刚好有几个实用技巧可以解决这个问题,给你唠唠:

1. 简单粗暴的100秒基准法(你提到的技巧扩展)

这个方法的核心思路是把动画总时长设为100秒,这样动画进度的1%就刚好对应1秒,时间节点直接用秒数转成百分比就行,完全不用计算。比如你说的每3秒一次的彩虹循环,就可以这么写:

div {
  width: 100px;
  height: 100px;
  /* 总时长设为100秒,1% = 1秒 */
  animation: rainbow 100s infinite linear;
}

@keyframes rainbow {
  0% { background-color: red; }
  3% { background-color: orange; } /* 第3秒切换 */
  6% { background-color: yellow; } /* 第6秒切换 */
  9% { background-color: green; } /* 第9秒切换 */
  12% { background-color: blue; }
  15% { background-color: indigo; }
  18% { background-color: violet; }
  100% { background-color: red; } /* 回到初始色,完成循环 */
}

优点是零成本上手,写的时候完全不用动脑子;缺点是总时长固定在100秒,如果要做短时长动画,得按比例换算百分比(比如总时长30秒的话,1秒≈3.333%)。

2. 灵活可控的CSS变量计算法

如果需要自定义动画总时长,用CSS变量+calc()的组合可以完美解决。先定义总时长和秒转百分比的计算规则,后续直接用秒数写时间节点就行:

:root {
  --total-duration: 18s; /* 自定义动画总时长 */
  /* 计算1秒对应的百分比:100% ÷ 总时长 */
  --sec-to-percent: calc(100% / var(--total-duration));
}

div {
  width: 100px;
  height: 100px;
  animation: rainbow var(--total-duration) infinite linear;
}

@keyframes rainbow {
  0% { background-color: red; }
  calc(3 * var(--sec-to-percent)) { background-color: orange; }
  calc(6 * var(--sec-to-percent)) { background-color: yellow; }
  calc(9 * var(--sec-to-percent)) { background-color: green; }
  calc(12 * var(--sec-to-percent)) { background-color: blue; }
  calc(15 * var(--sec-to-percent)) { background-color: indigo; }
  calc(18 * var(--sec-to-percent)) { background-color: violet; }
  100% { background-color: red; }
}

想改总时长?只需要调整--total-duration的值就行,所有时间节点会自动适配,现代浏览器都支持这种写法。

3. 预处理器自动转换法(适合项目开发)

如果你的项目用了Sass/Less这类预处理器,还可以写个小函数自动把秒数转成百分比,写代码时直接用秒数定义,编译后自动生成百分比:

// Sass函数:秒数转百分比
@function sec-to-percent($sec, $total-duration) {
  return ($sec / $total-duration) * 100%;
}

// 定义动画总时长
$total-duration: 18s;

div {
  width: 100px;
  height: 100px;
  animation: rainbow $total-duration infinite linear;
}

@keyframes rainbow {
  0% { background-color: red; }
  #{sec-to-percent(3, $total-duration)} { background-color: orange; }
  #{sec-to-percent(6, $total-duration)} { background-color: yellow; }
  #{sec-to-percent(9, $total-duration)} { background-color: green; }
  #{sec-to-percent(12, $total-duration)} { background-color: blue; }
  #{sec-to-percent(15, $total-duration)} { background-color: indigo; }
  #{sec-to-percent(18, $total-duration)} { background-color: violet; }
  100% { background-color: red; }
}

这个方法最适合团队项目,代码可读性拉满,后期维护也方便。

总结一下

  • 快速写小动画:选100秒基准法,省事!
  • 需要灵活调整时长:选CSS变量计算法,不用重复改百分比!
  • 项目开发:选预处理器函数法,代码更优雅!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:42:41