使用指南

GSAP 动画

使用 GSAP 为 Hyperframes 合成添加动画。

Hyperframes 使用 GSAP 进行动画。时间线是暂停的,由运行时控制——你定义动画,框架处理播放。有关动画运行时如何接入 Hyperframes 的背景,请参见帧适配器

设置

包含 GSAP 并创建暂停的时间线:

<script src="https://cdn.jsdelivr.net/npm/gsap@3/dist/gsap.min.js"></script>
<script>
// 1. 创建暂停的时间线——框架控制播放
const tl = gsap.timeline({ paused: true });

// 2. 使用位置参数(第 3 个参数)进行绝对计时
l.to("#title", { opacity: 1, duration: 0.5 }, 0);

// 3. 初始化全局时间线注册表(如果尚未存在)
window.__timelines = window.__timelines || {};

// 4. 使用 data-composition-id 作为键注册时间线
window.__timelines["root"] = tl;
</script>

ℹ️ Note

你在 window.__timelines 中使用的键必须与合成根元素上的 data-composition-id 属性匹配。参见合成了解根元素的结构。

关键规则

  1. 始终使用 { paused: true } 创建时间线 — 框架通过确定性搜索控制播放
  2. window.__timelines 上注册时间线,使用 data-composition-id 作为键
  3. 使用位置参数(第 3 个参数)进行绝对计时:tl.to(el, vars, 1.5)
  4. 只对视觉属性做动画 — 永远不要在脚本中控制媒体播放

支持的方法

方法描述
tl.to(target, vars, position)动画到指定值
tl.from(target, vars, position)从指定值动画
tl.fromTo(target, fromVars, toVars, position)从/到指定值动画
tl.set(target, vars, position)立即设置值

支持的属性

opacityxyscalescaleXscaleYrotationwidthheightvisibilitycolorbackgroundColor,以及任何 CSS 可动画属性。

时间线时长与合成时长

合成的时长等于其 GSAP 时间线时长。两者直接关联:

// 你的最后一个动画在 3 秒结束...
l.from("#title", { opacity: 0, y: -50, duration: 1 }, 0);
l.to("#title", { opacity: 0, duration: 1 }, 2);
// ...所以这个合成恰好是 3 秒长。

如果你的合成包含一个 283 秒长的视频片段,但你的最后一个 GSAP 动画在 8 秒结束,合成将只有 8 秒长,视频会被截短。要延长时间线以匹配视频:

// 你所有的视觉动画
l.to("#lower-third", { left: -640, duration: 0.6 }, 7.2);

// 将时间线延长到 283 秒以匹配视频长度。
// 这在 283s 添加一个零时长的补间,不影响任何元素。
l.set({}, {}, 283);

⚠️ Warning

这是 Hyperframes 中最常见的错误之一。如果你的视频提前截断,时间线太短了。参见常见错误:合成时长短于视频了解更多详情。

不应该做什么

这些模式会破坏你的合成或导致同步问题:

// 错误:在脚本中播放媒体——框架拥有媒体播放权
document.getElementById("el-video").play();
document.getElementById("el-audio").currentTime = 5;

// 错误:创建非暂停的时间线
const tl = gsap.timeline(); // 缺少 { paused: true }!

// 错误:直接对 <video> 元素的尺寸做动画
l.to("#el-video", { width: 500, height: 280 }, 5);

// 错误:手动嵌套子时间线
const masterTL = window.__timelines["root"];
masterTL.add(window.__timelines["intro-anim"], 0);

框架自动管理媒体播放clip 生命周期子合成嵌套。复制此行为的脚本会产生冲突。

子合成时间线

每个嵌套合成注册自己的时间线。框架根据 data-start 自动将子合成时间线嵌套到父时间线中:

// 在 compositions/intro-anim.html 中
const tl = gsap.timeline({ paused: true });
l.from(".title", { opacity: 0, y: -50, duration: 1 });
window.__timelines["intro-anim"] = tl;

// 不要手动将子时间线添加到主时间线:
// masterTL.add(window.__timelines["intro-anim"], 0); // 不需要

⚠️ Warning

不要直接对 <video> 元素的 widthheighttopleft 做动画——这可能导致浏览器停止渲染帧。将视频包装在 <div> 中并对其包装器做动画。参见常见错误了解详细解释。

下一步