mcpField
G
gsap

gsap

github.com/heygen-com创意与媒体74.7k92.6k 次安装今天更新
代码仓库

关于 gsap

面向 HyperFrames 组合的 GSAP 动画技能,涵盖补间、时间线、变换、缓动和响应式动画,并说明暂停及可寻址时间线等渲染要求。

主要功能

  1. 01创建补间与时间线
  2. 02使用变换别名和 CSS 动画
  3. 03设置缓动、错开与函数值
  4. 04通过 matchMedia 适配响应式动画
  5. 05构建可寻址的有限时间线

适用场景

  1. 01为组合添加入场动画和转场
  2. 02用时间线标签编排动作
  3. 03根据媒体查询调整动画
  4. 04制作 HyperFrames 可寻址的动画

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/heygen-com/hyperframes --skill gsap

安装后在 Claude Code 中输入/gsap确认已加载。

附带文件references/effects.mdscripts/extract-audio-data.py

详细介绍

GSAP

HyperFrames 约定

HyperFrames 通过其 gsap 运行时适配器控制 GSAP。同步创建一个暂停的时间线,使用精确的 data-composition-id 将其注册到 window.__timelines,然后由 HyperFrames 对其进行定位。

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
<script>
  window.__timelines = window.__timelines || {};
  const tl = gsap.timeline({ paused: true });

  tl.from(".title", { y: 48, opacity: 0, duration: 0.6, ease: "power3.out" }, 0);
  tl.to(".accent", { scaleX: 1, duration: 0.5, ease: "power2.out" }, 0.25);

  window.__timelines["main"] = tl; // key must equal data-composition-id on the composition root
</script>
  • 注册表键必须与组合根元素的 data-composition-id 一致。
  • 不要对渲染关键动画调用 tl.play()。
  • 不要在异步代码、计时器或事件处理程序中构建时间线。
  • 保持循环有限。HyperFrames 渲染的是有限时长的视频。

核心补间方法

  • gsap.to(targets, vars) — 从当前状态动画到 vars。最常用。
  • gsap.from(targets, vars) — 从 vars 动画到当前状态(入场动画)。
  • gsap.fromTo(targets, fromVars, toVars) — 显式指定起始和结束状态。
  • gsap.set(targets, vars) — 立即应用(时长为 0)。

始终使用 camelCase 属性名(例如 backgroundColor、rotationX)。

常用 vars

  • duration — 秒(默认值为 0.5)。
  • delay — 开始前的延迟秒数。
  • ease — "power1.out"(默认值)、"power3.inOut"、"back.out(1.7)"、"elastic.out(1, 0.3)"、"none"。
  • stagger — 数值 0.1 或对象:{ amount: 0.3, from: "center" }、{ each: 0.1, from: "random" }。
  • overwrite — false(默认值)、true 或 "auto"。
  • repeat — 有限次数;在 HyperFrames 中永远不要使用 -1。根据可见时长计算重复次数。yoyo — 每次重复时交替方向。
  • onComplete、onStart、onUpdate — 回调。
  • immediateRender — from()/fromTo() 的默认值为 true。对后续针对相同属性和元素的补间设置为 false,以避免覆盖。

变换与 CSS

优先使用 GSAP 的 变换别名,而不是原始 transform 字符串:

GSAP 属性等效属性
x、y、ztranslateX/Y/Z(px)
xPercent、yPercenttranslateX/Y(%)
scale、scaleX、scaleYscale
rotationrotate(度)
rotationX、rotationY3D rotate
skewX、skewYskew
transformOrigintransform-origin
  • autoAlpha — 优先于 opacity。值为 0 时还会设置 visibility: hidden。
  • CSS 变量 — "--hue": 180。
  • svgOrigin (仅限 SVG) — 全局 SVG 坐标空间原点。不要与 transformOrigin 组合使用。
  • 方向旋转 — "360_cw"、"-170_short"、"90_ccw"。
  • clearProps — "all" 或逗号分隔的属性;完成时移除内联样式。
  • 相对值 — "+=20"、"-=10"、"*=2"。

基于函数的值

gsap.to(".item", {
  x: (i, target, targets) => i * 50,
  stagger: 0.1,
});

缓动

内置缓动:power1–power4、back、bounce、circ、elastic、expo、sine。每种缓动都有 .in、.out、.inOut。

