做(zuò)自(zì)由與創造的先行(xíng)者

TransitionGroup

Vue.js中文手冊

<TransitionGroup> 是一(yī)個內(nèi)置組件,用于對 v-for 列表中的元素或組件的插入、移除和(hé)順序改變添加動畫(huà)效果。

和(hé) <Transition> 的區(qū)别

<TransitionGroup> 支持和(hé) <Transition> 基本相同的 props、CSS 過渡 class 和(hé) JavaScript 鈎子監聽器,但(dàn)有以下(xià)幾點區(qū)别:

默認情況下(xià),它不會渲染一(yī)個容器元素。但(dàn)你可(kě)以通(tōng)過傳入 tag prop 來指定一(yī)個元素作(zuò)為(wèi)容器元素來渲染。

過渡模式在這(zhè)裏不可(kě)用,因為(wèi)我們不再是在互斥的元素之間(jiān)進行(xíng)切換。

列表中的每個元素都(dōu)必須有一(yī)個獨一(yī)無二的 key attribute。

CSS 過渡 class 會被應用在列表內(nèi)的元素上(shàng),而不是容器元素上(shàng)。

TIP

當在 DOM 模闆中使用時(shí),組件名需要(yào)寫為(wèi) <transition-group>。

進入 / 離開(kāi)動畫(huà)

這(zhè)裏是 <TransitionGroup> 對一(yī)個 v-for 列表添加進入 / 離開(kāi)動畫(huà)的示例:

template

<TransitionGroup name="list" tag="ul">

<li v-for="item in items" :key="item">

{{ item }}

</li>

</TransitionGroup>

css

.list-enter-active,

.list-leave-active {

transition: all 0.5s ease;

}

.list-enter-from,

.list-leave-to {

opacity: 0;

transform: translateX(30px);

}

移動動畫(huà)

上(shàng)面的示例有一(yī)些明(míng)顯的缺陷:當某一(yī)項被插入或移除時(shí),它周圍的元素會立即發生“跳(tiào)躍”而不是平穩地(dì)移動。我們可(kě)以通(tōng)過添加一(yī)些額外(wài)的 CSS 規則來解決這(zhè)個問(wèn)題:

css

.list-move, /* 對移動中的元素應用的過渡 */

.list-enter-active,

.list-leave-active {

transition: all 0.5s ease;

}

.list-enter-from,

.list-leave-to {

opacity: 0;

transform: translateX(30px);

}

/* 确保将離開(kāi)的元素從(cóng)布局流中删除

以便能(néng)夠正确地(dì)計算移動的動畫(huà)。 */

.list-leave-active {

position: absolute;

}

漸進延遲列表動畫(huà)

通(tōng)過在 JavaScript 鈎子中讀取元素的 data attribute,我們可(kě)以實現帶漸進延遲的列表動畫(huà)。首先,我們把每一(yī)個元素的索引渲染為(wèi)該元素上(shàng)的一(yī)個 data attribute:

template

<TransitionGroup

tag="ul"

:css="false"

@before-enter="onBeforeEnter"

@enter="onEnter"

@leave="onLeave"

>

<li

v-for="(item, index) in computedList"

:key="item.msg"

:data-index="index"

>

{{ item.msg }}

</li>

</TransitionGroup>

接着,在 JavaScript 鈎子中,我們基于當前元素的 data attribute 對該元素的進場動畫(huà)添加一(yī)個延遲。以下(xià)是一(yī)個基于 GreenSock library 的動畫(huà)示例:

js

function onEnter(el, done) {

gsap.to(el, {

opacity: 1,

height: '1.6em',

delay: el.dataset.index * 0.15,

onComplete: done

})

}

網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發
下(xià)一(yī)篇:KeepAlive
上(shàng)一(yī)篇:Transition