vue 巧用過(guò)渡效果(小結(jié))
vue提供的了transition組件來(lái)實(shí)現(xiàn)組件的過(guò)渡和路由的過(guò)渡,合理使用這個(gè)組建可以讓我們的頁(yè)面更加的靈活,提高用戶體驗(yàn)。
概念
在進(jìn)入/離開的過(guò)渡中, 會(huì)有6個(gè)class的切換, 抄一張官方的圖

- v-enter:定義進(jìn)入過(guò)渡的開始狀態(tài)。在元素被插入之前生效,在元素被插入之后的下一幀移除。
- v-enter-active:定義進(jìn)入過(guò)渡生效時(shí)的狀態(tài)。在整個(gè)進(jìn)入過(guò)渡的階段中應(yīng)用,在元素被插入之前生效,在過(guò)渡/動(dòng)畫完成之后移除。這個(gè)類可以被用來(lái)定義進(jìn)入過(guò)渡的過(guò)程時(shí)間,延遲和曲線函數(shù)。
- v-enter-to: 2.1.8版及以上 定義進(jìn)入過(guò)渡的結(jié)束狀態(tài)。在元素被插入之后下一幀生效 (與此同時(shí) v-enter 被移除),在過(guò)渡/動(dòng)畫完成之后移除。
- v-leave: 定義離開過(guò)渡的開始狀態(tài)。在離開過(guò)渡被觸發(fā)時(shí)立刻生效,下一幀被移除。
- v-leave-active:定義離開過(guò)渡生效時(shí)的狀態(tài)。在整個(gè)離開過(guò)渡的階段中應(yīng)用,在離開過(guò)渡被觸發(fā)時(shí)立刻生效,在過(guò)渡/動(dòng)畫完成之后移除。這個(gè)類可以被用來(lái)定義離開過(guò)渡的過(guò)程時(shí)間,延遲和曲線函數(shù)。
- v-leave-to: 2.1.8版及以上 定義離開過(guò)渡的結(jié)束狀態(tài)。在離開過(guò)渡被觸發(fā)之后下一幀生效 (與此同時(shí) v-leave 被刪除),在過(guò)渡/動(dòng)畫完成之后移除。
看起來(lái)還是有有點(diǎn)亂,先來(lái)捋一下。

enter 定義開始的狀態(tài), active定義過(guò)程, enter定義結(jié)束, 但是在實(shí)際進(jìn)行的時(shí)候是有交叉的。 通過(guò)斷點(diǎn)可以發(fā)現(xiàn),
- 添加v-enter
- 添加v-enter-active,
- 卸載v-enter
- 添加v-ernter-to
- 卸載v-enter-to和v-enter-active
// transition: all 2s;
.move-enter {
margin-left: 0;
}
.move-enter-active {
margin-left: 100px;
}
.move-enter-to {
margin-left: 200px;
}
例如在上面這種情況下, 過(guò)渡動(dòng)畫會(huì)怎么進(jìn)行呢?

這里要注意兩點(diǎn)。
- enter-active覆蓋掉了enter的起點(diǎn)位置
- 一共經(jīng)過(guò)了兩次過(guò)渡, enter-to是在active結(jié)束之后開始的, 所以第四秒, 才回到dom元素本身的位置。
所以官方文檔之, 也是使用v-enter定義起點(diǎn)位置, 在enter-active中控制效果。
利用class實(shí)現(xiàn)過(guò)渡效果
在這6個(gè)class之上, 利用transition或者動(dòng)畫, 都可以實(shí)現(xiàn)我們需要的效果。 舉個(gè)栗子, 這里我們直接將所有的路由改變都定義一個(gè)過(guò)渡效果,
appear屬性表示頁(yè)面初次加載的時(shí)候也適用于動(dòng)畫
<transition appear name="move"> <router-view></router-view> </transition>
@keyframes animationIn {
0% {
transform: translate(-100%, 0);
}
100% {
transform: translate(0, 0);
}
}
@keyframes animationOut {
0% {
transform: translate(0, 0);
}
100% {
transform: translate(100%, 0);
}
}
.move-enter {
transform: translate(-100%, 0);
position: absolute!important;
z-index: 999;
top: 0;
left: 0;
width: 100%;
}
.move-enter-active {
animation: animationIn 0.2s;
position: absolute!important; // 進(jìn)入的組件要覆蓋掉移除的組件,參考 //https://cn.vuejs.org/v2/guide/transitions.html#%E8%BF%87%E6%B8%A1%E6%A8%A1%E5%BC%8F
z-index: 999;
top: 0;
left: 0;
width: 100%;
}
.move-leave {
transform: translate(0, 0);
}
.move-leave-active {
animation: animationOut 0.2s;
}
效果