默认值

gsap.defaults({ duration: 0.6, ease: "power2.out" });

控制补间

const tween = gsap.to(".box", { x: 100 });
tween.pause();
tween.play();
tween.reverse();
tween.kill();
tween.progress(0.5);
tween.time(0.2);

gsap.matchMedia()(响应式 + 无障碍)

仅在媒体查询匹配时运行设置;当不再匹配时自动还原。

let mm = gsap.matchMedia();
mm.add(
  {
    isDesktop: "(min-width: 800px)",
    reduceMotion: "(prefers-reduced-motion: reduce)",
  },
  (context) => {
    const { isDesktop, reduceMotion } = context.conditions;
    gsap.to(".box", {
      rotation: isDesktop ? 360 : 180,
      duration: reduceMotion ? 0 : 2,
    });
  },
);

时间线

创建时间线
const tl = gsap.timeline({ defaults: { duration: 0.5, ease: "power2.out" } });
tl.to(".a", { x: 100 }).to(".b", { y: 50 }).to(".c", { opacity: 0 });
位置参数

第三个参数控制放置位置:

  • 绝对位置:1 — 在 1s 处
  • 相对位置:"+=0.5" — 在结束后;"-=0.2" — 在结束前
  • 标签:"intro"、"intro+=0.3"
  • 对齐:"<" — 与前一个动画同时开始;">" — 在前一个动画结束后开始;"<0.2" — 在前一个动画开始后 0.2s 开始
tl.to(".a", { x: 100 }, 0);
tl.to(".b", { y: 50 }, "<"); // same start as .a
tl.to(".c", { opacity: 0 }, "<0.2"); // 0.2s after .b starts
标签
tl.addLabel("intro", 0);
tl.to(".a", { x: 100 }, "intro");
tl.addLabel("outro", "+=0.5");
tl.play("outro");
tl.tweenFromTo("intro", "outro");
时间线选项
  • paused: true — 创建暂停的时间线;调用 .play() 开始播放。
  • repeat、yoyo — 应用于整个时间线。
  • defaults — 合并到每个子补间中的 vars。
嵌套时间线
const master = gsap.timeline();
const child = gsap.timeline();
child.to(".a", { x: 100 }).to(".b", { y: 50 });
master.add(child, 0);
播放控制

tl.play()、tl.pause()、tl.reverse()、tl.restart()、tl.time(2)、tl.progress(0.5)、tl.kill()。


性能

优先使用变换和不透明度

对 x、y、scale、rotation、opacity 做动画会由合成器处理。当变换可以实现相同效果时,避免使用 width、height、top、left。

will-change
will-change: transform;

仅用于确实会播放动画的元素。

gsap.quickTo() 用于频繁更新
let xTo = gsap.quickTo("#id", "x", { duration: 0.4, ease: "power3" }),
  yTo = gsap.quickTo("#id", "y", { duration: 0.4, ease: "power3" });
container.addEventListener("mousemove", (e) => {
  xTo(e.pageX);
  yTo(e.pageY);
});
使用 stagger,而不是多个补间动画

使用 stagger,而不是为多个单独的补间动画手动设置延迟。

清理

暂停或终止屏幕外的动画。


参考资料(按需加载)

  • references/effects.md — 可直接使用的特效:打字机文本、音频可视化器。需要 HyperFrames 的现成特效模式时阅读。

最佳实践

  • 使用 camelCase 属性名;优先使用 transform 别名和 autoAlpha。
  • 优先使用时间轴,而不是通过 delay 链接动画;使用位置参数。
  • 使用 addLabel() 添加标签,使动画序列易于阅读。
  • 将默认值传入时间轴构造函数。
  • 需要控制播放时,保存补间动画/时间轴的返回值。

请勿

  • 在 transform 足以实现效果时,仍对布局属性(width/height/top/left)制作动画。
  • 在同一个 SVG 元素上同时使用 svgOrigin 和 transformOrigin。
  • 在可以通过时间轴安排动画顺序时,仍通过 delay 链接动画。
  • 在 DOM 尚不存在时创建补间动画。
  • 跳过清理——不再需要时,务必终止补间动画。
  • 在 HyperFrames 合成中使用无限重复次数。请根据可见时长计算有限的重复次数。

致谢与参考资料

评论

支持 Markdown