css变量不能直接用于transition-timing-function的cubic-bezier()函数中,需将四参数拆为独立变量并分别引用;x坐标须在[0,1]内,y可超范围实现弹性效果;或用@keyframes绑定动画名间接变量化。

var(--ease) 直接用在 transition-timing-function 会失效
浏览器不解析 CSS 变量值中的函数调用,--ease-bounce: cubic-bezier(0.17, 0.89, 0.32, 1.28); 这种写法看似合理,但 transition-timing-function: var(--ease-bounce); 实际无效——DevTools 会划掉该声明,并静默回退到 ease。这是因为变量只是字符串替换,而 cubic-bezier() 必须在属性值位置原生出现才能被识别为合法缓动语法。
cubic-bezier() 的四个参数必须拆成独立变量
可行方案是把 x1、y1、x2、y2 分别定义为单独的 CSS 变量,再在函数中用 var() 引入:
:root {
--ease-x1: 0.42;
--ease-y1: 0;
--ease-x2: 0.58;
--ease-y2: 1;
}
.card {
transition-timing-function: cubic-bezier(
var(--ease-x1),
var(--ease-y1),
var(--ease-x2),
var(--ease-y2)
);
}
- y 坐标可超出 [0,1] 范围(如
-0.55或1.55),这是实现弹性“超调”的关键 - x 坐标必须落在 [0,1] 内,否则整个
cubic-bezier()声明会被浏览器拒绝 - 所有现代浏览器(Chrome 49+、Firefox 31+、Safari 9.1+)都支持这种写法
用 @keyframes + animation 名间接“变量化”缓动
如果需要在多个地方切换不同曲线,又不想重复写四组数值,可以绑定曲线到命名动画,再用变量控制动画名:
@keyframes ease-bounce {
0% { opacity: 0.99; }
100% { opacity: 1; }
}
@keyframes ease-spring {
0% { opacity: 0.99; }
100% { opacity: 1; }
}
.element {
animation: var(--anim-name, ease-bounce) 0.3s forwards;
}
-
--anim-name存的是动画名字符串,不是函数,所以不会触发解析问题 - 每个
@keyframes块里必须至少有一条不被优化掉的样式(比如opacity: 0.99),否则可能被浏览器跳过 - 这种方式兼容性更好,连 IE11 都能通过 Polyfill 支持(需配合 JS 控制类名)
别指望用 CSS 变量模拟弹簧物理行为
像 spring(1, 80, 10, 0) 这类 iOS 风格的弹簧效果,本质是解二阶微分方程,cubic-bezier() 无论怎么调参,都只是近似——换一个初始位移或目标值,拟合就崩了。
- 用
cubic-bezier(0.17, 0.67, 0.83, 0.67)模仿弹簧,只在特定场景下“看起来像” - 真要响应拖拽、按压回弹等动态交互,必须用 JS 逐帧计算并写入 CSS 变量,或直接用 Web Animations API
- 过渡时间越长,贝塞尔拟合误差越明显;移动端尤其容易暴露
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











