前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 cubic-bezier 自定义缓动曲线
CSS动画与视觉

cubic-bezier 四个参数分别控制什么?

cubic-bezier(x1, y1, x2, y2) 定义一条三阶贝塞尔曲线,横轴是时间比例、纵轴是动画进度。两个 x 值必须在 0 到 1 之间,保证时间只往前走。y 值可以超出 0-1,产生「冲过头再回来」的弹性效果。

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

贝塞尔曲线的三个要素

  1. 起止锚点固定在 (0,0) 和 (1,1),分别代表动画的起点和终点
  2. 两个控制点(x1,y1) 和 (x2,y2) 决定曲线弯曲方向,也就是加速减速的节奏
  3. x 轴约束x 代表时间,必须单调递增,所以 x1 和 x2 被限制在 0-1

ease 并不是匀速的,它等价于 cubic-bezier(0.25, 0.1, 0.25, 1),前半段加速、后半段明显减速。很多人以为 ease 和 linear 差不多,实际差异肉眼可见。

核心回答

先记住这个答案

cubic-bezier(x1, y1, x2, y2) 用四个数字定义一条贝塞尔曲线。曲线的横轴代表时间进度(0 到 1),纵轴代表动画完成比例。起点 (0,0) 和终点 (1,1) 是固定的,你能控制的是中间两个控制点的位置。x1 和 x2 必须在 0 到 1 之间,因为时间不能倒流;y1 和 y2 没有这个限制,超出 0-1 就会出现「冲过头再弹回来」的效果。

  • 两个 x 值限制在 0 到 1 之间
  • y 值超出范围会产生回弹效果
  • ease 等关键字就是预设的贝塞尔值
  • Chrome DevTools 可以可视化调曲线

四个参数怎么影响动画节奏

想象一条从左下角到右上角的曲线。前半段曲线越陡,动画启动越猛;后半段曲线越平,动画收尾越慢。两个控制点就像两只手拽着曲线,把它往不同方向拉。

对比不同缓动的写法CSS
/* ease: 慢启动、快中段、慢收尾 */
.box-ease { transition: transform 0.4s cubic-bezier(0.25, 0.1, 0.25, 1); }

/* linear: 匀速,曲线就是一条直线 */
.box-linear { transition: transform 0.4s cubic-bezier(0, 0, 1, 1); }

/* ease-in-out: 两头慢、中间快 */
.box-in-out { transition: transform 0.4s cubic-bezier(0.42, 0, 0.58, 1); }

/* 自定义弹性:y2 超过 1,结尾会冲过终点再回来 */
.box-bounce { transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); }

ease、linear、ease-in、ease-out、ease-in-out 这五个关键字并不是独立的算法,它们就是五组固定的 cubic-bezier 值。写关键字和写对应的四个数字效果完全一样。

为什么 x 必须在 0 到 1 之间

x 轴代表时间进度。如果 x 允许超出 0-1,曲线就可能在某一段向左拐,意味着时间在倒流。浏览器无法在同一个时刻算出两个不同的进度值,所以规范要求 x1 和 x2 必须在 0 到 1 之间。写了超出范围的值,浏览器会忽略整条 transition 声明。

y 超出范围的效果CSS
/* y1 = 1.56 超过 1,动画开头会先冲过终点位置 */
.overshoot {
  transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
/* 鼠标悬停时元素会先放大到比目标值还大,再弹回来 */
.overshoot:hover {
  transform: scale(1.1);
}

y 超过 1 时,动画中间某一帧的属性值会超过目标值。比如目标是 scale(1.1),中间可能到 scale(1.15) 再弹回来。这就是 CSS 里不用 JavaScript 也能做弹性效果的原理。

怎么调出想要的曲线

Chrome DevTools 的 Styles 面板里,点击 transition 值前面的紫色曲线图标,会弹出一个可视化编辑器。拖动两个控制点就能实时预览效果,调好后直接复制 cubic-bezier(...) 值。这比靠猜数字高效得多。

除了贝塞尔曲线,CSS 还有 steps() 函数用来做逐帧动画,比如精灵图的帧切换。steps(5) 会把动画分成 5 步跳跃式完成,没有中间的平滑过渡。

回答前,多想一步

容易答错的地方

以为 ease 就是匀速
ease 是默认值,但它不是匀速。它等价于 cubic-bezier(0.25, 0.1, 0.25, 1),前段慢、中段快、尾段减速。匀速要用 linear。
以为 y 也不能超出 0-1
只有 x 有限制,y 没有。y 超出范围是做弹性动画的常见手法,完全合法。
试着用自己的话回答

面试官还会怎么问?

transition-timing-function 和 animation-timing-function 有区别吗?

写法完全一样,都接受关键字或 cubic-bezier()。区别在于 animation-timing-function 作用在每两个关键帧之间,而不是整段动画。比如一个 @keyframes 有三帧,缓动函数会分别应用在第一帧到第二帧、第二帧到第三帧。

steps() 和 cubic-bezier() 能混着用吗?

不能写在同一个值里,但同一个元素的不同属性可以分别指定。比如 transition: opacity 0.3s ease, background-image 0.3s steps(3) 是合法的。

怎么做一个先快后慢再弹一下的效果?

用 cubic-bezier 把 y2 设成大于 1 的值,比如 cubic-bezier(0.22, 0.61, 0.36, 1.2)。动画末尾会超过目标值再回弹。如果需要多次弹跳,cubic-bezier 做不到,要换成 @keyframes 手动写多个关键帧。

从一道题,走向一组知识

把知识连起来

动画与视觉

animation-direction 的 alternate 和 reverse 有什么区别?

掌握了缓动曲线之后,配合 animation-direction 的 alternate 可以做出自然的来回摆动效果。

动画与视觉

怎么让无限循环的动画在每两轮之间有一段停顿?

无限循环动画常搭配自定义缓动曲线,让每次循环的节奏不像匀速那样机械。

参考资料

  • <easing-function> CSS type

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

本题目录
  1. 先记住这个答案
  2. 四个参数怎么影响动画节奏
  3. 为什么 x 必须在 0 到 1 之间
  4. 怎么调出想要的曲线
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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