为什么缓动曲线能让元素冲过头再弹回来?

4 个讲解板块 · 关联 3 款站内工具 · 内容最后核对 2026-10-09

横轴是时间、纵轴是进度,横轴必须单调,纵轴却可以越界——越界的那一段就是回弹。

直接答案

因为缓动函数是一张「时间到进度」的映射图:横轴是时间,纵轴是完成度。横轴必须单调,否则同一时刻会有两个进度,曲线就不成函数,所以两个控制点的横坐标被限制在零到一之间,越界就是非法值,整条声明会被忽略。

纵轴则没有这个约束。控制点的纵坐标可以大于一或小于零,于是进度会先冲过终点再退回来,看上去就是回弹;也可以先往回走一点再前进,看上去就是回拉。

要注意的是有取值范围的属性会把越界部分裁掉。例如颜色的分量超过上限就被夹到上限,所以给颜色加回弹曲线看不出过冲;换到位移与透明度这类没有上界的属性,效果才明显。

写动画时最容易被忽略的细节,是这四个数字里只有两个受约束。很多人以为四个参数都得在零到一之间,于是调了半天也做不出弹簧感。

规则其实来自一个简单的事实:横轴是时间。时间只能向前,曲线必须在水平方向单调,否则就不是「某个时刻对应某个进度」了;纵轴是进度,进度并没有被要求只能停在终点以内。

这一篇把规则、预设值的确切数值、以及三条工程建议排开。

1参数的意义与约束

四个参数构成两个控制点,起止点是固定的零点与终点。

参数含义取值范围
第一个起手控制点的横坐标(时间)必须落在零到一之间
第二个起手控制点的纵坐标(进度)不受限制,可越界
第三个收手控制点的横坐标(时间)必须落在零到一之间
第四个收手控制点的纵坐标(进度)不受限制,可越界

只要任一横坐标越界,整条声明就无效,属性会被直接忽略——不是退化成默认值,而是当没写过。

2关键词只是预设

那些熟悉的缓动名称,全都能写成四个数字。

关键词等价的控制点观感
ease0.25, 0.1, 0.25, 1两端略缓,默认值
ease-in0.42, 0, 1, 1起步慢,越走越快
ease-out0, 0, 0.58, 1起步快,收尾慢
ease-in-out0.42, 0, 0.58, 1两头缓,中间快
linear0, 0, 1, 1匀速,横竖都没越界

既然只是预设,就没有「只能用关键词」的说法:想改一点手感,直接在预设的四个数字上微调即可。

3回弹怎么调出来

把纵坐标推到一以上,就是过冲;推到零以下,就是回拉。

轻微回弹
纵坐标略大于一,适合提示条、徽标、小图标这类轻量元素
明显弹簧
纵坐标在一点五上下,是抽屉、菜单、弹窗常用的一档
夸张弹跳
纵坐标更高,适合确认反馈,但整页都用会显得聒噪
先回拉后前进
起手控制点纵坐标为负,元素先朝反方向退一点再冲出去

工程经验:纵坐标越大,过冲越早越猛,短时长配大过冲会显得发抖而不是弹,所以过冲要跟着时长一起加。

4三条落地建议

同样的曲线,用在不同属性上代价差很多。

只用在不触发重排的属性上
位移、缩放、透明度走合成器;宽高、内外边距这类会触发重排,回弹会顿
注意取值有限的属性
颜色分量这类有上下限的属性会把越界部分裁掉,曲线白写
尊重减弱动效偏好
系统开启减弱动态效果时,应该退化成简单的淡入淡出或直接切换

一句话总结:横轴管时间所以必须单调,纵轴管进度所以可以越界;回弹来自纵轴,能不能看到取决于属性有没有上界。

相关疑问

为什么我写的曲线一点效果都没有?

先看横坐标是不是越界了——越界会让整条声明作废,表现得像没写。再确认属性本身有没有取值上限,若有,越界部分会被裁掉。

关键帧动画能用同一条曲线吗?

可以,按段应用。每一段单独走自己的缓动,所以想让弹跳更明显,通常要在关键帧里安排多个中间状态,而不是把一条曲线的纵坐标推得更高。

弹簧效果和物理弹簧是一回事吗?

不是。这里只是把进度曲线画成了类似弹簧的形状,没有质量与阻尼参数;需要真实物理手感要用专门的弹簧动画接口。

性能上要注意什么?

优先动位移、缩放与透明度。它们可以被合成器单独处理,不引起布局重算;动尺寸类属性会触发重排,曲线再讲究也会掉帧。

内容标识:本页内容由人工智能辅助生成,并经人工核对与编辑。详见 人工智能生成内容标识说明。
内容说明:本页针对具体使用问题作答,方法步骤与数值由本站自行整理与复算,事实性内容以对应官方规范与文档为准。内容最后核对日期:2026-10-09。若发现错误,欢迎通过页脚反馈入口告知。