您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“vue過(guò)渡效果使用的技巧有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
概念
在進(jìn)入/離開(kāi)的過(guò)渡中, 會(huì)有6個(gè)class的切換
v-enter:定義進(jìn)入過(guò)渡的開(kāi)始狀態(tài)。在元素被插入之前生效,在元素被插入之后的下一幀移除。
v-enter-active:定義進(jìn)入過(guò)渡生效時(shí)的狀態(tài)。在整個(gè)進(jìn)入過(guò)渡的階段中應(yīng)用,在元素被插入之前生效,在過(guò)渡/動(dòng)畫(huà)完成之后移除。這個(gè)類(lèi)可以被用來(lái)定義進(jìn)入過(guò)渡的過(guò)程時(shí)間,延遲和曲線(xiàn)函數(shù)。
v-enter-to: 2.1.8版及以上 定義進(jìn)入過(guò)渡的結(jié)束狀態(tài)。在元素被插入之后下一幀生效 (與此同時(shí) v-enter 被移除),在過(guò)渡/動(dòng)畫(huà)完成之后移除。
v-leave: 定義離開(kāi)過(guò)渡的開(kāi)始狀態(tài)。在離開(kāi)過(guò)渡被觸發(fā)時(shí)立刻生效,下一幀被移除。
v-leave-active:定義離開(kāi)過(guò)渡生效時(shí)的狀態(tài)。在整個(gè)離開(kāi)過(guò)渡的階段中應(yīng)用,在離開(kāi)過(guò)渡被觸發(fā)時(shí)立刻生效,在過(guò)渡/動(dòng)畫(huà)完成之后移除。這個(gè)類(lèi)可以被用來(lái)定義離開(kāi)過(guò)渡的過(guò)程時(shí)間,延遲和曲線(xiàn)函數(shù)。
v-leave-to: 2.1.8版及以上 定義離開(kāi)過(guò)渡的結(jié)束狀態(tài)。在離開(kāi)過(guò)渡被觸發(fā)之后下一幀生效 (與此同時(shí) v-leave 被刪除),在過(guò)渡/動(dòng)畫(huà)完成之后移除。
enter 定義開(kāi)始的狀態(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à)會(huì)怎么進(jìn)行呢?
這里要注意兩點(diǎn)。
enter-active覆蓋掉了enter的起點(diǎn)位置
一共經(jīng)過(guò)了兩次過(guò)渡, enter-to是在active結(jié)束之后開(kāi)始的, 所以第四秒, 才回到dom元素本身的位置。
所以官方文檔之, 也是使用v-enter定義起點(diǎn)位置, 在enter-active中控制效果。
利用class實(shí)現(xiàn)過(guò)渡效果
在這6個(gè)class之上, 利用transition或者動(dòng)畫(huà), 都可以實(shí)現(xiàn)我們需要的效果。 舉個(gè)栗子, 這里我們直接將所有的路由改變都定義一個(gè)過(guò)渡效果,
appear屬性表示頁(yè)面初次加載的時(shí)候也適用于動(dòng)畫(huà)
<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)畫(huà)庫(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)畫(huà)即將執(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)畫(huà)執(zhí)行中...'); }, handleAfterEnter: function (el) { console.log('方塊顯示動(dòng)畫(huà)結(jié)束'); }, handleBeforeLeave: function (el) { console.log('方塊隱藏動(dòng)畫(huà)即將執(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)畫(huà)執(zhí)行中...'); }, handleAfterLeave: function (el) { console.log('方塊隱藏動(dòng)畫(huà)結(jié)束'); } }
列表過(guò)渡
vue還提供了transition-group組件, 作為列表過(guò)渡的容器
不同于 ,它會(huì)以一個(gè)真實(shí)元素呈現(xiàn):默認(rèn)為一個(gè) 。你也可以通過(guò) tag 特性更換為其他元素
transition-group 擁特別的v-move屬性,它會(huì)在元素的改變定位的過(guò)程中應(yīng)用, 效果可參見(jiàn)官網(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)畫(huà)延遲, 實(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%; }
“vue過(guò)渡效果使用的技巧有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。