日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

如何在Vue中實(shí)現(xiàn)Svelte的Defer Transition

瀏覽:32日期:2022-09-30 17:19:02

最近觀看了Rich Harris的<Rethinking Reactivity>視頻,驚嘆于Svelte框架的高效同時(shí),還發(fā)現(xiàn)了Vue所不具備的一些關(guān)于動(dòng)畫的原生支持—defer transitions.

先看看Svelte所謂的defer transition的效果吧。

如何在Vue中實(shí)現(xiàn)Svelte的Defer Transition

這是使用Svelte做的Todo Demo應(yīng)用。整個(gè)todo分成3個(gè)部分。輸入部分,todo列表和done列表。當(dāng)點(diǎn)擊todo列表中的條目時(shí),相應(yīng)條目會(huì)被“移動(dòng)”到done列表,反之亦然。

在這里,條目從一個(gè)列表轉(zhuǎn)移到另一個(gè)列表,不是很突兀的閃現(xiàn),而是非常友好地從點(diǎn)擊處,移動(dòng)到目的地;同時(shí),當(dāng)列表中條目離開(kāi)時(shí),剩余的條目會(huì)絲滑地向上移動(dòng)填補(bǔ)空缺的位置。在Svelte里,只需要僅僅加上幾行代碼,就能實(shí)現(xiàn),對(duì)于開(kāi)發(fā)者非常友好且高效。 參考如下代碼或者Svelte教程

{#each todos.filter(t => !t.done) as todo (todo.id)} <labelin:receive='{{key: todo.id}}'out:send='{{key: todo.id}}'animate:flip><input type=checkbox on:change={() => mark(todo, true)}> {todo.description} <button on:click='{() => remove(todo)}'>remove</button> </label>{/each}

僅僅在element上加上了in、out和animate屬性。這里,in和out各自接受框架提供的函數(shù)receive和send并且給他們提供了篩選條件。 animate屬性接收內(nèi)置的flip方法。這里的flip不是翻轉(zhuǎn),而是FLIP技術(shù)技術(shù),vue在<transition-group>中也有用到。主要用于整體移動(dòng)列表剩余條目去填補(bǔ)所失去元素的位置。

于是我就在想,如果是Vue的話,如何能達(dá)到相應(yīng)的效果呢。 (不想看詳細(xì)說(shuō)明的話,可以直接查看code pen中的代碼)

Vue原生提供了兩個(gè)組件支持動(dòng)畫。transition和transition-group。由于是list的移動(dòng),所以我們這里使用transition-group。具體使用方法可以參考Vue教程Transitions & Animation。

要想達(dá)到同樣的效果,有兩大UI動(dòng)畫效果要實(shí)現(xiàn)。

列表中條目消失時(shí),剩余條目移動(dòng)補(bǔ)齊空位條目消失同時(shí)在另外一個(gè)列表插入時(shí),條目移動(dòng)第一個(gè)需求的實(shí)現(xiàn)比較簡(jiǎn)單,vue原生已經(jīng)提供了良好的支持,參考Vue文檔中的List-Move-Transitions即可

為了實(shí)現(xiàn)第二個(gè)需求,有幾個(gè)問(wèn)題必須解決:

消失條目的位置信息 插入條目的位置信息 動(dòng)效開(kāi)始與結(jié)束的時(shí)機(jī)

我們先看看前兩個(gè)問(wèn)題的如何解決。根據(jù)文檔的介紹,transition-group提供了javascript hook。分別是:

v-on:before-enter v-on:enter v-on:after-enter v-on:enter-cancelled v-on:before-leave v-on:leave v-on:after-leave v-on:leave-cancelled

可視化表示的話,大概是如下圖所示:

如何在Vue中實(shí)現(xiàn)Svelte的Defer Transition

before-enter: 用于設(shè)置插入條目的transition的初始值。此時(shí)無(wú)法獲取BoundingClientRect. enter: 動(dòng)效期。此時(shí)enter鉤子函數(shù)的入?yún)l能獲取boundingClientRect after-enter: 動(dòng)效結(jié)束后的回調(diào)函數(shù) enter-cancelled: 取消enter的鉤子

