核心入口
gsap.to(targets, vars):从当前状态补间到目标状态gsap.from(targets, vars):从给定初始状态进入当前状态gsap.fromTo(targets, fromVars, toVars):显式声明起止状态gsap.set(targets, vars):立即写值,不创建补间gsap.delayedCall(delay, fn):延时执行回调
// 进入场动画
gsap.from(".hero-title", {
y: 32,
opacity: 0,
duration: 0.8,
ease: "power2.out"
});
// 交互反馈
gsap.to(".card", {
scale: 1.02,
duration: 0.2,
paused: true
});
📦 模块导入与注册 >>>
当前官方包默认提供 ESM;插件使用前先 import,再 `registerPlugin()`。
import gsap from "gsap":导入核心import ScrollTrigger from "gsap/ScrollTrigger":单独导入插件import { gsap, Flip, ScrollTrigger } from "gsap/all":一次导入常用公开插件gsap.registerPlugin(ScrollTrigger, Flip):注册后才能使用插件能力
import gsap from "gsap";
import ScrollTrigger from "gsap/ScrollTrigger";
import Flip from "gsap/Flip";
gsap.registerPlugin(ScrollTrigger, Flip);
🎛️ Tween 常用参数 >>>
duration、delay、repeat、stagger、callbacks 是高频参数组合。
duration:动画时长,单位秒delay:延迟开始ease:缓动函数repeat -1:重复次数, 为无限yoyo:往返播放stagger:批量目标错峰执行onStart/onUpdate/onComplete:生命周期回调
// 批量列表项依次出现
gsap.to(".item", {
opacity: 1,
y: 0,
duration: 0.5,
stagger: {
each: 0.08,
from: "start"
},
ease: "power3.out"
});
Timeline 负责组织多段动画、标签与相对时间位置。
gsap.timeline(options):创建时间轴tl.to():追加一个 tweentl.from():追加进入动画tl.addLabel("intro"):增加标签tl.play():播放tl.pause():暂停tl.reverse():反向播放tl.seek("intro"):跳到标签或时间点
const tl = gsap.timeline({
defaults: {
duration: 0.5,
ease: "power2.out"
}
});
tl.from(".hero-title", { y: 30, opacity: 0 })
.from(".hero-subtitle", { y: 18, opacity: 0 }, "<0.1")
.from(".hero-cta", { scale: 0.92, opacity: 0 }, ">-0.1")
.addLabel("ready");
时间位置语法
0:绝对时间"+=0.3":在当前末尾后再延迟 0.3 秒"-=0.2":与前一个动画重叠 0.2 秒"<":与前一个动画同起点">":接在前一个动画结束后"label+=0.2":基于标签偏移
tl.from(".panel", { opacity: 0, y: 24 }, 0)
.from(".panel-title", { opacity: 0, y: 12 }, "<0.1")
.from(".panel-body", { opacity: 0 }, ">-0.1")
.from(".panel-actions", { opacity: 0, y: 10 }, "ready+=0.2");
🌊 缓动与函数值 >>>
合适的 ease 与函数值,能比硬编码参数更自然。
"power2.out":常见 UI 进入动画"power2.inOut":前后都平滑"back.out(1.7)":带轻微回弹"elastic.out(1, 0.4)":明显弹性"steps(5)":分段动画x: (index) => index * 24:用函数按序生成值
gsap.to(".dot", {
x: (index) => index * 18,
scale: (index) => 1 + index * 0.08,
ease: "back.out(1.7)",
stagger: 0.05
});
🧲 ScrollTrigger >>>
滚动驱动动画时,先注册插件,再定义 trigger、start、end、scrub。
gsap.registerPlugin(ScrollTrigger):注册插件trigger:触发元素start/end:起止位置scrub:将动画与滚动进度绑定pin:固定元素toggleActions:进入/离开时行为markers:调试定位
gsap.registerPlugin(ScrollTrigger);
gsap.to(".feature-image", {
y: -80,
ease: "none",
scrollTrigger: {
trigger: ".feature",
start: "top bottom",
end: "bottom top",
scrub: true
}
});
🧩 常用插件 >>>
ScrollTrigger、Flip、MotionPath、Observer、SplitText 是当前常见插件组合。
ScrollTrigger:滚动驱动动画ScrollToPlugin:平滑滚动到目标Flip:布局切换过渡MotionPathPlugin:沿路径运动Observer:统一鼠标、触控、滚轮输入Draggable:拖拽交互TextPlugin:文本渐变显示SplitText:文本拆分动效
// GSAP 3.13 起,原 bonus plugins 已免费开放
import { SplitText } from "gsap/SplitText";
gsap.registerPlugin(SplitText);
const split = SplitText.create(".headline", { type: "chars,words" });
gsap.from(split.chars, { y: 24, opacity: 0, stagger: 0.03 });
gsap.registerPlugin(Flip);
const state = Flip.getState(".card");
document.querySelector(".grid").classList.toggle("is-expanded");
Flip.from(state, {
duration: 0.45,
ease: "power2.inOut",
absolute: true
});
🧱 上下文与框架集成 >>>
在 React、Vue 等框架中,用 `context()` 和 `matchMedia()` 收拢副作用。
gsap.context(fn, scope):记录当前上下文里创建的动画ctx.revert():清理上下文动画gsap.matchMedia():按媒体查询注册动画mm.add(query, fn):为断点分别定义动画
const mm = gsap.matchMedia();
mm.add("(min-width: 768px)", () => {
const ctx = gsap.context(() => {
gsap.from(".sidebar", { x: -40, opacity: 0 });
});
return () => ctx.revert();
});
工具函数
gsap.utils.toArray(selector):把选择器结果转成数组gsap.utils.clamp(min, max, value):限制数值范围gsap.utils.interpolate(a, b, progress):按进度插值gsap.quickSetter(target, prop, unit):创建高性能写值函数gsap.quickTo(target, prop, vars):创建“追逐式”补间函数
const moveX = gsap.quickTo(".cursor-follower", "x", {
duration: 0.18,
ease: "power3.out"
});
const moveY = gsap.quickTo(".cursor-follower", "y", {
duration: 0.18,
ease: "power3.out"
});
window.addEventListener("pointermove", (event) => {
moveX(event.clientX);
moveY(event.clientY);
});
📐 响应式重算 >>>
断点变化明显时,除了 `matchMedia()` 本身,也要配合刷新与重建逻辑。
gsap.matchMedia():注册断点级动画mm.revert():清理当前媒体查询中的动画gsap.matchMediaRefresh():重新评估所有 matchMedia 逻辑ScrollTrigger.refresh():重新计算滚动触发器
const mm = gsap.matchMedia();
mm.add("(max-width: 767px)", () => {
gsap.set(".sidebar", { clearProps: "all" });
});
window.addEventListener("resize", () => {
gsap.matchMediaRefresh();
});
🎚️ 控制与回调 >>>
实例方法适合在业务状态、路由切换和手动播放场景中配合使用。
tween.pause():暂停tween.resume():继续tween.restart():重头播放tween.progress(0.5):设置进度tween.kill():销毁 tweentween.eventCallback("onComplete", fn):动态修改回调
const tween = gsap.to(".toast", {
autoAlpha: 1,
y: 0,
paused: true,
duration: 0.3
});
document.querySelector(".open").addEventListener("click", () => tween.restart());
document.querySelector(".close").addEventListener("click", () => tween.reverse());
🩺 性能与排障 >>>
少做 layout thrash,多做 transform,及时清理 ScrollTrigger 与上下文。
transform opacity:优先动画的属性will-change:只在短时间内为热点元素启用ScrollTrigger.refresh():布局变化后刷新触发器ScrollTrigger.getAll().forEach(trigger => trigger.kill()):清理全部触发器gsap.defaults({...}):设置全局默认值gsap.config({ nullTargetWarn: false }):调整全局行为
// 内容懒加载或手风琴展开后,刷新 ScrollTrigger
document.querySelector(".accordion").addEventListener("transitionend", () => {
ScrollTrigger.refresh();
});