vue 組件中使用 transition 和 transition-group實(shí)現(xiàn)過渡動畫
前言
記一次vue 組件中使用 transition 和 transition-group 設(shè)置過渡動畫,總結(jié)來說可分為分為 name 版, js 鉤子操作類名版, js 鉤子操作行內(nèi)樣式版...
template模板結(jié)構(gòu)
// 單個元素
<transition name="自定義名字">
<p v-if="show">hello</p>
</transition>
// 列表元素: 注意group的直接子元素是v-for渲染出來的
<ul class="list">
<transition-group name="list">
<li v-for="(item, index) in gameList" :key="item.id">
<app-horizontal :itemData="item"></app-horizontal>
</li>
</transition-group>
</ul>
name 版,name 為組件中的屬性
出現(xiàn)的過程: name-enter(初始態(tài)) => name-enter-active(中間態(tài)) => name-enter-to(終止態(tài))
消失的過程: name-leave => name-leave-active => name-leave-to
以進(jìn)場過渡動畫為例子
我們可以分別設(shè)置 enter 階段 和 enter-to 階段的動畫
1.設(shè)置進(jìn)入時需要過渡的屬性
.name-enter
{
opacity: 0;
transform: translateY(30px)
}
2.然后在 name-enter-active中設(shè)置過渡時間
.name-enter-active {
transition: all .3s;
}
3.最后在 name-enter-to 中寫上終止態(tài)屬性
其實(shí)終止態(tài)的opacity: 1;transform: none; 是默認(rèn)的,可以不用寫
.name-enter-to {
opacity: 1;
transform: translateY(0);
}
如果要給列表中的元素設(shè)置交錯的效果, 元素不多的話可以添加 delay 屬性
.name-enter-active:nth-child(3n+1) {
transition-delay: 0s;
}
.name-enter-active:nth-child(3n+2) {
transition-delay: .1s;
}
.name-enter-active:nth-child(3n+3) {
transition-delay: .2s;
}
離場動畫同理...
js 鉤子實(shí)現(xiàn)過渡動畫: 通過操作類名; 就是 name 版的 js 實(shí)現(xiàn)
// 例如實(shí)現(xiàn)上述列表依次顯示
<ul class="list">
<transition-group
v-bind:css="false"
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter">
<li v-for="(item, index) in gameList"
:key="item.id"
:data-delay="index*100"
>
<app-horizontal :itemData="item"></app-horizontal>
</li>
</transition-group>
</ul>
//
methods: {
// 事先定義上述類名
// 在beforeEnter enter afterEnter 鉤子中手動操作上述類名
// 初始態(tài)
beforeEnter(dom) {
dom.classList.add('list-enter', 'list-enter-active');
},
// 中間態(tài)
enter(dom,done) {
// 通過 setTimeout + dataset 實(shí)現(xiàn)過渡
let delay = dom.dataset.delay;
setTimeout(function () {
dom.classList.remove('list-enter');
dom.classList.add('list-enter-to');
//監(jiān)聽 transitionend 事件
var transitionend = window.ontransitionend ? "transitionend" : "webkitTransitionEnd";
dom.addEventListener(transitionend, function onEnd() {
// 移除事件
dom.removeEventListener(transitionend, onEnd);
//調(diào)用done(),表示動畫已完成
done()
});
}, delay)
},
// 終止態(tài)
afterEnter(dom) {
dom.classList.remove('list-enter-to', 'list-enter-active');
}
}
js 鉤子過渡動畫: 通過操作行內(nèi)屬性, 自定義動畫
<ul class="list">
<transition-group
v-bind:css="false"
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter">
<li v-for="(item, index) in gameList"
:key="item.id"
:data-delay="index*100"
data-y = "100%"
>
<app-horizontal :itemData="item"></app-horizontal>
</li>
</transition-group>
</ul>
// 對應(yīng)的操作方法; 添加自定義的 dataset,給dom設(shè)置css樣式;根據(jù)需求添加
methods: {
// 初始態(tài)
beforeEnter(dom) {
let { x = 0, y = 0, opacity = 0 } = dom.dataset;
dom.style.cssText = `transition: .3s;opacity: ${opacity};transform: translateX(${x}) translateY(${y});`;
},
// 中間態(tài)
enter(dom,done) {
let delay = dom.dataset.delay;
setTimeout(function () {
dom.style.cssText = `transition: .3s;opacity: 1;transform: translateX(0) translateY(0);`;
//監(jiān)聽 transitionend 事件
var transitionend = window.ontransitionend ? "transitionend" : "webkitTransitionEnd";
dom.addEventListener(transitionend, function onEnd() {
dom.removeEventListener(transitionend, onEnd);
done();
});
}, delay)
},
// 終止態(tài)
afterEnter(dom) {
dom.style.cssText = "";
}
}
這里記錄一下監(jiān)聽css3的animation動畫和transition事件:
webkit-animation動畫有三個事件: 開始事件: webkitAnimationStart 結(jié)束事件: webkitAnimationEnd 重復(fù)運(yùn)動事件: webkitAnimationIteration css3的過渡屬性transition: 一個事件 過渡結(jié)束: webkitTransitionEnd
總結(jié)
以上所述是小編給大家介紹的vue 組件中使用 transition 和 transition-group實(shí)現(xiàn)過渡動畫 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
詳解vue的數(shù)據(jù)劫持以及操作數(shù)組的坑
這篇文章主要介紹了vue的數(shù)據(jù)劫持以及操作數(shù)組的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
VUE中對object.object和object[object]的使用解讀
這篇文章主要介紹了VUE中對object.object和object[object]的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
Vue3之toRefs和toRef在reactive中的一些應(yīng)用方式
這篇文章主要介紹了Vue3之toRefs和toRef在reactive中的一些應(yīng)用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
vue.js提交按鈕時進(jìn)行簡單的if判斷表達(dá)式詳解
這篇文章主要給大家介紹了關(guān)于vue.js提交按鈕時如何進(jìn)行簡單的if判斷表達(dá)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
LRU算法在Vue內(nèi)置組件keep-alive中的使用
LRU算法全稱為least recently use 最近最少使用,核心思路是最近被訪問的以后被訪問的概率會變高,那么可以把之前沒被訪問的進(jìn)行刪除,維持一個穩(wěn)定的最大容量值,從而不會導(dǎo)致內(nèi)存溢出。2021-05-05
淺談vue+webpack項(xiàng)目調(diào)試方法步驟
本篇文章主要介紹了淺談vue+webpack項(xiàng)目調(diào)試方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09

