为什么缓动曲线能让元素冲过头再弹回来?
横轴是时间、纵轴是进度,横轴必须单调,纵轴却可以越界——越界的那一段就是回弹。
因为缓动函数是一张「时间到进度」的映射图:横轴是时间,纵轴是完成度。横轴必须单调,否则同一时刻会有两个进度,曲线就不成函数,所以两个控制点的横坐标被限制在零到一之间,越界就是非法值,整条声明会被忽略。
纵轴则没有这个约束。控制点的纵坐标可以大于一或小于零,于是进度会先冲过终点再退回来,看上去就是回弹;也可以先往回走一点再前进,看上去就是回拉。
要注意的是有取值范围的属性会把越界部分裁掉。例如颜色的分量超过上限就被夹到上限,所以给颜色加回弹曲线看不出过冲;换到位移与透明度这类没有上界的属性,效果才明显。
写动画时最容易被忽略的细节,是这四个数字里只有两个受约束。很多人以为四个参数都得在零到一之间,于是调了半天也做不出弹簧感。
规则其实来自一个简单的事实:横轴是时间。时间只能向前,曲线必须在水平方向单调,否则就不是「某个时刻对应某个进度」了;纵轴是进度,进度并没有被要求只能停在终点以内。
这一篇把规则、预设值的确切数值、以及三条工程建议排开。
1参数的意义与约束
四个参数构成两个控制点,起止点是固定的零点与终点。
| 参数 | 含义 | 取值范围 |
|---|---|---|
| 第一个 | 起手控制点的横坐标(时间) | 必须落在零到一之间 |
| 第二个 | 起手控制点的纵坐标(进度) | 不受限制,可越界 |
| 第三个 | 收手控制点的横坐标(时间) | 必须落在零到一之间 |
| 第四个 | 收手控制点的纵坐标(进度) | 不受限制,可越界 |
只要任一横坐标越界,整条声明就无效,属性会被直接忽略——不是退化成默认值,而是当没写过。
2关键词只是预设
那些熟悉的缓动名称,全都能写成四个数字。
| 关键词 | 等价的控制点 | 观感 |
|---|---|---|
| ease | 0.25, 0.1, 0.25, 1 | 两端略缓,默认值 |
| ease-in | 0.42, 0, 1, 1 | 起步慢,越走越快 |
| ease-out | 0, 0, 0.58, 1 | 起步快,收尾慢 |
| ease-in-out | 0.42, 0, 0.58, 1 | 两头缓,中间快 |
| linear | 0, 0, 1, 1 | 匀速,横竖都没越界 |
既然只是预设,就没有「只能用关键词」的说法:想改一点手感,直接在预设的四个数字上微调即可。
3回弹怎么调出来
把纵坐标推到一以上,就是过冲;推到零以下,就是回拉。
- 轻微回弹
- 纵坐标略大于一,适合提示条、徽标、小图标这类轻量元素
- 明显弹簧
- 纵坐标在一点五上下,是抽屉、菜单、弹窗常用的一档
- 夸张弹跳
- 纵坐标更高,适合确认反馈,但整页都用会显得聒噪
- 先回拉后前进
- 起手控制点纵坐标为负,元素先朝反方向退一点再冲出去
工程经验:纵坐标越大,过冲越早越猛,短时长配大过冲会显得发抖而不是弹,所以过冲要跟着时长一起加。
4三条落地建议
同样的曲线,用在不同属性上代价差很多。
- 只用在不触发重排的属性上
- 位移、缩放、透明度走合成器;宽高、内外边距这类会触发重排,回弹会顿
- 注意取值有限的属性
- 颜色分量这类有上下限的属性会把越界部分裁掉,曲线白写
- 尊重减弱动效偏好
- 系统开启减弱动态效果时,应该退化成简单的淡入淡出或直接切换
一句话总结:横轴管时间所以必须单调,纵轴管进度所以可以越界;回弹来自纵轴,能不能看到取决于属性有没有上界。
顺着这个问题往下用
全部工具总览 →相关疑问
为什么我写的曲线一点效果都没有?
先看横坐标是不是越界了——越界会让整条声明作废,表现得像没写。再确认属性本身有没有取值上限,若有,越界部分会被裁掉。
关键帧动画能用同一条曲线吗?
可以,按段应用。每一段单独走自己的缓动,所以想让弹跳更明显,通常要在关键帧里安排多个中间状态,而不是把一条曲线的纵坐标推得更高。
弹簧效果和物理弹簧是一回事吗?
不是。这里只是把进度曲线画成了类似弹簧的形状,没有质量与阻尼参数;需要真实物理手感要用专门的弹簧动画接口。
性能上要注意什么?
优先动位移、缩放与透明度。它们可以被合成器单独处理,不引起布局重算;动尺寸类属性会触发重排,曲线再讲究也会掉帧。
继续看:相关问题与资料
全部问题解答 →内容说明:本页针对具体使用问题作答,方法步骤与数值由本站自行整理与复算,事实性内容以对应官方规范与文档为准。内容最后核对日期:2026-10-09。若发现错误,欢迎通过页脚反馈入口告知。
速查在线工具箱