
OpenMontage HyperFrames GSAP 适配器在 seek 驱动的视频渲染模型中编写 GSAP 时间线的实战参考【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage本文基于 OpenMontage 仓库中的 HyperFrames 动画技能文档 .agents/skills/hyperframes-animation/adapters/gsap.md系统讲解 GSAP 在 HyperFrames「seek 驱动」渲染模型下的完整使用契约从暂停时间线的注册方式、data-composition-id匹配规则到 Tween 方法速查、可动画属性白名单与性能约束。读完本文你能直接写出可被 HyperFrames 逐帧 seek、确定性可复现的 GSAP 合成代码并理解这些规则背后的原理。定位这是「受 HyperFrames 约束的 GSAP」不是通用 GSAP 教程该文档在技能体系中定位为GSAP API 参考scoped to HyperFrames它不是 GSAP 的通用教程而是把 GSAP 的 API 放在 HyperFrames 的渲染契约下重新约束。HyperFrames 从 HTML 逐帧渲染视频动画状态必须满足「同一时间值 → 同一像素」的确定性要求因此 vanilla GSAP 里许多常见写法在 HyperFrames 中是被禁止或需要替代的。文档开头明确给出了与其他技能文件的分工框架的整体合成契约data-*时序属性、子合成、确定性规则见 hyperframes-core时间线创建、位置参数与标签的展开说明见 gsap-timeline-and-labels.md缓动与 stagger 的展开说明见 gsap-easing-and-stagger.md变换、autoAlpha与性能规则见 gsap-transforms-and-perf.md打字机、音频可视化等可直接套用的效果配方见 rules/gsap-effects.md。HyperFrames 契约一条暂停的时间线 一个注册表注册模型HyperFrames 通过其 GSAP 运行时适配器控制动画。契约的三步是同步地创建一条暂停时间线gsap.timeline({ paused: true })以精确等于合成根节点data-composition-id的键注册到window.__timelines之后由 HyperFrames 负责 seek 这条时间线。文档给出的最小可运行示例完整继承自原文档script srchttps://cdn.jsdelivr.net/npm/gsap3.14.2/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>div>repeat: Math.max(0, Math.floor(duration / cycleDuration) - 1)两个细节都不可以错用floor而不是ceilceil会超出data-duration触发gsap_repeat_ceil_overshootlint 错误Math.max(0, …)防止出现负数 repeatGSAP 中负数 repeat 等价于无限循环。可动画属性白名单比 vanilla GSAP 更严格这是该文档与通用 GSAP 知识差异最大、也最容易踩坑的部分。文档明确指出 HyperFrames 比原生 GSAP 更严格只允许动画以下属性允许动画的属性合成器廉价属性compositor-cheapopacity、x、y、scale、scaleX、scaleY、rotation、rotationX、rotationY、skewX、skewY、transformOrigin视觉填充属性color、backgroundColor、borderColor、borderRadiusCSS 自定义属性如tl.to(.chart, { --hue: 180 })媒体volume作用于audio/video用于淡入淡出或 ducking闪避例如tl.to(#bgm, { volume: 0, duration: 1 }, outro);文档说明了其底层机制HyperFrames 运行时会从时间线中探测这些关键帧并在预览与渲染两条路径上以相同方式驱动它们二者一致。它设置的是「作者音量」当没有 tween 触达某个元素时data-volume是静态基线值。DOM 文本innerText用于数字计数器可以直接对innerText做 tween例如tl.to(el, { innerText: 100, snap: { innerText: 1 } });snap保证数值保持整数GSAP 检查器会将其识别为计数器。文档同时给出选择策略当还需要在同一个 tween 里驱动字号、本地化格式toLocaleString或后缀时应改用 counting-dynamic-scale.md 中的onUpdate代理形式。应避免的属性width/height/top/left/right/bottom/margin*/padding*—— 这些会触发浏览器布局重排reflow。替代方案是用scaleX/scaleY配合transformOrigin或x/y表达同样的视觉效果。被禁止的属性与写法display、visibility永远不要直接 tween 这两个离散属性。正确做法是autoAlpha——它在端点处同时设置opacity和visibility不 tween 离散属性本身细节见 gsap-transforms-and-perf.md任何由Math.random()、Date.now()、performance.now()或事件处理器驱动的状态动画状态必须只由时间值决定这是确定性渲染的根本要求。与外部文档的差异说明文档包含一条重要的勘误说明外部 HyperFrames 的gsap-animation.mdx文档把width/height/visibility也列入了「支持属性」但该列表对 HyperFrames 合成规则而言过于宽松。本技能文件中的白名单才是权威canonical版本。完整确定性契约见 determinism-rules.md其中还补充了本白名单之外的两条细节禁令不要用gsap.set()设置后续场景的 clip 元素它们在页面加载时还不存在于 DOM 中应改用时间线内定位的tl.set(selector, vars, time)也不要让多条时间线在同一时间动画化同一元素的同一属性GSAP 的 overwrite 行为依赖顺序可能在多次渲染之间翻转。时间线与标签把序列交给位置参数gsap-timeline-and-labels.md 把契约展开为可操作的时序语法核心是「位置参数」——.to()/.from()/.fromTo()的第三个实参形式含义0、1.5绝对时间秒0.5时间线末尾之后 0.5s-0.2时间线末尾之前 0.2sintro在intro标签处intro0.3在intro标签之后 0.3s与上一个 tween 同时开始在上一个 tween 结束后立即开始0.2在上一个 tween 开始之后 0.2s-0.1在上一个 tween 结束之前 0.1stl.to(.a, { x: 100 }, 0); tl.to(.b, { y: 50 }, ); // 与 .a 同时开始 tl.to(.c, { opacity: 0 }, 0.2); // .b 开始之后 0.2s文档给出两个工程化理由位置参数比delay:更自然地组合且在重排 tween 顺序的重构中更稳健用addLabel()命名节拍如intro/outro能让长时间线保持可读多个 tween 可以汇聚到同一标签而无需重复写绝对时间。嵌套只用于同一合成内部子时间线可以用master.add(child, 0)嵌套但文档划出一条明确边界不要把子合成的时间线嵌套进宿主时间线。通过data-composition-src加载的子合成由 HyperFrames 从其自身的data-start独立 seek嵌套只用于分组同一个合成内的时间线片段。子合成内优先fromTo而非from这是文档中最有深度的一条经验值得完整理解其原理。HyperFrames 每次宿主 clip 变为可见时都会重新 seek子合成。gsap.from()在注册时页面加载时快照起始状态当播放头跳回data-start之前时该快照可能与实际 CSS 状态失步元素会渲染在错误位置。而gsap.fromTo()显式声明两端seek 回去永远产生相同的起始状态// 子合成入场——干净地经受重新 seek tl.fromTo(.title, { y: 60, opacity: 0 }, { y: 0, opacity: 1, duration: 0.6 }, 0.2);文档同时给出例外顶层独立合成不存在「经挂载的重新 seek 循环」from与fromTo都可以。播放控制仅限调试/预览tl.play()、tl.pause()、tl.reverse()、tl.restart()、tl.time(2)、tl.progress(0.5)、tl.kill()这些 API 只在浏览器预览时有用。渲染输出中 HyperFrames 内部调用seek()——你的时间线必须在每次 seek 到同一时间值时产生完全相同的状态。缓动与 stagger运动语言的细节gsap-easing-and-stagger.md 补充了 gsap.md 速查表中ease与stagger两个条目的完整用法。要点包括缓动选择内置族为power1–power4、back、bounce、circ、elastic、expo、sine、none各带.in/.out/.inOut变体。经验法则是入场选.out、退场选.in、对称与连续运动选.inOutpower2.out是标准 UI 运动power3.out/power4.out用于标题卡等更强力的减速sine.inOut用于缓慢的环境漂移back.out(1.7)带轻微过冲elastic.out(1, 0.3)是弹簧回弹none用于与节拍对位的机械运动。文档还强调「缓动是语气」单一power2.out会产出扁平单调的运动每个合成应至少使用 3 种不同缓动。默认值推荐在时间线构造器里传defaults: { duration: 0.6, ease: power2.out }而不是gsap.defaults()全局设置——时间线作用域的默认值把该合成的运动语言集中在一个地方声明。stagger 对象形式stagger: { each, from, amount, grid, axis }from可取start/end/center/edges/random或索引amount设置 stagger 总时长同时设置时覆盖each。一个带stagger的 tween 优于 N 个手动 delay 的 tween且在目标数量或顺序变化时保持正确。函数式值任何 var 都可以是(index, target, targets) value的函数适合依赖索引的逐元素取值比循环构建 tween 更便宜、更地道。gsap.matchMedia仅限预览它适合浏览器中不同视口的预览与prefers-reduced-motion但不能替代按合成实际data-width/data-height渲染——HyperFrames 以固定视口渲染。变换与性能规则gsap-transforms-and-perf.md 补充了「变换别名 性能」这一侧的规则与白名单互相印证优先使用变换别名x、y、z、xPercent、yPercent、scaleX、rotation、transformOrigin等而不是原始transform字符串。别名让 GSAP 独立跟踪和插值每个轴避免同一元素上不同 tween 之间意外的相互覆盖。autoAlpha优于opacity做显隐autoAlpha: 0同时设置opacity: 0与visibility: hidden把元素从命中检测和可访问性树中移除比单纯的opacity: 0更接近「消失」clearProps在 tween 完成时移除 GSAP 写入的内联样式all或指定属性列表用于动画段落结束时把元素交还给 CSS相对与方向值20、-10、*2以及方向化旋转360_cw、-170_short、90_ccwSVGsvgOrigin在 SVG 全局坐标空间中设置变换原点不要与transformOrigin同时用在同一 SVG 元素上二者只能选一个SVG 变换属性用同一套别名x、y、rotation动画化即可。性能规则中有两条与 HyperFrames 渲染模型直接相关需要特别注意适用范围will-change克制使用只加在真正会动画的元素上到处滥用会烧内存gsap.quickTo仅限实时预览它面向事件驱动的高频更新指针移动、滚动、音频 scrub复用同一个 tween 而非每帧新建。文档明确指出——渲染模式没有输入事件渲染器逐帧 seekmousemove、scroll等事件永远不会触发quickTo的主要用例只存在于浏览器实时预览中。若要在渲染输出里做音频响应式运动正确路径是预先提取音频数据再声明式地驱动时间线参考 rules/gsap-effects.md 的音频可视化配方其数据提取脚本为skills/hyperframes-creative/scripts/extract-audio-data.py。最佳实践与反模式清单文档最后以两列清单收束全文。最佳实践Best Practices使用 camelCase 属性名优先变换别名与autoAlpha优先用时间线而不是靠 delay 串联的独立 tween使用位置参数用addLabel()添加标签保证时序可读把默认值传入时间线构造器需要控制播放时保存 tween/timeline 的返回值。禁止事项Do Not在变换足够时还去动画化布局属性width/height/top/left在同一 SVG 元素上同时使用svgOrigin与transformOrigin用delay串联动画而不用时间线编排在 DOM 存在之前创建 tween在 HyperFrames 合成中使用无限repeat: -1——用从可见时长计算出的有限 repeat 次数。仓库侧的落地证据与配套工具把文档放回 OpenMontage 仓库的整体语境可以看到三条佐证链说明这份 GSAP 契约不是孤立的知识文件而是贯穿工具链与技能体系的实际规范合成生成器直接产出契约代码。如前所述tools/video/hyperframes_compose.py 在生成的 HTML 中同步构建暂停时间线并注册window.__timelines[root]与本文的契约完全一致——OpenMontage 的视频合成流水线输出的就是这种「seek 友好」的合成结构。确定性规则有独立参考文档兜底。gsap.md 中每一处「避免」与「禁止」都能在 hyperframes-core 的 determinism-rules.md 中找到完整依据包括 repeat 的floor算法、lint 规则名gsap_repeat_ceil_overshoot、以及「不要用gsap.set()设置后续场景 clip」这类更细的禁令。技能体系有明确的检索路由。hyperframes-animation/SKILL.md 的路由表把「查 GSAP API / timeline / tweens / 位置参数」直接指向本文件并声明 GSAP 是 HyperFrames 默认运行时——其余六种运行时Lottie、Three.js、Anime.js、CSS keyframes、WAAPI、TypeGPU各有对应适配器文件且「多个运行时可以在一个合成中共存各自在自己的运行时全局变量上注册实例HyperFrames 一次 seek 全部覆盖」。同一 SKILL 还提供审计工具scripts/animation-map.mjs读取window.__timelines上注册的每条 GSAP 时间线枚举 tween、采样 bbox、计算标志位并输出animation-map.json用于创作后审查编排问题死区、stagger 一致性、生命周期告警。小结这份适配器的核心价值可以概括为一句话GSAP 负责「怎么写运动」HyperFrames 决定「哪些运动可被逐帧复现」。落到行动上就是四件事同步构建一条paused: true的时间线并以data-composition-id为键注册到window.__timelines用位置参数与标签编排时序而非 delay 串联只在合成器廉价的变换、视觉填充、CSS 变量、媒体volume与innerText计数这几类白名单属性上做动画把渲染时长交给data-duration把 repeat 计算成有限值。遵守这套契约后同一段代码在浏览器预览与最终渲染输出中会产生逐帧一致的画面——这正是「agentic 视频生产」里动画部分确定性的来源。【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考