前端开发
优化 GSAP 动画卡顿与 60fps:优先…
当需要优化 GSAP 动画性能、降低 jank、排查 FPS 或追求顺滑 60fps 时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
优化 GSAP 动画卡顿与 60fps:特定
解决思路
- 优先动画 `transform`(`x`、`y`、`scaleX`、`scaleY`、`rotation`、`rotationX`、`rotationY`、`skewX`、`skewY`)和 `opacity`,让工作留在合成器上,避免布局和大多数绘制。
- 当用 transform 能达到相同视觉效果时,避免动画会触发布局的属性。
- 优先使用:`x`、`y`、`scale`、`rotation`、`opacity`。
- 尽量避免:`width`、`height`、`top`、`left`、`margin`、`padding`,因为它们触发布局并可能导致 jank。
- GSAP 的 `x` 和 `y` 默认使用 transform(translate),移动时用它们替代 `left`/`top`。
- 对将要动画的元素在 CSS 中使用 `will-change`,提示浏览器提升图层。
- 使用 `will-change: transform;`。
- GSAP 内部会批量更新。
- 当把 GSAP 与直接 DOM 读写或依赖布局的代码混用时,避免交错读写导致反复布局抖动。
- 优先先完成所有读操作,再完成所有写操作(或让 GSAP 一次性处理写操作)。
- 当多个元素动画相同时,使用 `stagger`,不要创建许多带手动延迟的独立 tween;更高效。
- 对长列表,考虑 `virtualization` 或只动画可见项;如果会造成 jank,避免创建数百个同时运行的 tween。
- 尽可能复用 timeline;避免每帧创建新 timeline。
- 对频繁更新的属性(如鼠标跟随的 x/y)优先使用 `gsap.quickTo()`;它复用单个 tween,而不是每次更新都创建新 tween。
- 鼠标跟随示例:`let xTo = gsap.quickTo("#id", "x", { duration: 0.4, ease: "power3" }), yTo = gsap.quickTo("#id", "y", { duration: 0.4, ease: "power3" });`,在 `mousemove` 中调用 `xTo(e.pageX); yTo(e.pageY);`。
- ScrollTrigger:`pin: true` 会提升被固定元素,只固定必要元素。
- ScrollTrigger:使用较小值的 `scrub`(例如 `scrub: 1`)可减少滚动期间的工作;在低端设备上测试。
- 仅在布局真正变化时(例如内容加载后)调用 `ScrollTrigger.refresh()`,不要每次 resize 都调用;可能时做防抖。
- 当动画离屏或不可见/不活动时(例如用户离开页面),暂停或 kill 掉它们。
- 避免同时在大量元素上动画巨量属性;必要时简化或按顺序执行。
- 动画 `transform` 和 `opacity`;仅在会动画的元素上用 CSS `will-change`。
- 多个相同动画用 `stagger`,不要许多手动延迟的独立 tween。
- 频繁更新的属性用 `gsap.quickTo()`(例如鼠标跟随)。
- 清理或 kill 离屏动画;布局变化时调用 `ScrollTrigger.refresh()`,可能时防抖。
- 不要为了移动而动画 `width`/`height`/`top`/`left`,如果 `x`/`y`/`scale` 可以达到相同效果。
- 不要在所有元素上“以防万一”设置 `will-change` 或 `force3D`;只用于确实会动画的元素。
- 不要在未在低端设备测试的情况下创建数百个重叠 tween 或 ScrollTrigger。
- 不要忽略清理;残留 tween 和 ScrollTrigger 会持续运行,影响性能和正确性。
- 构建动画时使用 gsap-core(transforms、autoAlpha)和 gsap-timeline;ScrollTrigger 性能问题参考 gsap-scrolltrigger。
适用边界 · 注意事项
- 未使用 GSAP 或性能问题并非 GSAP 动画引起时,不适用。
- 必须改变布局尺寸/位置且无法用 transform/opacity 等价实现时,不能强行套用“只动画 transform/opacity”。
- 未使用 ScrollTrigger 时,pin、scrub、ScrollTrigger.refresh() 相关优化不适用。