JavaScript动画核心是按时间规律更新样式并借浏览器渲染呈现连续效果,实现方式包括requestAnimationFrame手动控制、CSS过渡、关键帧动画及GSAP等库,选型需权衡性能与控制粒度。

JavaScript 动画的核心是**按时间规律更新元素的样式属性,并借助浏览器渲染机制呈现连续变化效果**。实现方式不止一种,关键看性能、兼容性、控制粒度和项目需求。
基于 requestAnimationFrame 的手动动画
这是现代高性能动画的基石。它让动画与浏览器刷新率(通常 60fps)同步,避免 setTimeout/setInterval 的时间抖动和掉帧问题。
- 每次回调中计算当前帧的样式值(如位置、透明度),直接修改 DOM 元素的 style 属性
- 需自行管理动画状态(开始、暂停、结束)、缓动函数(easeInQuad、easeOutCubic 等)和时间进度
- 适合需要精细控制或自定义物理效果(如拖拽回弹、滚动视差)的场景
CSS 过渡(transition) + JS 触发
利用浏览器原生的硬件加速能力,JS 只负责“起手式”——添加/修改 class 或内联样式,由 CSS 完成平滑过渡。
- 写法简单:element.style.transform = 'translateX(100px)'; 配合 CSS 中 transition: transform 0.3s ease;
- 性能好,尤其适合 transform 和 opacity 属性(触发合成层,不触发重排)
- 缺点是时序控制弱(难暂停、难获取中间状态),不适合复杂多段动画
CSS 关键帧动画(@keyframes) + JS 控制
用 CSS 描述完整动画序列,JS 负责启动、暂停、反向或切换动画名。
立即学习“Java免费学习笔记(深入)”;
- 通过 element.style.animationName 或 class 切换激活动画;用 animation-play-state 控制运行/暂停
- 可配合 animationend 事件做后续逻辑,比如循环或链式动作
- 适合固定模式、复用性强的动画(按钮悬停、加载指示器、页面入场)
成熟动画库(如 GSAP、Framer Motion、anime.js)
封装了上述底层逻辑,提供统一 API、时间轴控制、插件生态和跨浏览器修复。
- GSAP:性能极致,支持 SVG、滚动绑定、时间轴嵌套,学习成本略高但可控性最强
- anime.js:轻量(仅 15KB)、语法简洁,适合中小型项目快速实现交互动画
- Framer Motion(React 生态):声明式写法,自动处理挂载/卸载、布局动画(layout motion),开发体验流畅
选型建议:简单状态切换优先用 CSS transition;固定序列用 @keyframes;复杂交互、多元素协同或需要精确时间控制时,上 requestAnimationFrame 或 GSAP 更稳妥。不复杂但容易忽略的是:**避免频繁读写 offsetTop/scrollLeft 等触发布局的属性,否则会强制同步重排,严重拖慢动画帧率**。











