尧图精选

使用 `controls.time` 实现动画序列跳转:在 motion 的 `animate(sequence)` 中定位并续播

🕒 发布时间:2026/10/1 2:05:25 📁 来源:尧图网络
前端UI组件【免费下载链接】motionA modern animation library for React and JavaScript项目地址https://gitcode.com/GitHub_Trending/mo/motion点击查看免费下载本篇技术指南围绕 motion 仓库README.md中针对 issue-2608 的处理方案展开核心主题是animate(sequence)返回的播放控制对象playback controls自带可读写的time属性通过赋值即可让序列跳转到任意时间点并从该位置继续执行剩余动画。读完本文你将掌握在按钮点击等交互场景中跳到序列特定位置并续播的标准写法、底层的时间分发与关键帧扁平化原理以及当前版本在按标签label跳转上的已知限制。一、问题背景2024 年的一条悬而未决的提问issue-2608 记录了一个 2024 年的用户问题0 条评论when click a button, I want to jump to a specific position in a sequence and execute the rest from there.即点击按钮时希望跳到一段动画序列中的某个特定位置并从该位置继续执行剩余部分。处理该问题的计划文档 plans/issues/issue-2608.md 将其分类为SUPPORT / COVERED BY EXISTING API——也就是说这个问题并不需要新增 API现有能力已经覆盖自时间线timeline/sequence功能诞生起animate(sequence)返回的控制对象就支持可设置的time。计划要求以带实例代码的完整回答来关闭该 issue。二、核心答案给controls.time赋值即可跳转续播计划文档给出的推荐回答recommended answer非常简洁可直接复制使用const controls animate(mySequence) // 稍后例如在按钮的 click handler 中 controls.time 2.5 // 单位秒 —— 跳转到该位置并继续播放 // controls.pause() / controls.play() / controls.speed 同样可用关键行为说明controls.time 2.5表示把整个序列seek到 2.5 秒处元素会立即采样到该时间点对应的属性值赋值后序列会从该位置继续播放而不是停在原地如果当前控制对象处于暂停或已结束finished状态需要先调用controls.play()再设置time以恢复播放配合controls.pause()、controls.play()、controls.speed等既有方法可以组合出暂停 → 拖到某位置 → 续播的完整交互体验。三、源码级原理time 是如何在整条序列上分发的3.1 序列返回的是 GroupAnimationtime 被广播到所有子动画animate(sequence)在 packages/framer-motion/src/animation/animate/index.ts 中识别到序列输入后会调用animateSequence为序列中每个 subject/value 生成独立动画再用GroupAnimationWithThen将所有动画包装成一个统一控制对象返回new GroupAnimationWithThen(animations)。这个分组控制对象的time读写实现在 packages/motion-dom/src/animation/GroupAnimation.tsget time() { return this.getAll(time) } set time(time: number) { this.setAll(time, time) }其中setAll会把新时间逐一写入每一个子动画GroupAnimation.tsprivate setAll(propName: PropNames, newValue: any) { for (let i 0; i this.animations.length; i) { ;(this.animations[i][propName] as any) newValue } }GroupAnimation同时支持speed、startTime、state、duration、iterationDuration等属性的统一分发以及play()、pause()、stop()、cancel()、complete()等方法的批量调用见 GroupAnimation.ts这保证了时间跳转与播放控制是一套自洽的完整语义。3.2 为什么按时间 seek是精确的关键帧绝对偏移扁平化计划文档指出序列在构建阶段会把每个 segment 拍平成每个 subject/value 一条带绝对偏移absolute offsets的关键帧动画实现位于 packages/framer-motion/src/animation/sequence/create.ts。createAnimationsFromSequence按顺序遍历序列数组通过calcNextTime(currentTime, transition.at, prevTime, timeLabels)解析每个 segment 的at时间支持绝对时间、/相对偏移、标签引用把 timeline 中每个关键帧落到全局绝对时间轴上。因此设置controls.time 2时每个子动画都精确采样到第 2 秒应处的状态采样之后序列从该全局时间点自然接续播放剩余片段——这正是jump to a specific position and execute the rest from there的实现基础由于时间轴是全局扁平化的跳转不存在半截片段的错位问题跳转结果与从头播放到该时刻的状态完全一致。四、测试验证仓库中已有的可设置 time 用例计划文档 Step 1 要求核对既有测试是否覆盖对animate()结果设置.time。经核查packages/framer-motion/src/animation/animate/tests/animate.test.tsx 中已有多个直接证据读写语义第 286-293 行创建animate(div, { x: 100 }, { duration: 10 })后断言animation.time初始为 0赋值为 5 后读回仍为 5跳到终点第 295-308 行暂停后animation.time 1采样值立即落到 duration 终点opacity 变为 0.5序列中的往返 scrub第 516-541 行对包含回调型 segment 的序列分别animation.time 0.5/1.5/0.5/1.5前后拖拽验证回调在越过阈值时触发、回退时触发 undo——这组用例直接证明了对整条序列而非单个动画设置 time 是精确且可反复 seek 的。这些测试与计划文档如果已有设置.time的测试则引用之的验证要求吻合也印证了该能力是被仓库持续保障的公共行为。五、已知限制按标签label跳转尚未暴露计划文档明确要求诚实地陈述一条已知限制序列支持给时间点命名标签label例如字符串形式的 segment 或带name的{ at, name }对象这些标签到时间的映射存放在createAnimationsFromSequence内部的timeLabels中sequence/create.ts是模块内部实现并未向用户暴露因此如果用户希望跳到名为intro的标签处今天必须自己把标签换算成时间例如通过已知各段 duration 累加计算再赋给controls.time。计划文档对这类需求的建议是若有真实诉求可单独提交一个聚焦的功能请求feature request而不要承诺该能力一定会被实现。六、完整实战示例按钮点击跳转序列位置综合以上一个可在 React/JavaScript 中直接套用的完整方案如下const sequence [ [box, { x: 0 }, { duration: 1 }], [box, { scale: 1.5 }, { duration: 1 }], [box, { rotate: 90 }, { duration: 1 }], [box, { y: 100 }, { duration: 1 }], ] const controls animate(sequence) // 跳转到序列 2.5 秒处并继续播放剩余动画 function jumpToMiddle() { if (controls.state finished || controls.state paused) { controls.play() } controls.time 2.5 } // 配合其他控制方法实现拖拽 scrub function scrubTo(t) { controls.pause() controls.time t }要点回顾controls.time单位始终为秒跳转后默认继续播放若对象处于暂停/结束态请先play()跳转精度由全局绝对时间轴保证可在序列内任意往返 seek按标签跳转当前不公开需要自行换算时间。七、计划本身的执行流程供参考issue-2608 的处理计划还展示了这类答案 关闭型 issue 的标准流程plans/issues/issue-2608.md先通过grep核对测试覆盖Step 1再由门禁plans/issues/README.md中对应行 APPROVED决定是否在 issue 上发布回答并调用 GitHub API 关闭Step 2。计划明确列出 STOP 条件若验证发现set time无法正确对序列 seek那将是真正的 bug需另立计划或门禁未通过则不得回答即关闭。该计划风险评级为 LOW、工作量 S且全程不修改任何源码文件。赞分享前端UI组件【免费下载链接】motionA modern animation library for React and JavaScript项目地址https://gitcode.com/GitHub_Trending/mo/motion点击查看免费下载相关推荐Motion 序列动画标签偏移在 at 选项中实现 label0.2 相对时间定位Motion 序列动画标签偏移在 at 选项中实现 label0.2 相对时间定位 导读 Motionframer motion的序列sequen前端UI组件novatorem高级技巧创建专属主题模板让你的GitHub主页脱颖而出novatorem高级技巧创建专属主题模板让你的GitHub主页脱颖而出 novatorem是一款能够将Spotify实时播放状态动态展示在GitHub个人在 Factory Bot 动态属性中使用序列Sequence的完整指南在 Factory Bot 动态属性中使用序列Sequence的完整指南 本文聚焦 Factory Bot 中「在动态属性dynamic attribut测试开发工具上一篇RuoYi-Vue-fast后端接口文档权限控制Swagger认证实现下一篇用 EPD-ConvLSTM 建模时间分辨野火蔓延wildfire_conv_lstm 数据集获取、模型推理与数据生成全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →