前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库CSS cubic-bezier 自定义缓动曲线
CSCSS动画与视觉

如何在 CSS 中自定义 transition 或 animation 的速度曲线?cubic-bezier 的关键点数量有什么限制?

CSS 中通过 cubic-bezier(x1, y1, x2, y2) 自定义速度曲线,关键点数量固定为两个控制点(共四个坐标参数),其中 x 坐标必须在 0 到 1 之间。

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

理解贝塞尔控制点

  1. 控制点坐标决定曲线形状,影响加速减速
  2. x 范围限定x ∈ [0,1],保证时间单调
  3. y 可超越y 可小于0或大于1造成过冲

关键字 ease 等均有等价的 cubic-bezier() 曲线,可相互转换

核心回答

先记住这个答案

自定义速度曲线使用 cubic-bezier() 函数,接受四个参数表示两个控制点 (x1, y1, x2, y2)。曲线的输入是时间从 0 到 1,输出是进度从 0 到 1,控制点的 y 值可超出 [0,1] 以产生回弹效果;但 x 必须在 [0,1] 内以保持时间单调性,y 没有硬性限制,但过大的偏移可能导致进度越界并被实际属性值域截断。

  • cubic-bezier 有 2 个控制点共 4 参数
  • x 坐标必须在 0~1 之间
  • y 坐标可超出 0~1 产生回弹

贝塞尔曲线参数如何映射速度

cubic-bezier(x1,y1,x2,y2) 定义一条从 (0,0) 到 (1,1) 的三次贝塞尔曲线,其中 (x1,y1) 和 (x2,y2) 是两个控制点。动画时间从 0→1 映射到进度 0→1,曲线横轴是时间百分比,纵轴是属性完成度。曲线越陡,表示该时段进度变化快,即速度快。

x 坐标决定控制点沿时间轴的位置,x 超出 [0,1] 会使函数无效,时间映射失去单调性,因此 x 必须在区间内。y 值则代表“控制点在该时刻的速度倾向”,y>1 或 y<0 会使曲线在终点前超过最终值或低于初始值,形成回弹/过冲效果。四个参数即两个控制点共四个数值,不可增减。

制作有轻微回弹的弹跳按钮

一个弹跳按钮要求落下时超出目标略有回弹。需求:从 0 到 100% 移动,希望先快后慢,到终点前超过 100% 再回落到 100%?实际要过冲。输入:transition: transform 0.5s,使用 cubic-bezier(0.5, 1.5, 0.5, 1)。这里有 y1=1.5>1,使得曲线向上凸起,在接近终点时超过 1(即超出目标),随后回落。

为何这样选?四个参数中,x1=0.5、x2=0.5 表示两个控制点时间都在中间,y1=1.5 使开始阶段进度上升较快并有过冲,y2=1 则稳定在终点。结果运动有轻微回弹但不发生反向,因为 y2 不过低。若 y 设置过大如 4,会强烈过冲造成抖动,因此要小范围超出。

容易失效的边界条件

如果 x 坐标超出 [0,1],该 transition-timing-function 声明无效,属性将使用初始值 ease。因此写 cubic-bezier(1.2, 0, 0.8, 1) 无效。另外如果 y 值很大造成过冲,但属性本身有值域限制(如 opacity 在 0 到 1 之间),计算值会被 clamp,因此视觉上不会出现负值,但超出部分被截断,过冲效果可能不可见。

处理方式:对不可插值的属性(如 display)或非数值属性无法使用任何 easing,对会超出范围的属性值,浏览器仅 clamp 到实际值域,如 opacity 到 [0,1]。需要过冲效果时尽量用于 transform 等可平滑越界属性,并测试合适的 y 范围,避免动画突兀。

回答前,多想一步

容易答错的地方

认为 y 坐标也必须在 0 到 1
实际 y 可以小于 0 或大于 1,正是可以形成回弹或过冲的关键。x 由于必须保证时间映射单调才限定在 [0,1],y 并无此限制。
把 cubic-bezier 理解为四个关键点
它只有四个参数对应两个控制点的坐标,不是四个点。曲线始终有两个固定端点 (0,0) 和 (1,1),控制点只决定弯曲形状。
试着用自己的话回答

面试官还会怎么问?

ease 关键字与 cubic-bezier 如何对应?

ease 等价于 cubic-bezier(0.25, 0.1, 0.25, 1),其他如 ease-in 对应 (0.42,0,1,1),可互换使用。掌握关键字可快速开发。

cubic-bezier 能实现 steps 的阶梯效果吗?

不能,cubic-bezier 是连续曲线,无法产生间断跳跃;阶梯效果需使用 steps(),它与贝塞尔不同。

如何调试曲线效果?

可使用浏览器开发者工具实时调整,或通过 cubic-bezier.com 可视化参考。调试时关注过冲幅度与末端速度。

从一道题,走向一组知识

把知识连起来

动画与视觉

交替动画中 animation-direction: alternate 与 reverse 分别如何改变关键帧的执行顺序?

同属「动画与视觉」专题,接着看 CSS animation-direction alternate 与 reverse 区别 在具体场景中的处理方式。

动画与视觉

如何让动画无限循环并且让元素在每次循环之间保持一定延迟?

同属「动画与视觉」专题,接着看 CSS animation 无限循环 每次循环加延迟 在具体场景中的处理方式。

参考资料

  • <easing-function> CSS type

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

本题目录
  1. 先记住这个答案
  2. 贝塞尔曲线参数如何映射速度
  3. 制作有轻微回弹的弹跳按钮
  4. 容易失效的边界条件
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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