JavaScript动画通过定时更新样式属性实现,推荐requestAnimationFrame或Web Animations API;CSS动画由渲染引擎驱动,性能更优但灵活性差;应按场景选择并兼顾可访问性。
JavaScript 实现动画效果,核心是通过定时更新元素的样式属性(比如 left、transform、opacity),再配合重绘/重排机制让变化呈现为连续运动。而 CSS 动画由浏览器渲染引擎直接驱动,声明式定义起止状态和时间曲线,性能通常更优、代码更简洁。
主流有三种:手动控制 setTimeout/setInterval、使用 r(推荐)、或借助 Web Animations API。
equestAnimationFrame
element.animate()):原生 JS 接口,支持关键帧、时序控制、暂停/播放/反向等,比 CSS 更灵活,且可动态生成动画参数。transform 和 opacity,它们只触发合成(composite),不引发重排(reflow)和重绘(repaint),性能更好。CSS 动画(@keyframes + animation)或过渡(transition)由浏览器在独立线程中处理,对主线程压力小,启动快、运行稳,特别适合状态切换类动效。
transform 和 opacity 时,浏览器会自动启用 GPU 合成层,动画更流畅。不是非此即彼,而是按场景分工协作:
transition 或 @keyframes,简单高效。requestAnimationFrame 或 WAAPI。animationend 或 finish)触发后续行为。用户可能开启了“减少运动”偏好(prefers-reduced-motion)。JS 动画可通过 window.matchMedia('(prefers-reduced-motion: reduce)') 检测并降级;CSS 则可用 @media (prefers-reduced-motion: reduce) 直接禁用或替换为简单过渡。