leave也是類似。

所以,我們能拿到條目元素DOMRect信息的時(shí)機(jī)只有enter和leave的時(shí)候。

這樣,我們就可以在leave時(shí)候,拿到leave條目的DOMRect數(shù)據(jù)并且保存起來(lái)。在enter的時(shí)候, 我們就能同時(shí)擁有l(wèi)eave條目和enter條目的位置信息了。

位置信息是拿到了,那怎么才能在條目進(jìn)入的時(shí)候,有從消失條目移動(dòng)過(guò)來(lái)的效果呢。(可以先想想, 再看后面的解釋)。

所以,我們想要達(dá)成移動(dòng)的效果,首先需要隱藏掉leave條目元素,

leave(el, done) { console.log('before leave'); const rect = el.getBoundingClientRect(); sendRectMap.set(el.dataset.key, rect); el.style.display = 'none';},

然后給enter條目元素設(shè)定關(guān)于位置初始狀態(tài),初始化的位置即為leave條目元素的位置,然后當(dāng)transition開(kāi)始生效的時(shí)候,讓其位置恢復(fù)到插入(enter)的位置。

這種方法其實(shí)就是所謂的FLIP技術(shù)。transition-group組件里也使用了這種技術(shù)來(lái)移動(dòng)剩余列表填充移走條目空白。

var first = el.getBoundingClientRect();// Now set the element to the last position.el.classList.add(’totes-at-the-end’);// Read again. This forces a sync// layout, so be careful.var last = el.getBoundingClientRect();// You can do this for other computed// styles as well, if needed. Just be// sure to stick to compositor-only// props like transform and opacity// where possible.var invert = first.top - last.top;// Invert.el.style.transform = `translateY(${invert}px)`;// Wait for the next frame so we// know all the style changes have// taken hold.requestAnimationFrame(function() { // Switch on animations. el.classList.add(’animate-on-transforms’); // GO GO GOOOOOO! el.style.transform = ’’;});

那么接下來(lái)的問(wèn)題就是,在什么時(shí)機(jī)去設(shè)置enter條目元素transition的初始狀態(tài),在什么時(shí)機(jī)去設(shè)置enter條目元素transition的結(jié)束時(shí)狀態(tài)。

按照上面提到的javascript hook,我們可以在before-enter鉤子函數(shù)里設(shè)置初始狀態(tài),接著在enter鉤子函數(shù)里設(shè)置transition結(jié)束狀態(tài)。那么,我們的初始狀態(tài)是什么呢?我們通過(guò)getBoundingClientRect,可以獲取到enter元素(后用to來(lái)標(biāo)識(shí))的DOMRect數(shù)據(jù),包括top, left, bottom, right, width, height , x, y。 同時(shí)我們也能通過(guò)之前保存的leave位置map獲取到leave條目的位置信息(稱為from)。所以在before-enter時(shí),我們通過(guò)計(jì)算得到的偏移量,通過(guò)translate去初始化to元素的位置。然后再在enter階段,translate其值到from, 再加上transition到css中即可。

在before-enter鉤子中:

// 移動(dòng)元素的標(biāo)識(shí)符const key = el.dataset.key;// enter條目 map,注意這里,在before-enter鉤子中,// receiveRectMap是get不到to的。需要特殊處理。后面有提及const to = receiveRectMap.get(key);// leave條目 mapconst from = sendRectMap.get(key);// 計(jì)算偏移量const dx = from.left - to.left;const dy = from.top - to.top;// 初始化to條目的位置el.style.transform = `translate(${dx}px, ${dy}px)`;el.style.opacity = 0;

在enter鉤子中:

el.style.transition = 'all 800ms';el.style.transform = '';el.style.opacity = 1;el.style.display = 'block';

