現(xiàn)動(dòng)畫序列跳轉(zhuǎn):在 motion 的 `animate(sequence)` 中定位并續(xù)播)
前端UI組件【免費(fèi)下載鏈接】motionA modern animation library for React and JavaScript項(xiàng)目地址https://gitcode.com/GitHub_Trending/mo/motion點(diǎn)擊查看免費(fèi)下載本篇技術(shù)指南圍繞 motion 倉(cāng)庫(kù)README.md中針對(duì) issue-2608 的處理方案展開核心主題是animate(sequence)返回的播放控制對(duì)象playback controls自帶可讀寫的time屬性通過(guò)賦值即可讓序列跳轉(zhuǎn)到任意時(shí)間點(diǎn)并從該位置繼續(xù)執(zhí)行剩余動(dòng)畫。讀完本文你將掌握在按鈕點(diǎn)擊等交互場(chǎng)景中跳到序列特定位置并續(xù)播的標(biāo)準(zhǔn)寫法、底層的時(shí)間分發(fā)與關(guān)鍵幀扁平化原理以及當(dāng)前版本在按標(biāo)簽label跳轉(zhuǎn)上的已知限制。一、問(wèn)題背景2024 年的一條懸而未決的提問(wèn)issue-2608 記錄了一個(gè) 2024 年的用戶問(wèn)題0 條評(píng)論when click a button, I want to jump to a specific position in a sequence and execute the rest from there.即點(diǎn)擊按鈕時(shí)希望跳到一段動(dòng)畫序列中的某個(gè)特定位置并從該位置繼續(xù)執(zhí)行剩余部分。處理該問(wèn)題的計(jì)劃文檔 plans/issues/issue-2608.md 將其分類為SUPPORT / COVERED BY EXISTING API——也就是說(shuō)這個(gè)問(wèn)題并不需要新增 API現(xiàn)有能力已經(jīng)覆蓋自時(shí)間線timeline/sequence功能誕生起animate(sequence)返回的控制對(duì)象就支持可設(shè)置的time。計(jì)劃要求以帶實(shí)例代碼的完整回答來(lái)關(guān)閉該 issue。二、核心答案給controls.time賦值即可跳轉(zhuǎn)續(xù)播計(jì)劃文檔給出的推薦回答recommended answer非常簡(jiǎn)潔可直接復(fù)制使用const controls animate(mySequence) // 稍后例如在按鈕的 click handler 中 controls.time 2.5 // 單位秒 —— 跳轉(zhuǎn)到該位置并繼續(xù)播放 // controls.pause() / controls.play() / controls.speed 同樣可用關(guān)鍵行為說(shuō)明controls.time 2.5表示把整個(gè)序列seek到 2.5 秒處元素會(huì)立即采樣到該時(shí)間點(diǎn)對(duì)應(yīng)的屬性值賦值后序列會(huì)從該位置繼續(xù)播放而不是停在原地如果當(dāng)前控制對(duì)象處于暫?;蛞呀Y(jié)束finished狀態(tài)需要先調(diào)用controls.play()再設(shè)置time以恢復(fù)播放配合controls.pause()、controls.play()、controls.speed等既有方法可以組合出暫停 → 拖到某位置 → 續(xù)播的完整交互體驗(yàn)。三、源碼級(jí)原理time 是如何在整條序列上分發(fā)的3.1 序列返回的是 GroupAnimationtime 被廣播到所有子動(dòng)畫animate(sequence)在 packages/framer-motion/src/animation/animate/index.ts 中識(shí)別到序列輸入后會(huì)調(diào)用animateSequence為序列中每個(gè) subject/value 生成獨(dú)立動(dòng)畫再用GroupAnimationWithThen將所有動(dòng)畫包裝成一個(gè)統(tǒng)一控制對(duì)象返回new GroupAnimationWithThen(animations)。這個(gè)分組控制對(duì)象的time讀寫實(shí)現(xiàn)在 packages/motion-dom/src/animation/GroupAnimation.tsget time() { return this.getAll(time) } set time(time: number) { this.setAll(time, time) }其中setAll會(huì)把新時(shí)間逐一寫入每一個(gè)子動(dòng)畫GroupAnimation.tsprivate setAll(propName: PropNames, newValue: any) { for (let i 0; i this.animations.length; i) { ;(this.animations[i][propName] as any) newValue } }GroupAnimation同時(shí)支持speed、startTime、state、duration、iterationDuration等屬性的統(tǒng)一分發(fā)以及play()、pause()、stop()、cancel()、complete()等方法的批量調(diào)用見(jiàn) GroupAnimation.ts這保證了時(shí)間跳轉(zhuǎn)與播放控制是一套自洽的完整語(yǔ)義。3.2 為什么按時(shí)間 seek是精確的關(guān)鍵幀絕對(duì)偏移扁平化計(jì)劃文檔指出序列在構(gòu)建階段會(huì)把每個(gè) segment 拍平成每個(gè) subject/value 一條帶絕對(duì)偏移absolute offsets的關(guān)鍵幀動(dòng)畫實(shí)現(xiàn)位于 packages/framer-motion/src/animation/sequence/create.ts。createAnimationsFromSequence按順序遍歷序列數(shù)組通過(guò)calcNextTime(currentTime, transition.at, prevTime, timeLabels)解析每個(gè) segment 的at時(shí)間支持絕對(duì)時(shí)間、/相對(duì)偏移、標(biāo)簽引用把 timeline 中每個(gè)關(guān)鍵幀落到全局絕對(duì)時(shí)間軸上。因此設(shè)置controls.time 2時(shí)每個(gè)子動(dòng)畫都精確采樣到第 2 秒應(yīng)處的狀態(tài)采樣之后序列從該全局時(shí)間點(diǎn)自然接續(xù)播放剩余片段——這正是jump to a specific position and execute the rest from there的實(shí)現(xiàn)基礎(chǔ)由于時(shí)間軸是全局扁平化的跳轉(zhuǎn)不存在半截片段的錯(cuò)位問(wèn)題跳轉(zhuǎn)結(jié)果與從頭播放到該時(shí)刻的狀態(tài)完全一致。四、測(cè)試驗(yàn)證倉(cāng)庫(kù)中已有的可設(shè)置 time 用例計(jì)劃文檔 Step 1 要求核對(duì)既有測(cè)試是否覆蓋對(duì)animate()結(jié)果設(shè)置.time。經(jīng)核查packages/framer-motion/src/animation/animate/tests/animate.test.tsx 中已有多個(gè)直接證據(jù)讀寫語(yǔ)義第 286-293 行創(chuàng)建animate(div, { x: 100 }, { duration: 10 })后斷言animation.time初始為 0賦值為 5 后讀回仍為 5跳到終點(diǎn)第 295-308 行暫停后animation.time 1采樣值立即落到 duration 終點(diǎn)opacity 變?yōu)?0.5序列中的往返 scrub第 516-541 行對(duì)包含回調(diào)型 segment 的序列分別animation.time 0.5/1.5/0.5/1.5前后拖拽驗(yàn)證回調(diào)在越過(guò)閾值時(shí)觸發(fā)、回退時(shí)觸發(fā) undo——這組用例直接證明了對(duì)整條序列而非單個(gè)動(dòng)畫設(shè)置 time 是精確且可反復(fù) seek 的。這些測(cè)試與計(jì)劃文檔如果已有設(shè)置.time的測(cè)試則引用之的驗(yàn)證要求吻合也印證了該能力是被倉(cāng)庫(kù)持續(xù)保障的公共行為。五、已知限制按標(biāo)簽label跳轉(zhuǎn)尚未暴露計(jì)劃文檔明確要求誠(chéng)實(shí)地陳述一條已知限制序列支持給時(shí)間點(diǎn)命名標(biāo)簽label例如字符串形式的 segment 或帶name的{ at, name }對(duì)象這些標(biāo)簽到時(shí)間的映射存放在createAnimationsFromSequence內(nèi)部的timeLabels中sequence/create.ts是模塊內(nèi)部實(shí)現(xiàn)并未向用戶暴露因此如果用戶希望跳到名為intro的標(biāo)簽處今天必須自己把標(biāo)簽換算成時(shí)間例如通過(guò)已知各段 duration 累加計(jì)算再賦給controls.time。計(jì)劃文檔對(duì)這類需求的建議是若有真實(shí)訴求可單獨(dú)提交一個(gè)聚焦的功能請(qǐng)求feature request而不要承諾該能力一定會(huì)被實(shí)現(xiàn)。六、完整實(shí)戰(zhàn)示例按鈕點(diǎn)擊跳轉(zhuǎn)序列位置綜合以上一個(gè)可在 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) // 跳轉(zhuǎn)到序列 2.5 秒處并繼續(xù)播放剩余動(dòng)畫 function jumpToMiddle() { if (controls.state finished || controls.state paused) { controls.play() } controls.time 2.5 } // 配合其他控制方法實(shí)現(xiàn)拖拽 scrub function scrubTo(t) { controls.pause() controls.time t }要點(diǎn)回顧controls.time單位始終為秒跳轉(zhuǎn)后默認(rèn)繼續(xù)播放若對(duì)象處于暫停/結(jié)束態(tài)請(qǐng)先play()跳轉(zhuǎn)精度由全局絕對(duì)時(shí)間軸保證可在序列內(nèi)任意往返 seek按標(biāo)簽跳轉(zhuǎn)當(dāng)前不公開需要自行換算時(shí)間。七、計(jì)劃本身的執(zhí)行流程供參考issue-2608 的處理計(jì)劃還展示了這類答案 關(guān)閉型 issue 的標(biāo)準(zhǔn)流程plans/issues/issue-2608.md先通過(guò)grep核對(duì)測(cè)試覆蓋Step 1再由門禁plans/issues/README.md中對(duì)應(yīng)行 APPROVED決定是否在 issue 上發(fā)布回答并調(diào)用 GitHub API 關(guān)閉Step 2。計(jì)劃明確列出 STOP 條件若驗(yàn)證發(fā)現(xiàn)set time無(wú)法正確對(duì)序列 seek那將是真正的 bug需另立計(jì)劃或門禁未通過(guò)則不得回答即關(guān)閉。該計(jì)劃風(fēng)險(xiǎn)評(píng)級(jí)為 LOW、工作量 S且全程不修改任何源碼文件。贊分享前端UI組件【免費(fèi)下載鏈接】motionA modern animation library for React and JavaScript項(xiàng)目地址https://gitcode.com/GitHub_Trending/mo/motion點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Motion 序列動(dòng)畫標(biāo)簽偏移在 at 選項(xiàng)中實(shí)現(xiàn) label0.2 相對(duì)時(shí)間定位Motion 序列動(dòng)畫標(biāo)簽偏移在 at 選項(xiàng)中實(shí)現(xiàn) label0.2 相對(duì)時(shí)間定位 導(dǎo)讀 Motionframer motion的序列sequen前端UI組件novatorem高級(jí)技巧創(chuàng)建專屬主題模板讓你的GitHub主頁(yè)脫穎而出novatorem高級(jí)技巧創(chuàng)建專屬主題模板讓你的GitHub主頁(yè)脫穎而出 novatorem是一款能夠?qū)potify實(shí)時(shí)播放狀態(tài)動(dòng)態(tài)展示在GitHub個(gè)人在 Factory Bot 動(dòng)態(tài)屬性中使用序列Sequence的完整指南在 Factory Bot 動(dòng)態(tài)屬性中使用序列Sequence的完整指南 本文聚焦 Factory Bot 中「在動(dòng)態(tài)屬性dynamic attribut測(cè)試開發(fā)工具上一篇RuoYi-Vue-fast后端接口文檔權(quán)限控制Swagger認(rèn)證實(shí)現(xiàn)下一篇用 EPD-ConvLSTM 建模時(shí)間分辨野火蔓延wildfire_conv_lstm 數(shù)據(jù)集獲取、模型推理與數(shù)據(jù)生成全指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考