transform 动画需配合 transition 才有渐变效果,单独使用会立即生效;transition 必须写在初始状态上,推荐明确指定 transform 属性及缓动函数,避免 all;注意 rotate 跨度、scale 与 skew 混用可能导致插值异常,调试可加 outline;优先用 transform 和 opacity 触发硬件加速,移动端慎用自定义 cubic-bezier;transform 不影响文档流,但交互热区不变,需手动处理 pointer-events 和模糊问题。
单独写 transform 只会立刻生效,没有过渡——它本身不带时间或缓动逻辑。要让位移、旋转、缩放等变化“动起来”,必须用 transition 声明哪些属性、持续多久、用什么缓动函数。
transition 要写在**初始状态**的元素上(比如 hover 前的默认样式),不是写在 :hover 里transition: transform 0.3s ease-in-out;,避免用 all 引发意外重绘
transform 值(如 translateX 和 rotate),仍只需一个 transform 条目,CSS 会整体插值浏览器对 transform 的插值是基于矩阵运算的,多数情况可靠;但遇到 rotate 跨 180°、或混用 scale 与 skew 时,可能走“最短路径”导致反转或抖动。
rotate(0deg) 到 rotate(720deg),浏览器可能只转一圈而非两圈——改用 rotate(360deg) + rotate(360deg) 分步更可控transform 中混用 scale(0) 和 rotate:缩放为 0 时旋转轴失效,恢复时可能跳变outline: 1px solid red; 观察元素实际变换路径button {
transform: translateX(0) rotate(0);
transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
button:hover {
transform: translateX(20px) rotate(5deg);
}
动画是否流畅,取决于每秒能否稳定输出 60 帧。如果 transition-duration 小于 100ms,或 transform 涉及大量元素、复杂嵌套,GPU 加速可能跟不上。
transform 和 opacity 触发硬件加速,避开 left/top 或 width/height
will-change: transform; 提前提示浏览器,但别滥用——它会常驻占用 GPU 内存cubic-bezier() 的高阶参数支持不稳定,ease-in-out 比自定义贝塞尔更稳妥transform 不影响文档流,这点在 flex 或 grid 里依然成立——它不会触发父容器重排,也不会挤压兄弟元素。但视觉错位后,交互热区仍按原始位置计算。
pointer-events: none; 到被变换元素,再用伪元素或 wrapper 拦截事件transform: scale(0.9) 后,文字模糊?加 backface-visibility: hidden; 强制开启子像素渲染transform: translateY(-50%) 垂直居中时,注意它和 align-self: center 效果不同:前者脱离布局,后者响应网格线变化cubic-bezier)对 transform 插值的影响,远比看起来更底层——它调整的是中间矩阵的合成节奏,不是简单地“快慢变化”。调参时最好在真机上反复点按验证。