上面的代碼中,在before-enter里面,to是通過(guò)receiveRectMap.get(key)來(lái)獲取的。但是,這時(shí),receiveRectMap中還沒(méi)有對(duì)應(yīng)key的DOMRect值。雖然,before-enter的入?yún)⑹莈l(HTMLElement),但是該el元素的DOMRect中的所有值都為0,所以我們需要在enter方法中,把el塞入到receiveRectMap中。這樣就會(huì)有一個(gè)矛盾,那就是無(wú)法在before-enter中通過(guò)translate初始化to元素的位置了。所以,我們這里使用defer transition技術(shù),延遲transition的發(fā)生。

我們可以在enter中使用setTimeout或者requestAnimationFrame實(shí)現(xiàn)defer transition,

requestAnimationFrame(() => {const key = el.dataset.key; // 這樣,receiveRectMap中就有該key的值了。const to = receiveRectMap.get(key);const from = sendRectMap.get(key);const dx = from.left - to.left;const dy = from.top - to.top;// 由于我們延遲了transition的發(fā)生,// 所以to元素的位置其實(shí)已經(jīng)到達(dá)了目的地位置,// 所以我們需要使用transition手動(dòng)地將其過(guò)渡到from位置,這一行很重要el.style.transition = 'all 0ms';el.style.transform = `translate(${dx}px, ${dy}px)`;// 初始化結(jié)束后,在下一個(gè)animation frame中,使用FLIP技術(shù),使其移動(dòng)回來(lái)。requestAnimationFrame(() => { el.style.transition = 'all 800ms'; el.style.transform = ''; el.style.opacity = 1; el.style.display = 'block';}); });

完整代碼可以參考codepen

最后效果:

如何在Vue中實(shí)現(xiàn)Svelte的Defer Transition

以上就是如何在Vue中實(shí)現(xiàn)Svelte的Defer Transition的詳細(xì)內(nèi)容,更多關(guān)于Vue 實(shí)現(xiàn)Svelte的Defer Transition的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产综合亚洲精品一区二| 999精品在线| 国产亚洲久久| 欧美日韩一区自拍| 国产一二在线播放| 欧美日韩国产一区精品一区| 人人爽香蕉精品| 国产亚洲欧美日韩精品一区二区三区 | 欧美极品一区二区三区| 精品视频免费| 日韩毛片在线| 亚洲精品高潮| 老司机免费视频一区二区三区| 日韩不卡视频在线观看| 国产精品女主播一区二区三区| 日韩三级久久| av最新在线| 亚洲三级av| 高潮一区二区| 综合色就爱涩涩涩综合婷婷| 国产一区二区亚洲| 久久电影一区| 极品av在线| 亚洲精品伊人| 日韩电影免费网站| 日韩有码av| 久久视频一区| 亚洲一区二区av| 激情视频网站在线播放色| 国产亚洲综合精品| 九九久久国产| 石原莉奈在线亚洲三区| 精品国产网站| 六月丁香综合| 精品72久久久久中文字幕| 久久国产精品99国产| 国产一区二区三区四区二区| 中文字幕日韩高清在线| 亚洲日本网址| 国产精久久久| 老牛国产精品一区的观看方式| 国语对白精品一区二区| 在线精品视频在线观看高清| 国产精品免费99久久久| 在线亚洲观看| 亚洲午夜天堂| 国产欧美91| 国产精品婷婷| 岛国av在线播放| 日韩avvvv在线播放| 亚洲婷婷在线| 黑人精品一区| 国产精品视频一区二区三区综合| 国产色综合网| 日本免费一区二区三区四区| 91成人在线精品视频| av成人国产| 久久99国产精品视频| 日韩精品一区二区三区av| 欧美高清不卡| 美女一区网站| 精品国产精品久久一区免费式 | 亚洲在线国产日韩欧美| 免费看av不卡| 精品一区二区三区中文字幕视频| 婷婷五月色综合香五月| 精品91久久久久| 四虎884aa成人精品最新| 精品三区视频| 欧美日韩一区自拍| 亚洲精品系列| 视频一区中文字幕| 亚洲精品99| 激情久久久久久久| 日本а中文在线天堂| 精品久久久亚洲| 国产精品久久久久久久免费软件 | 欧美日韩在线网站| 成人亚洲一区| 美女国产精品久久久| 日韩动漫一区| 日韩专区欧美专区| 夜夜嗨av一区二区三区网站四季av| 日韩国产在线| 色综合五月天| 中文字幕成在线观看| 国产成人免费| 久久久久黄色| 久久伊人亚洲| 精品入口麻豆88视频| 久久精品一本| 久久亚洲资源中文字| 捆绑调教美女网站视频一区| 麻豆精品国产91久久久久久| 久久免费精品| 精品视频久久| 高清日韩欧美| 日韩一区二区三区免费播放| 免费看av不卡| 日韩精品午夜| 午夜影院欧美| 国产午夜精品一区二区三区欧美| 一区福利视频| 国产精品人人爽人人做我的可爱| 国产精品美女久久久| 丝袜脚交一区二区| 亚洲精品动态| 欧美日韩1区2区3区| 国产欧美一区二区三区国产幕精品| 国产精品亚洲欧美日韩一区在线| 麻豆精品国产91久久久久久| 国产精品一站二站| 欧美成人精品一级| а√天堂8资源在线| 久久久久久久久99精品大| 欧美精选一区二区三区| 鲁大师影院一区二区三区| 亚洲综合中文| 国产美女视频一区二区| 久久永久免费| 久久香蕉国产| 麻豆成人在线| 国产亚洲精品美女久久久久久久久久| 国产九一精品| 国产拍在线视频| 国产视频亚洲| 日韩在线成人| 在线中文字幕播放| 亚洲在线一区| 国产日韩欧美在线播放不卡| 久久久久久久欧美精品| 美女av在线免费看| 欧美女激情福利| 综合色就爱涩涩涩综合婷婷| 国产日韩三级| 成人高清一区| 不卡在线一区二区| 日本欧美一区| av高清不卡| 午夜一区在线| 国产欧美日韩精品一区二区三区| 中文字幕色婷婷在线视频| 中文精品视频| 国产精品美女午夜爽爽| 久久久精品五月天| 日韩在线卡一卡二| 国产精品网站在线看| 国产伦久视频在线观看| 午夜久久tv| 国产精品欧美三级在线观看| 日韩在线看片| 日韩精品中文字幕吗一区二区 | 亚洲婷婷在线| 久久国产日韩欧美精品| 丝袜美腿一区| 日本不卡视频在线| 国产精品亚洲一区二区三区在线观看| 午夜精品一区二区三区国产| 国产亚洲电影| 99久久久久国产精品| 日韩高清成人在线| 亚洲v在线看| 欧美亚洲一级| 五月天久久网站| 久久久久97| 久久不射中文字幕| 视频在线不卡免费观看| 亚洲尤物av| 夜鲁夜鲁夜鲁视频在线播放| 亚洲精品自拍| 少妇久久久久| 国产精品mv在线观看| 久久久久美女| 国产精品免费精品自在线观看| 悠悠资源网久久精品| 国语对白精品一区二区| 色综合视频一区二区三区日韩 | 精品国产亚洲日本| 噜噜噜久久亚洲精品国产品小说| 久久影视三级福利片| 免费在线成人网| 中文字幕系列一区| 免费视频一区二区三区在线观看| 亚洲欧美日韩精品一区二区| 国产va在线视频| 日韩精品视频网站| 99国产精品久久久久久久| 国产高潮在线| 国产精品免费大片| 日韩一区精品| 美女网站久久| 国产精品99免费看| 国产h片在线观看| 久久超级碰碰| 日韩精品欧美大片| 视频在线在亚洲| 九一成人免费视频| 国产精品yjizz视频网| 久久不见久久见中文字幕免费 | 国产午夜精品一区二区三区欧美|