如何用GSAP制作HTML5动画_GSAP动画引擎入门指南【引擎教程】

GSAP是专为高性能、可控制、可中断的JavaScript动画设计的引擎,直接操作内联样式或SVG属性,支持逐帧控制与实时调度;而CSS动画和Web Animations API依赖浏览器渲染机制,缺乏运行时干预能力。

GSAP 是什么,它和 CSS 动画、Web Animations API 有什么区别

GSAP 不是“另一个动画库”,而是专为高性能、可控制、可中断的 JavaScript 动画设计的引擎。它不依赖 CSS transition@keyframes,而是直接操作 DOM 元素的内联样式(或 CSS 变量、SVG 属性、甚至自定义对象),因此能精确控制每一帧、随时暂停/倒放/跳转时间点,且不受浏览器渲染线程阻塞影响。

常见误判是“GSAP 就是补间动画”,其实它更接近一个时间轴调度器 + 属性插值器:你告诉它“在 2 秒内把 opacity 从 0 变到 1”,它内部用 requestAnimationFrame 精确计算每帧值并写入;而 CSS 动画一旦触发就无法中途修改目标值,也无法获取当前播放进度。

如何加载 GSAP 并让第一个动画跑起来

最稳妥的方式是通过 CDN 引入核心模块(gsap)和常用插件(如 ScrollTriggerTextPlugin 需单独引入):


然后用 gsap.to() 启动第一个动画 —— 注意它默认立即执行,不需要手动调用 .play()

gsap.to(".box", {
  duration: 1.5,
  x: 200,
  rotation: 360,
  ease: "power2.out"
});
  • duration 单位是秒(不是毫秒),这是 GSAP v3 的统一约定
  • xrotation 是简写属性,底层自动映射为 transform: translateX(200px) rotate(360deg)
  • ease 值必须是字符串,如 "power2.out",不能传函数(除非用 CustomEase

为什么动画没反应?常见初始化与作用域问题

90% 的“动画不动”问题出在 DOM 加载时机或选择器错误:

  • 脚本放在 里但没加 defer,导致 document.querySelector(".box") 返回 null
  • gsap.from() 时忘了设置初始状态(比如元素本来就在屏幕外,又设 opacity: 0,看起来像没动)
  • 多个动画同时作用于同一属性(如两个 to() 都改 y),后触发的会覆盖前一个的缓动逻辑
  • 使用了 SVG 元素但没引入 SVGPlugin(v3.12+ 已内置,旧版需手动加载)

调试建议:在动画语句后加 console.log(gsap.utils.toArray(".box")),确认选中了预期元素;再用 gsap.getProperty(".box", "x") 查看当前值。

如何实现滚动触发动画(ScrollTrigger)

ScrollTrigger 是 GSAP 最常用的插件,但它不是开箱即用的 —— 必须显式注册并确保 DOM 已就绪:


  • start: "top 80%" 表示当元素顶部到达视口 80% 位置时开始动画(不是“滚动到元素顶部”)
  • toggleActions 控制进入/离开时的行为:"play none none reverse" 意味着只在进入时播放,离开时不重置
  • 如果页面有动态内容(如 AJAX 加载),需在新内容插入后调用 ScrollTrigger.refresh()

注意:ScrollTrigger 默认启用性能优化(fastScrollEnd: true),可能导致快速滚动时动画跳帧;若需逐帧响应,设 fastScrollEnd: false,但会增加 CPU 负担。

GSAP 的复杂性不在语法,而在时间轴嵌套、插件协同和性能取舍。比如 stagger 参数看似简单,但配合 repeatyoyo 时,每个子动画的起始时间点会受父级 timeline 影响;而 ScrollTriggerscrub 模式虽然顺滑,却会让动画完全绑定滚动位置,失去独立控制能力 —— 这些细节不踩一遍坑很难真正掌握。