参考

HTML Schema 参考

编写 Hyperframes HTML 合成的完整参考。

这是 Hyperframes 合成的完整 schema 参考。如需更温和的入门介绍,请参阅合成数据属性

概览

Hyperframes 使用 HTML 作为描述视频的权威来源:

  • HTML clip = 视频、图像、音频、合成
  • 数据属性 = 时序、元数据、样式
  • CSS = 定位和外观
  • GSAP 时间轴 = 动画和播放同步(参见 GSAP 动画

框架管理的行为

框架读取数据属性并自动管理:

  • 基本 clip 时间轴条目 — 从 clip 中读取 data-startdata-durationdata-track-index,并将它们添加到 GSAP 时间轴
  • 媒体播放(播放、暂停、跳转)用于 <video><audio>
  • Clip 生命周期 — clip 根据 data-startdata-duration 进行挂载/卸载
  • 时间轴同步 — 保持媒体与 GSAP 主时间轴同步
  • 媒体加载 — 等待所有媒体加载完毕后再解析时序

挂载/卸载控制的是存在性,而非外观。过渡效果(淡入、滑入)在脚本中以动画方式实现。

⚠️ Warning

不要在脚本中手动调用 video.play()video.pause()、设置 audio.currentTime,或挂载/卸载 clip。框架拥有媒体播放和 clip 生命周期的所有权。更多详情请参阅常见错误

视口

每个合成必须在根元素上包含 data-widthdata-height

<div id="main" data-composition-id="my-video"
data-start="0" data-width="1920" data-height="1080">
<!-- clips -->
</div>

常用尺寸:

  • 横向data-width="1920" data-height="1080"
  • 纵向data-width="1080" data-height="1920"

所有 Clip 属性

属性适用对象必需描述
id所有唯一标识符(例如 "el-1")。用于相对时序引用和 CSS 目标定位。
class="clip"可见元素启用运行时可见性管理。纯音频 clip 不需要。
data-start所有开始时间(秒),例如 "0""5.5",或用于相对时序的 clip ID 引用(例如 "intro")。
data-durationvideo、img、audio见下文持续时间(秒)。图像必须指定。视频/音频可选(默认为源时长)。合成上不使用。
data-track-index所有时间轴轨道编号。控制 z 轴排序(值越大越靠前)。同一轨道上的 clip 不能重叠。
data-media-startvideo、audio源文件中的播放偏移/修剪点(秒)。默认值:0。参见数据属性
data-volumeaudio、video音量级别,从 01。默认值:1
data-composition-iddiv合成上必需唯一的合成 ID。必须与 window.__timelines 中使用的键匹配。
data-composition-srcdiv外部合成 HTML 文件的路径(用于嵌套合成)。
data-variable-valuesdiv传递给嵌套合成的 JSON 值对象。框架会传递这些值,但你的合成脚本必须手动读取和应用它们。
data-widthdiv合成上必需合成宽度(像素)。
data-heightdiv合成上必需合成高度(像素)。

Clip 类型

视频 clip 嵌入带有时间和播放属性的 `

相对时序

data-start 中引用另一个 clip 的 ID 表示"在该 clip 结束时开始":

<video id="intro" data-start="0" data-duration="10" data-track-index="0" src="..."></video>
<video id="main" data-start="intro" data-duration="20" data-track-index="0" src="..."></video>

main 在第 10 秒开始(当 intro 结束时)。

偏移量允许你添加间隔或重叠:

<!-- intro 之后 2 秒的间隔 -->
<video id="main" data-start="intro + 2" data-duration="20" data-track-index="0" src="..."></video>

<!-- 与 intro 重叠 0.5 秒 -->
<video id="main" data-start="intro - 0.5" data-duration="20" data-track-index="0" src="..."></video>

更深入的解释请参阅数据属性概念页面中的相对时序部分

时间轴约定

框架在任何脚本运行之前初始化 window.__timelines = {}。每个合成必须在与其 data-composition-id 匹配的键上注册一个 GSAP 时间轴:

const tl = gsap.timeline({ paused: true });

// 添加动画
l.to("#title", { opacity: 1, duration: 0.5 }, 0);
l.to("#title", { opacity: 0, duration: 0.5 }, 4.5);

// 注册时间轴
window.__timelines["<data-composition-id>"] = tl;

规则

  • 每个合成需要一个 <script> 块来创建和注册其时间轴
  • 所有时间轴必须以暂停状态开始({ paused: true }
  • 框架自动将子时间轴嵌套到父时间轴中 — 不要手动添加
  • 时长来自 tl.duration()不要在合成元素上添加 data-duration
  • 时间轴必须是有限的(无无限循环或重复)
  • 时间轴 ID 必须与根元素上的 data-composition-id 属性完全匹配

有关使用 GSAP 时间轴的完整指南,请参阅 GSAP 动画

字幕可发现性

对于字幕合成,在根节点上添加这些属性,以便框架能够识别并特殊处理字幕渲染:

<div
data-composition-id="captions"
data-timeline-role="captions"
data-caption-root="true"
...
>

输出检查清单

在渲染之前,请验证你的合成满足以下要求:
  • 每个合成的根元素都有 data-widthdata-height
  • 每个可复用的合成都位于自己的 HTML 文件中
  • 外部合成通过 data-composition-src 加载
  • 每个外部合成文件使用 <template> 包装器
  • 所有 GSAP 时间轴都以正确的 ID 注册在 window.__timelines
  • 定时可见元素(图像、div)有 class="clip"
  • 视频元素没有 class="clip"(框架直接管理它们)
  • 所有 data-start 引用都指向现有的 clip ID
  • 运行 npx hyperframes lint 自动捕获结构问题