前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS keyframes 百分比 from to 对应关系
CSS动画与视觉

@keyframes 里 from 和 to 跟百分比选择器是什么关系?

from 就是 0%,to 就是 100%,两者只是别名。中间可以用任意百分比定义关键帧,浏览器会在相邻关键帧之间做插值。如果 @keyframes 里没写 0% 或 100%,浏览器会用元素自身的样式自动补全这一帧。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#动画与视觉#动画
先看核心答案读代码示例
理解线索

关键帧的三个要素

  1. 百分比选择器标记动画时间线上的位置,0% 是起点,100% 是终点
  2. 插值浏览器在两个关键帧之间按时间函数自动计算中间值
  3. 自动补全省略 0% 或 100% 时,浏览器用元素自身样式填充

插值只对可数值化的属性有效。display 这类不能插值的属性会在关键帧的时间点直接跳变,不会平滑过渡。

核心回答

先记住这个答案

@keyframes 规则里,from 是 0% 的别名,to 是 100% 的别名,写哪个都行。两个关键帧之间的样式由浏览器根据 animation-timing-function 自动插值计算。如果你只定义了中间的百分比而没写 0% 和 100%,浏览器会用元素自身的计算样式来补全起点和终点。

  • from 等于 0%,to 等于 100%
  • 相邻关键帧之间浏览器自动插值
  • 省略 0% 或 100% 时用元素当前样式补全
  • 同一百分比出现多次,后面的覆盖前面的

from 和 to 与百分比的等价关系

from 和 0% 完全等价,to 和 100% 完全等价,混着写也没问题。下面两种写法效果一样。

两种等价写法CSS
/* 写法一:用 from/to */
@keyframes slide {
  from { transform: translateX(0); }
  to   { transform: translateX(200px); }
}

/* 写法二:用百分比 */
@keyframes slide {
  0%   { transform: translateX(0); }
  100% { transform: translateX(200px); }
}

实际项目里,如果只有起点和终点两帧,用 from 和 to 更简洁。需要在中间加关键帧时,用百分比更直观,比如 0%、50%、100% 三帧的动画。

多个关键帧和插值机制

可以定义任意数量的百分比关键帧,浏览器在每两个相邻帧之间做平滑插值。

三段式弹跳效果CSS
@keyframes bounce {
  0%   { transform: translateY(0); }
  40%  { transform: translateY(-60px); }
  60%  { transform: translateY(-30px); }
  100% { transform: translateY(0); }
}

.ball {
  animation: bounce 1s ease-in-out infinite;
}

0% 到 40% 之间,translateY 从 0 平滑过渡到 -60px。40% 到 60% 之间,从 -60px 回到 -30px。60% 到 100% 再回到 0。每一段的过渡速度由 animation-timing-function 控制。 同一个百分比位置可以写多个属性,也可以用逗号把多个百分比合并到一个块里:0%, 100% { opacity: 1; } 表示起点和终点都是完全不透明。

省略起点或终点时的自动补全

如果 @keyframes 里没写 0% 或 100%,浏览器不会报错,而是用元素自身的计算样式来填充。这个特性有时很方便,有时会踩坑。

比如元素本身有 opacity: 1,你只写了 50% { opacity: 0; },浏览器会自动补全 0% { opacity: 1; } 和 100% { opacity: 1; }。动画效果就是先从不透明渐变到透明,再从透明渐变回不透明。

但如果元素的样式在动画过程中被其它规则改了,自动补全的值也会跟着变,动画效果就不稳定了。所以一般建议显式写出 0% 和 100%。

同名 @keyframes 和重复百分比的覆盖规则

如果样式表里出现了两个同名的 @keyframes 规则,后面的整个替换前面的,不是合并。

在同一个 @keyframes 里,同一个百分比出现多次的话,后面的声明覆盖前面的。这和普通 CSS 的层叠规则一致。

后定义的关键帧覆盖前面的CSS
@keyframes fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* 这个会完全替换上面那个 */
@keyframes fade {
  from { opacity: 0.5; }
  to   { opacity: 1; }
}

引入第三方动画库时容易遇到这个问题。如果你定义的 @keyframes 和库里的同名,一个会覆盖另一个,动画就不对了。给自己的关键帧加命名前缀可以避免冲突。

回答前,多想一步

容易答错的地方

以为省略 0% 动画就从当前位置开始
省略 0% 时浏览器确实用元素当前样式补全,但「当前样式」是计算后的值,不一定是你直觉上想的值。如果元素的样式受到其它动画、伪类或媒体查询的影响,补全的值可能不是预期的。显式写出 0% 更安全。
以为百分比可以超出 0~100 的范围
@keyframes 里的百分比只能在 0% 到 100% 之间,负数或超过 100% 的值会被忽略。这一点和 cubic-bezier 的控制点不同,贝塞尔曲线的 y 值可以超出 0~1 范围来实现弹性效果。
试着用自己的话回答

面试官还会怎么问?

@keyframes 里能写 !important 吗?

不能。@keyframes 里的声明会忽略 !important,写了也没效果。动画本身在层叠中已经有很高的优先级,不需要也不支持 !important。

只有一帧的 @keyframes 会怎么样?

如果只写了 to 没写 from,浏览器用元素当前样式补全 from,动画正常播放。如果只写了 from 没写 to,同理补全 to。如果整个 @keyframes 只有一个百分比,比如只有 50%,浏览器会补全 0% 和 100%,动画也能播。

关键帧里写 animation 属性会怎样?

@keyframes 里不能设置 animation-* 系列属性,写了会被忽略。关键帧只负责描述样式变化,动画的播放行为(时长、延迟、方向等)由元素上的 animation 属性控制。

从一道题,走向一组知识

把知识连起来

动画与视觉

animation-play-state 暂停和负 animation-delay 跳过有什么区别?

关键帧决定动画「播什么」,而 animation-play-state 决定「播不播」,暂停时动画冻结在当前插值位置。

动画与视觉

怎么用纯 CSS 让动画跟着滚动条走,而不是按时间播放?

滚动驱动动画把页面滚动位置映射到关键帧百分比,理解百分比的含义后更容易上手。

参考资料

  • CSS:动画与视觉参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. from 和 to 与百分比的等价关系
  3. 多个关键帧和插值机制
  4. 省略起点或终点时的自动补全
  5. 同名 @keyframes 和重复百分比的覆盖规则
  6. 容易答错的地方
  7. 面试官还会怎么问
  8. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