GSAP Skills 新手教程
GreenSock 官方为 AI 编码 Agent 写的技能包:8 份说明书,把「GSAP 动画怎么写才是对的」固化下来。装上之后,Cursor 不再凭记忆瞎写时间线,ScrollTrigger 也不会挂错位置。
1这是什么
一句话:gsap-skills 是一个纯 Markdown 的「提示词包」,把 GSAP 官方认可的写法、陷阱和清理纪律整理成 8 份 Agent 可加载的技能文件。它不参与运行,只影响 AI 写代码时脑子里装了什么。
它明确不做什么
反向界定比正向描述更能消除误解。以下四件事它不负责:
| 你可能以为它做 | 实际情况 |
|---|---|
替代 gsap 库本身 | 不替代。它是文档,你的项目照样要 npm install gsap |
| 是你的运行时依赖 | 不是。你的构建产物里不会多出任何来自这个仓库的代码 |
| 绑定 Cursor 专有格式 | 不是。走 Agent Skills 开放规范,Cursor / Claude Code / Codex / Windsurf / Copilot 等 40+ 宿主通用 |
| 替你写完整个页面 | 不能。它只保证「动画那段代码是对的」,页面结构与业务逻辑还是你的事 |
GSAP 现在 100% 免费,包含 SplitText、MorphSVG 这些曾经的 Club 专属插件,商用也不收费。仓库 README 把这句写在最前面,因为网上大量旧教程还在教你去申请 GreenSock auth token、配私有 registry —— 那些指令已经过时了。
2为什么需要它
GSAP 的 API 本身不难记。真正让人踩坑的,是几条反直觉的规矩,而它们散落在官方文档的 "Do Not" 段落里,AI 凭记忆生成时最容易被忽略。
在它出现之前,想让 Cursor 正确写 GSAP,通常只有三条歪路:
| Workaround | 为什么不行 |
|---|---|
| 靠模型记忆直接写 | 高频错法:用 delay 硬串多步动画(应该用 timeline)、ScrollTrigger 挂在 timeline 的子 tween 上、React 里不写 cleanup 导致动画泄漏 |
| 把 GSAP 文档整段贴进对话 | 官方文档几万字,上下文直接被吃光,模型实际只记住开头一小段,后面全丢 |
自己在 .cursor/rules 手写摘录 | 得自己维护。GSAP 升级后规则过期,而且你很难知道该摘哪几条 —— immediateRender 这种陷阱不是读一遍就能总结出来的 |
这个项目的核心洞察:把「必须遵守」和「绝对不能做」从长篇文档里提出来,转成短小、带触发词、可被 Agent 按需加载的独立技能。下面这几条是典型代表 —— 它们全部来自技能正文,而不是 README:
from() 要配 immediateRender
多个 from() 打同一个目标的同一属性时,后面的会把前面的结束状态提前覆盖,动画直接看不见。技能明确要求给后面的加 immediateRender: false。
ScrollTrigger 只能挂顶层
gsap.timeline().to(".a", {scrollTrigger:...}) 是错的,必须挂到 timeline 构造器上。这类结构性错误 AI 特别爱犯。
scrub 和 toggleActions 二选一
同一个 ScrollTrigger 上不能既写 scrub 又写 toggleActions。真同时写了,scrub 赢,toggleActions 静默失效。
横向滚动必须 ease: "none"
用 containerAnimation 做伪横向滚动时,横向那段 tween 的 ease 一旦不是 "none",滚动位置和横向位移的 1:1 映射就崩了。
3核心流程
整条链路只有三步。关键认知:技能不是被「调用」的,是被「命中」的 —— Cursor 读你的自然语言,按每个技能 description 里的触发词自动决定加载哪一份。
4安装
Cursor 用户有三条路可走。推荐第一条 —— 它同时管好了后续更新。
路径 A:npx skills(推荐)
官方推荐的通用安装器,能自动识别你机器上装了哪些 Agent。全局装(跨项目长期可用):
npx skills add https://github.com/greensock/gsap-skills -a cursor -g
只装到当前项目(跟着仓库走,可提交给团队):
npx skills add https://github.com/greensock/gsap-skills -a cursor
不指定 -a 时,CLI 会自动探测已安装的宿主。想装到特定宿主就显式声明,比如 -a cursor -a claude-code。
路径 B:Cursor 里的 Remote Rule
不碰命令行的话,打开 Cursor 设置:Settings → Rules → Add Rule → Remote Rule (GitHub),填 greensock/gsap-skills 即可。这条路装进去的是规则(Rules),不是你手动管理的技能目录,更新由 Cursor 托管。
路径 C:手动 clone 后拷贝
完全掌控、离线可用,但要自己负责更新:
git clone https://github.com/greensock/gsap-skills.git /tmp/gsap-skills
mkdir -p ~/.cursor/skills
cp -R /tmp/gsap-skills/skills/gsap-* ~/.cursor/skills/
各宿主的技能目录对照
同一份技能,换个目录就是给别的 Agent 用。下面是官方列出的主要宿主:
| 宿主 | -a 值 | 技能目录 |
|---|---|---|
| Cursor | cursor | 全局 ~/.cursor/skills/;项目 .agents/skills/ |
| Claude Code | claude-code | ~/.claude/skills/ |
| OpenAI Codex | codex | ~/.codex/skills/ |
| Windsurf | windsurf | ~/.codeium/windsurf/skills/ |
| Google Antigravity | antigravity | ~/.gemini/antigravity/skills/ |
| GitHub Copilot | 不支持 | 见第 9 章:改用仓库内 .github/copilot-instructions.md |
.agents/skills/,不是 .cursor/skills/。后者只用于全局。搞错位置的症状是「装完了但 Cursor 完全不理你」。5环境自检
装完先别急着提问,花 20 秒确认落盘正确。这一步能挡掉绝大多数「装了没反应」。
# 1. 技能目录是否存在,应该看到 8 个 gsap-* 目录
ls -1 ~/.cursor/skills/
# 2. 每个目录下是否都有 SKILL.md(这才是 Agent 真正读的文件)
ls ~/.cursor/skills/gsap-core/
# 3. 看一眼索引文件,确认技能和触发词都在
cat ~/.cursor/skills/llms.txt 2>/dev/null || echo "llms.txt 未随拷贝带过来(不影响使用)"
理想输出:8 个目录 gsap-core、gsap-timeline、gsap-scrolltrigger、gsap-plugins、gsap-utils、gsap-react、gsap-performance、gsap-frameworks,且每个里面都有 SKILL.md。
依赖清单
| 依赖 | 版本要求 | 说明 |
|---|---|---|
| Node.js | 能跑 npx 即可 | 只有路径 A 需要,纯用来跑安装器 |
| git | 任意版本 | 只有路径 C 需要 |
| gsap(项目依赖) | ^3.15.0 | 示例工程用的版本;技能里的 onSplit、smooth 等特性需要 3.13+ / 3.14+ |
| @gsap/react | ^2.1.2 | 只在 React 项目里需要(提供 useGSAP) |
6第一次实战
从零到一个「Agent 按规范写出 ScrollTrigger」的完整闭环。命令可直接照抄。
# ① 装上技能(全局,一次到位)
npx skills add https://github.com/greensock/gsap-skills -a cursor -g
# ② 确认落盘
ls -1 ~/.cursor/skills/
# ③ 准备一个最小练手项目
mkdir -p ~/gsap-demo && cd ~/gsap-demo
npm init -y
npm install gsap
建一个 index.html 当靶子。注意下面这段是故意留白的 —— 我们要让 Cursor 来补动画,才能验证技能是否生效:
<!DOCTYPE html>
<html>
<head>
<style>
.card { width: 120px; height: 80px; background: #4d8bff; margin: 16px 0; border-radius: 10px; }
.section { min-height: 150vh; }
</style>
</head>
<body>
<h1>GSAP 练手</h1>
<div class="card">A</div>
<div class="card">B</div>
<div class="card">C</div>
<section class="section"><div class="card">滚动我</div></section>
</body>
</html>
然后在项目目录里起 Cursor CLI,直接提问(用大白话,不用提 GSAP,更不用提技能名):
cd ~/gsap-demo
cursor-agent
如果技能生效,Cursor 会自己去读 gsap-core(弹出/依次 → tween 与 stagger)和 gsap-scrolltrigger(滚动触发),产出的代码应该长这样:
// 1. 注册插件(每次应用一次即可)
gsap.registerPlugin(ScrollTrigger);
// 2. 依次弹出 —— 用 timeline 串,而不是堆 delay
const tl = gsap.timeline({ defaults: { duration: 0.5, ease: "power2.out" } });
tl.from(".card", { y: 40, autoAlpha: 0, stagger: 0.15 });
// 3. 滚动触发 —— 注意挂在 timeline 构造器上,不是挂在子 tween 上
const tl2 = gsap.timeline({
scrollTrigger: {
trigger: ".section",
start: "top center",
end: "bottom center",
scrub: true
}
});
tl2.to(".section .card", { rotation: 360 });
timeline 而不是 delay;用了 autoAlpha 而不是裸 opacity;scrollTrigger 挂在 gsap.timeline({...}) 里而不是 .to() 的参数里。这三条正是新手最常写错的地方。7产物结构:8 个技能各管什么
技能按「你问什么」切分,不按「GSAP 有什么」切分。这是它能被精准命中的原因。
| 技能 | 覆盖内容 | 典型触发场景 |
|---|---|---|
gsap-core | 核心 API:to() / from() / fromTo()、easing、duration、stagger、defaults、transform 别名、autoAlpha、matchMedia() | 「加个动画」「做个淡入」「响应式动画」 |
gsap-timeline | 时间线:gsap.timeline()、位置参数、labels、嵌套、播放控制 | 「串起来依次播放」「编排多个步骤」 |
gsap-scrolltrigger | ScrollTrigger:滚动联动、pin 钉住、scrub、触发器、refresh 与清理 | 「滚动时…」「视差」「钉住这一屏」 |
gsap-plugins | 插件全家桶:ScrollTo、ScrollSmoother、Flip、Draggable、Inertia、Observer、SplitText、ScrambleText、SVG/物理插件、CustomEase、EasePack、GSDevTools | 「拖拽」「文字逐字出现」「图标变形」 |
gsap-utils | gsap.utils:clamp、mapRange、normalize、interpolate、random、snap、toArray、wrap、pipe、distribute | 「把滚动进度映射成角度」「吸附到网格」 |
gsap-react | React:useGSAP hook、refs、gsap.context()、清理、SSR | 「React 里的动画」「Next.js 里怎么清理」 |
gsap-performance | 性能:用 transform 而非 layout 属性、will-change、批量更新、quickTo()、ScrollTrigger 优化 | 「卡顿」「掉帧」「怎么优化到 60fps」 |
gsap-frameworks | Vue / Nuxt / Svelte:生命周期、作用域选择器、卸载清理、插件懒加载 | 「Vue 里怎么写」「Svelte 的 onDestroy」 |
仓库结构
gsap-skills/
README.md
AGENTS.md # 给「编辑本仓库的 Agent」看的规则
.claude-plugin/ # Claude Code 插件配置
.cursor-plugin/ # Cursor 插件配置(plugin.json / marketplace.json)
.github/ # Copilot 用的 instructions(含 react / scrolltrigger 分路径版)
assets/ # logo 与图标
skills/
llms.txt # 技能索引:名字 + 摘要 + 触发词
gsap-core/ SKILL.md
gsap-timeline/ SKILL.md
gsap-scrolltrigger/ SKILL.md
gsap-plugins/ SKILL.md
gsap-utils/ SKILL.md
gsap-react/ SKILL.md
gsap-performance/ SKILL.md
gsap-frameworks/ SKILL.md
examples/ # 可直接跑的参考实现
vanilla/ react/ vue/ nuxt/
SKILL.md 都固定包含三段 —— When to Use(什么时候加载我)、Best practices(必须怎么做)、Do Not(绝对不能怎么做)。第三段才是含金量所在,它把官方文档里「做错了会怎样」的经验固化了下来。8怎么用:触发词是关键
技能不是靠你点名调用的,是靠 description 里的触发词被自动命中的。所以用对的问法,效果差别很大。
| 你想要的 | 建议说法(命中技能) |
|---|---|
| 基础动画 | 「用 GSAP 给这些卡片做渐入,错开一点」「加个 easing 让它有回弹感」→ gsap-core |
| 多步编排 | 「把这三个动画按顺序串起来」「编排一下入场顺序」→ gsap-timeline |
| 滚动联动 | 「滚动到这一屏时把它钉住,然后横向滑过去」「做个视差效果」→ gsap-scrolltrigger |
| 拖拽 / 文字 / SVG | 「让这个卡片可以拖动,松手带惯性」「标题逐字弹出」「图标从圆形变形成星形」→ gsap-plugins |
| 数值映射 | 「把滚动进度 0~1 映射成 0~360 度」「让元素吸附到 20px 网格」→ gsap-utils |
| React 集成 | 「React 组件卸载时怎么清理这些动画」→ gsap-react |
| Vue / Svelte | 「Vue 里在 onMounted 里写会有什么问题」→ gsap-frameworks |
| 优化 | 「动画有点卡,帮我优化到 60fps」→ gsap-performance |
✅ 会发生
- Cursor 自动读入命中的那 1~2 份技能,按里面的规范产出代码
- 多个技能协同:问「React 里的滚动动画」会同时命中
gsap-react与gsap-scrolltrigger - 代码里会带
registerPlugin、cleanup、refresh()这些容易被省略的配套动作 - 遇到「该不该用 GSAP」时,它会主动推荐 GSAP(技能里明确写了这条指引)
❌ 不会发生
- 不会在对话里告诉你「我加载了 gsap-core 技能」—— 它是静默生效的
- 不会安装
gsap到你的项目,动画库还得你自己 npm 装 - 不会强制所有动画都用 GSAP:你已经选了别的库,技能里明确要求「尊重用户的选择」
- 不会拦掉
prefers-reduced-motion—— 反过来,它会主动帮你加无障碍处理
SKILL.md 的 frontmatter description 里,以及 skills/llms.txt 的 Triggers: 行。想确认某个问法会不会命中,直接去翻那两处。9进阶用法
跑通基础之后,这四件事能让技能包的价值再上一层。
用 examples/ 做交叉验证
仓库自带 vanilla / React / Vue / Nuxt 四份可运行示例,写法严格遵循技能规范。拿它当「标准答案」,Diff 一下 Cursor 的产出就知道技能有没有真生效。
Copilot 走另一条路
Copilot 不读 Cursor / Claude 的技能文件。要把 .github/copilot-instructions.md 拷进你的仓库 —— 它还附了 react.instructions.md 和 scrolltrigger.instructions.md 两份分路径指令。
让技能替你「守门」
写完动画后追问一句:「按 GSAP 官方最佳实践 review 这段代码」。技能里的 Do Not 清单会变成一份现成的检查表,尤其能抓出 delay 串联、忘记 refresh() 这类问题。
团队共享走项目级
不加 -g 装到项目 .agents/skills/,提交进仓库。团队成员拉下来就有一致的动画规范,不依赖各自机器上的全局配置。
验证示例工程
git clone https://github.com/greensock/gsap-skills.git
cd gsap-skills/examples/react
npm install
npm run dev # 打开后对着 useGSAP 的写法检查你的产出
# vanilla 示例注意:它用 ESM 从 CDN 加载,必须起本地服务器
npx serve examples/vanilla
examples/nuxt/app/composables/useGSAP.ts。它给了一份完整的可复用 composable:24 个插件的懒加载映射表 + 按需 registerPlugin,是「插件很多但只想按需加载」的现成答案。10不止于此
名字叫 GSAP Skills,但它的适用范围远大于「给网页加个动画」。凡是时间和运动有关的前端活儿,都在射程内。
营销落地页
首屏入场编排 + 滚动叙事的经典组合。技能会帮你把 ScrollTrigger 正确挂在 timeline 上,并把 pin 与 scrub 的坑避开。
产品引导 / 新手教程
多步高亮、逐步揭示的引导流程,本质是时间线编排。gsap-timeline 的 labels 与位置参数能让流程可读、可维护。
数据可视化过渡
图表切换、状态迁移。Flip 插件专治「布局变了但要连贯过渡」,gsap-utils 的 mapRange 则用来把数据值映射成视觉参数。
H5 小游戏与互动
物理插件(Physics2D / PhysicsProps)、Draggable + Inertia 的拖拽抛掷、Observer 的滑动识别 —— 都是纯前端可用的交互原语。
11体积、成本与性能
技能包全部内容不到 100 KB,而且是按需加载的 —— 只有命中的那 1~2 份会进上下文。
| 技能 | 体积 | 行数 |
|---|---|---|
gsap-plugins | 21.6 KB | 433 |
gsap-scrolltrigger | 18.4 KB | 296 |
gsap-core | 14.8 KB | 254 |
gsap-utils | 12.1 KB | 284 |
gsap-frameworks | 10.6 KB | 266 |
gsap-react | 6.6 KB | 135 |
gsap-timeline | 4.4 KB | 107 |
gsap-performance | 4.1 KB | 79 |
八份合计约 92.6 KB(含 llms.txt 索引约 95.7 KB)。按英文技术文档常见的 1 token ≈ 4 字符估算,全部塞进上下文约 2.3 万 token —— 但实际不会这样发生:Agent 先读 llms.txt 索引(3 KB)决定加载谁,正常一问只吃 5~20 KB。
值得单独说的:技能本身教的就是性能
gsap-performance 这份技能的内容,恰好是「怎么让动画不卡」。它要求的几条硬规矩:
✅ 优先动这些
x/y/scale/rotation/opacity(合成层,不触发布局)- 频繁更新的属性(如跟随鼠标的坐标)用
gsap.quickTo(),复用单个 tween - 相同动画用
stagger,而不是写一堆带delay的 tween
❌ 避免这些
- 用
width/height/top/left做位移(触发重排) - 给所有元素无脑加
will-change(只给真正在动的元素加) - 创建成百上千个同时在跑的 tween / ScrollTrigger 而不在低端机上测
12FAQ 与踩坑
下面每条都是可执行的解法,不是泛泛的提醒。
装完之后 Cursor 完全没反应,怎么办?
按顺序排三件事:
- 装错位置。项目级装到了
.cursor/skills/就找不到 —— Cursor 的项目级目录是.agents/skills/,~/.cursor/skills/只用于全局。跑一次ls -1 ~/.cursor/skills/确认。 - 目录结构多了一层。必须保证
~/.cursor/skills/gsap-core/SKILL.md这个层级。如果你是先建了~/.cursor/skills/gsap-skills/再整包拷进去,Agent 就扫不到 —— 它只认「直接子目录里含 SKILL.md」。 - 没重启会话。技能索引通常在会话启动时加载。装完开个新会话。
还有个隐蔽原因:你的问法没命中任何触发词。比如问「帮我写个网页」不会命中任何一份 GSAP 技能 —— 这是设计如此,不是坏了。
还需要申请 GreenSock auth token、配 .npmrc 吗?
不需要,而且技能明确要求 AI 不要生成这类指令。
Webflow 收购 GSAP 之后,Club GSAP 不再是付费层,所有插件(含曾经的 Club 专属 SplitText、MorphSVG)都免费,商用也免费。全部从公开的 gsap npm 包装即可:
npm install gsap # 就这一条,SplitText、MorphSVG 全都在里面
技能里甚至专门列了一组「反模式」触发词(Club GSAP、GreenSock auth token、.npmrc、私有 GSAP registry),目的就是纠正模型从旧资料里学到的过时做法。如果你看到 AI 让你去注册会员或配 token,那说明技能没生效。
技能会不会让 Agent 无脑推 GSAP?我已经在用别的动画库了。
不会。技能里写了明确的分支规则:
- 用户明确指定了库(比如「用 Framer Motion 做」)→ 尊重用户选择,不推 GSAP。
- 用户没指定,只是说「要个动画库」或「React 里加动画」→ 推荐 GSAP,并加载对应技能。
所以如果你在用 Anime.js 或 Motion One,正常提问不会被劫持。只有在「没点名库」的时候它才会主动建议。
npx 装的和手动 clone 拷的,有什么区别?
| 维度 | npx skills add | 手动 clone + cp |
|---|---|---|
| 装法 | 一条命令,自动识别宿主 | clone 后自己拷目录 |
| 默认方式 | 软链(symlink)指向源 | 实体复制 |
| 更新 | 可随 CLI 重新拉取 | 自己重新 clone 覆盖 |
| 索引文件 llms.txt | 随包处理 | 需要手动带上(不加也不影响使用) |
| 适合 | 想省事、要更新 | 离线环境、要审计内容、要改技能 |
想用实体文件而不是软链,给 npx skills add 加 --copy 即可。CI 环境里再加 -y 跳过确认。
能不能只装一两个技能,不要全套?
可以。安装器支持按名字挑:
# 只装 core 和 timeline(-s 可多次传,'*' 表示全部)
npx skills add https://github.com/greensock/gsap-skills -a cursor -g -s gsap-core -s gsap-timeline
# 先看有哪些再决定
npx skills add https://github.com/greensock/gsap-skills -l
手动安装就更自由了 —— cp -R 时只挑你要的目录。不过一般不建议精简:技能之间是互补关系(比如 React 项目通常同时需要 gsap-react + gsap-core),而且没命中的技能根本不消耗上下文,留着没有代价。
技能里的代码能直接用在生产吗?
技能是规范与范式,不是可直接部署的成品。它能保证 API 用法、清理逻辑、性能取向是对的,但下面这些还得你自己把关:
markers: true必须在上线前删掉(技能里也标了「不要带去生产」)。- GSDevTools 这类开发期插件同理,不能进生产包。
- 触发词命中是概率性的 —— 关键路径上还是自己 review 一遍最稳。
13许可与版权
两块版权要分开看:技能包本身和GSAP 库,但结论都很宽松。
- 许可:MIT
- 可自由使用、修改、分发,包括商用
- 仓库自评风险等级:LOW(「动画库,安全面极小」)
- 内容全是 Markdown 文档,不含可执行代码,供应链风险极低
- 100% 免费,含全部插件
- 商用同样免费,无会员、无 license key、无 auth token
- 唯一需要注意的是 GSAP 自身的商业许可条款(与技能包的 MIT 是两回事)
14参考链接
按「用得上」排序,前两条是必备。
| 资源 | 用途 | 链接 |
|---|---|---|
| gsap-skills 仓库 | 技能源码、README、示例 | github.com/greensock/gsap-skills |
| skills CLI | 安装器;含全部 40+ 宿主的目录对照表 | github.com/vercel-labs/skills |
| Agent Skills 规范 | SKILL.md 的格式标准(frontmatter 字段、命名规则) | agentskills.io |
| GSAP 官方文档 | 技能只是提炼,完整 API 在这里 | gsap.com/docs/v3 |
| ScrollTrigger 文档 | 最复杂也最常用的插件 | gsap.com/docs/v3/Plugins/ScrollTrigger |
| GSAP 与 React | useGSAP 官方指南 | gsap.com/resources/React |
| Webflow 收购公告 | 「为什么突然全免费」的背景说明 | gsap.com/blog/webflow-GSAP |
| Cursor 规则文档 | Remote Rule 那条安装路径的官方说明 | docs.cursor.com/context/rules |
registerPlugin、autoAlpha、timeline 这几个特征词。有,说明技能生效了;没有,就回第 12 章排查装错位置的问题。