JavaScript 鉤子
這些鉤子函數(shù)可以結(jié)合 CSS transitions/animations 使用
<transition v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:after-enter="afterEnter" v-on:enter-cancelled="enterCancelled" v-on:before-leave="beforeLeave" v-on:leave="leave" v-on:after-leave="afterLeave" v-on:leave-cancelled="leaveCancelled" > <!-- ... --> </transition>
在這些鉤子中, 可以使用其他第三方庫(kù),回調(diào)中的el將是真實(shí)的dom元素 舉個(gè)栗子, 這里使用了官方推薦的Velocity.js作為動(dòng)畫庫(kù)
<div class="main">
<transition name="showRect" appear
@before-enter="handleBeforeEnter"
@enter="handleEnter"
@after-enter="handleAfterEnter"
@before-leave="handleBeforeLeave"
@leave="handleLeave"
@after-leave="handleAfterLeave"
:css="false">
<div class="box" v-if="show"></div>
</transition>
</div>
<button @click="start">切換</button>
methods: {
start() {
this.show = !this.show
},
handleBeforeEnter: function (el) {
el.style.opacity = 0;
console.log('方塊顯示動(dòng)畫即將執(zhí)行');
},
handleEnter: function (el, done) {
Velocity(el, 'stop');
Velocity(el, {
backgroundColor: '#0085eb',
opacity: 1,
translateX: 260,
rotateZ: ['360deg', 0]
}, {
duration: 1000,
easing: [ 0.4, 0.01, 0.165, 0.99 ],
complete: done
});
console.log('方塊顯示動(dòng)畫執(zhí)行中...');
},
handleAfterEnter: function (el) {
console.log('方塊顯示動(dòng)畫結(jié)束');
},
handleBeforeLeave: function (el) {
console.log('方塊隱藏動(dòng)畫即將執(zhí)行');
},
handleLeave: function (el, done) {
Velocity(el, 'stop');
Velocity(el, {
backgroundColor: '#4dd0e1',
opacity: 0,
translateX: 0,
rotateZ: [0, '360deg']
}, {
duration: 1000,
easing: [ 0.4, 0.01, 0.165, 0.99 ],
complete: done
});
console.log('方塊隱藏動(dòng)畫執(zhí)行中...');
},
handleAfterLeave: function (el) {
console.log('方塊隱藏動(dòng)畫結(jié)束');
}
}

列表過(guò)渡
vue還提供了transition-group組件, 作為列表過(guò)渡的容器
不同于 ,它會(huì)以一個(gè)真實(shí)元素呈現(xiàn):默認(rèn)為一個(gè) 。你也可以通過(guò) tag 特性更換為其他元素
transition-group 擁特別的v-move屬性,它會(huì)在元素的改變定位的過(guò)程中應(yīng)用, 效果可參見官網(wǎng)。
其他的就不抄官網(wǎng)了
列表過(guò)渡中, 可以結(jié)合js鉤子, 實(shí)現(xiàn)一些特殊的效果
舉個(gè)栗子
<template>
<div>
<div class="btn" @click="addItem">添加</div>
<div class="btn" @click="sort">排序</div>
<div class="box">
<div class="item-bar">
<transition-group name="fade" tag="p" appear
v-on:before-enter="beforeEnter"
v-on:after-enter="afterEnter">
// 這里的data-index 是一個(gè)識(shí)別標(biāo)識(shí), 便于在js鉤子中獲得當(dāng)前元素的序號(hào)
<div class="item" v-for="(i, index) in list" :key="i" :data-index="index">{{i}}</div>
</transition-group>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from "vue";
export default Vue.extend({
name: "home",
data() {
return {
show: true,
list: [5,4,3,2,1],
nextNum: 6
};
},
methods: {
showDom() {
this.show = !this.show
},
beforeEnter: function (el: any) {
el.style.opacity = 0 // 每個(gè)元素插入之前, 透明度為0
let index = el.dataset.index 每次可能插入多個(gè)元素,
// 頁(yè)面加載時(shí)先展示5個(gè)
if (index < 5) {
//設(shè)置動(dòng)畫延遲, 實(shí)現(xiàn)按續(xù)插入的效果
el.style.animationDelay = el.dataset.index * 0.3 + 's'
}
},
afterEnter: function (el) {
el.style.opacity = 1
console.log('afterEnter')
},
addItem() {
this.list.push(this.nextNum++)
},
sort() {
this.list = this.list.sort((a, b) => a -b)
}
}
});
</script>
@keyframes animat {
0% {
margin-left: 300px;
opacity: 0;
}
100% {
margin-left: 0;
opacity: 1;
}
}
.fade-enter {
opacity: 0;
margin-left: 300px;
}
.fade-enter-active {
opacity: 0;
animation: animat 1s;
}
.fade-enter-to {
opacity: 1;
margin-left: 0;
}
.fade-move {
transition: all 0.3s;
}
.fade-leave {
left: 10px;
}
.fade-leave-active {
transition: all 2s ease-out;
}
.fade-leave-to {
left: -100%;
}
效果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
element-ui重置resetFields()不生效的解決
本文主要介紹了element-ui重置resetFields()不生效的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
淺談mvvm-simple雙向綁定簡(jiǎn)單實(shí)現(xiàn)
本篇文章主要介紹了淺談mvvm-simple雙向綁定簡(jiǎn)單實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕)
本篇文章主要介紹了VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕),具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
antd?vue?表格rowSelection選擇框功能的使用方式
這篇文章主要介紹了antd?vue?表格rowSelection選擇框功能的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。2022-12-12
vue-cli3 設(shè)置端口號(hào)(81)無(wú)效的解決
這篇文章主要介紹了vue-cli3 設(shè)置端口號(hào)(81)無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Vue實(shí)現(xiàn)一種簡(jiǎn)單的無(wú)限循環(huán)滾動(dòng)動(dòng)畫的示例
這篇文章主要介紹了Vue實(shí)現(xiàn)一種簡(jiǎn)單的無(wú)限循環(huán)滾動(dòng)動(dòng)畫的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
vue項(xiàng)目前端加前綴(包括頁(yè)面及靜態(tài)資源)的操作方法
這篇文章主要介紹了vue項(xiàng)目前端加前綴(包括頁(yè)面及靜態(tài)資源)的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
vue react中的excel導(dǎo)入和導(dǎo)出功能
當(dāng)我們把信息化系統(tǒng)給用戶使用時(shí),用戶經(jīng)常需要把以前在excel里錄入的數(shù)據(jù)導(dǎo)入的信息化系統(tǒng)里,這樣為用戶提供了很大的方便,這篇文章主要介紹了vue中或者react中的excel導(dǎo)入和導(dǎo)出,需要的朋友可以參考下2023-09-09

