CSS3动画适合声明式简单交互动画,rAF适合需精细控制的动态复杂动画;二者常混合使用,CSS处理静态部分,rAF处理动态逻辑,兼顾性能与灵活性。
CSS3 动画和 requestAnimationFrame(简称 rAF)不是“二选一”的关系,而是适用场景不同:**CSS3 适合声明式、简单交互动画;rAF 更适合需要精细控制、复杂逻辑或动态计算的动画**。
CSS3 动画(包括 transition 和 @keyframes)由
浏览器直接在合成线程处理,性能高、功耗低,且写法简洁。
transform: translateZ(0) 或 will-change: transform 即可触发 GPU 渲染@supports 检测支持性)时更易维护rAF 是 JavaScript 控制动画帧的底层 API,它让 JS 能与屏幕刷新率同步,避免丢帧,适合需要每帧干预的场景。
没必要非此即彼。现代做法往往是:用 CSS 处理“静态”部分(比如入场/出场),用 rAF 处理“动态”部分(比如滚动中持续更新位置)。
position: sticky(CSS),但配合滚动做透明度渐变 + 高度压缩,就可用 rAF 读取 scrollY 并动态设置内联样式stroke-dashoffset),则用 rAF 逐帧更新偏移量CSS3 动画在 iOS Safari 和旧版 Android 浏览器中偶有渲染 bug(如 transform 闪烁),而 rAF 在 IE10+ 和所有现代浏览器中稳定支持(IE9 需 polyfill)。不过,rAF 写错容易导致无限递归调用或内存泄漏,务必注意清理(如用 cancelAnimationFrame)。
不复杂但容易忽略。