詳解Vue中過度動(dòng)畫效果應(yīng)用
一、實(shí)現(xiàn)動(dòng)畫過渡效果的幾種方式
實(shí)現(xiàn)動(dòng)畫必須要將要進(jìn)行動(dòng)畫的元素利用<transition>標(biāo)簽進(jìn)行包裹
1、利用CSS樣式實(shí)現(xiàn)過渡效果
<transition name="fade"></transition>
1.v-enter: 定義進(jìn)入過渡的開始狀態(tài)。在元素被插入時(shí)生效,在下一個(gè)幀移除。
2.v-enter-active: 定義進(jìn)入過渡的結(jié)束狀態(tài)。在元素被插入時(shí)生效,在 transition/animation 完成之后移除。
3.v-leave: 定義離開過渡的開始狀態(tài)。在離開過渡被觸發(fā)時(shí)生效,在下一個(gè)幀移除。
4.v-leave-active: 定義離開過渡的結(jié)束狀態(tài)。在離開過渡被觸發(fā)時(shí)生效,在 transition/animation 完成之后
通過name的名稱進(jìn)行重命名,在樣式文件中進(jìn)行.fade-enter-active設(shè)置動(dòng)畫的效果即transition屬性,需要注意的是動(dòng)畫結(jié)束后樣式將會(huì)移除,所以如果想要?jiǎng)赢媽?shí)現(xiàn)之后元素保持有某個(gè)樣式,則需要transition標(biāo)簽里面的元素的樣式表中進(jìn)行設(shè)置,此情況是針對(duì)元需要通過改變元素的屬性來顯示元素,如定位top,left以及通過transform將顯示的元素的位置改變從而讓元素出現(xiàn)在當(dāng)前的視圖窗口中時(shí),但是如果元素v-show為true之后元素已經(jīng)在視圖中央顯示了,不需要位置的移動(dòng)將元素移動(dòng)到視圖中,只是想要顯示的時(shí)候顯示有動(dòng)畫效果的,則直接將動(dòng)畫結(jié)束的屬性設(shè)置在v-enter-active/v-leave-active中即可。也就是說動(dòng)畫的屬性如果只是產(chǎn)生效果,不對(duì)元素的任何屬性進(jìn)行修改,也就是動(dòng)畫中的屬性樣式不需要永久添加到dom元素中,則直接按后者的方式定義,如果說動(dòng)畫的屬性同時(shí)相對(duì)元素進(jìn)行樣式設(shè)計(jì),屬性樣式需要被添加到dom元素上,則需要按照前者的方式。
<transition name="fold"> <div class="shopcart-list" v-show="listShow"> <div class="list-header"> <h1 class="title">購物車</h1> <span class="empty" @click="empty">清空</span> </div> <div class="list-content" ref="list"> <ul> <li class="food border-1px" v-for="(food,index) in selectFoods" v-show="food.count>0"> <span class="name">{{selectName[index]}}</span> <div class="price"> <span>¥{{food.price*food.count}}</span> </div> <div class="cartcontrol-wrapper"> <v-cartcontrol :food="food"></v-cartcontrol> </div> </li> </ul> </div> </div> </transition>
.fold-enter-active,.fold-leave-active transition:all 0.5s .fold-enter,.fold-leave transform :translate3d(0,0,0) .shopcart-list position:absolute transform:translate3d(0,-100%,0)//動(dòng)畫結(jié)束后的效果需要在此處進(jìn)行設(shè)置,設(shè)置在.fold-enter-active中,元素動(dòng)畫結(jié)束后該樣式屬性會(huì)被移除掉,將會(huì)看不到想要的效果 top: 100%//元素即使顯示也不再視圖窗口中,通過transform實(shí)現(xiàn)顯示 z-index:-1 width:100%
2、利用animation或者是動(dòng)畫庫實(shí)現(xiàn)動(dòng)畫效果
<div id="example-2"> <button @click="show = !show">Toggle show</button> <transition name="bounce"> <p v-if="show">Look at me!</p> </transition> </div>
new Vue({ el: '#example-2', data: { show: true } })
.bounce-enter-active { animation: bounce-in 0.5s linear; } .bounce-leave-active { animation: bounce-out 0.5s linear; } @keyframes bounce-in { 0% { transform: scale(0); } 50% { transform: scale(1.5); } 100% { transform: scale(1); } } @keyframes bounce-out { 0% { transform: scale(1); } 50% { transform: scale(1.5); } 100% { transform: scale(0); } }
3、自定義過度類名
- enter-class
- enter-active-class
- leave-class
- leave-active-class
他們的優(yōu)先級(jí)高于普通的類名,這對(duì)于 Vue 的過渡系統(tǒng)和其他第三方 CSS 動(dòng)畫庫,如 Animate.css 結(jié)合使用十分有用。
<link rel="external nofollow" rel="stylesheet" type="text/css"> <div id="example-3"> <button @click="show = !show"> Toggle render </button> <transition name="custom-classes-transition" enter-active-class="animated tada" leave-active-class="animated bounceOutRight" > <p v-if="show">hello</p> </transition> </div>
new Vue({ el: '#example-3', data: { show: true } })
可以在樣式中同時(shí)使用transition和animation
4、利用JavaScript鉤子函數(shù)實(shí)現(xiàn)過渡效果
<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>
methods: { // -------- // 進(jìn)入中 // -------- beforeEnter: function (el) { // ... }, // 此回調(diào)函數(shù)是可選項(xiàng)的設(shè)置 // 與 CSS 結(jié)合時(shí)使用 enter: function (el, done) { // ... done() }, afterEnter: function (el) { // ... }, enterCancelled: function (el) { // ... }, // -------- // 離開時(shí) // -------- beforeLeave: function (el) { // ... }, // 此回調(diào)函數(shù)是可選項(xiàng)的設(shè)置 // 與 CSS 結(jié)合時(shí)使用 leave: function (el, done) { // ... done() }, afterLeave: function (el) { // ... }, // leaveCancelled 只用于 v-show 中 leaveCancelled: function (el) { // ... } }
在使用鉤子函數(shù)實(shí)現(xiàn)動(dòng)畫的時(shí)候注意dom的異步刷新,需要結(jié)合this.$nextTick(),同時(shí)在leave和enter中設(shè)置樣式前最好迫使dom進(jìn)行回流(reflow)使dom重新渲染,如獲取元素的offsetHeight等,然后在this.$nextTick()中設(shè)置新的樣式,不然又可能實(shí)現(xiàn)不了動(dòng)畫的效果
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue自定義鍵盤信息、監(jiān)聽數(shù)據(jù)變化的方法示例【基于vm.$watch】
這篇文章主要介紹了vue自定義鍵盤信息、監(jiān)聽數(shù)據(jù)變化的方法,結(jié)合實(shí)例形式分析了vue.js基于vm.$watch進(jìn)行事件監(jiān)聽相關(guān)操作技巧,需要的朋友可以參考下2019-03-03vue-element-admin如何轉(zhuǎn)換成中文
這篇文章主要介紹了vue-element-admin如何轉(zhuǎn)換成中文問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03詳解vue beforeEach 死循環(huán)問題解決方法
這篇文章主要介紹了vue beforeEach 死循環(huán)問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Vue項(xiàng)目打包后可修改基礎(chǔ)接口地址配置的具體操作
vue項(xiàng)目打包過后發(fā)現(xiàn)地址錯(cuò)了或者發(fā)布到別的服務(wù)器發(fā)現(xiàn)請求的地址不對(duì),每次都要去重新打包,太浪費(fèi)時(shí)間,下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目打包后可修改基礎(chǔ)接口地址配置的具體操作,需要的朋友可以參考下2022-08-08Vue中使用Lodop插件實(shí)現(xiàn)打印功能的簡單方法
這篇文章主要給大家介紹了關(guān)于Vue中使用Lodop插件實(shí)現(xiàn)打印功能的簡單方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Vue3中多個(gè)彈窗同時(shí)出現(xiàn)的解決思路
這篇文章主要介紹了Vue3中多個(gè)彈窗同時(shí)出現(xiàn)的解決思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02vue實(shí)現(xiàn)輸入框只允許輸入數(shù)字
在vue項(xiàng)目中,輸入框只允許輸入數(shù)字,現(xiàn)將自己使用的一種方法記錄,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2023-11-11vue3+elementPlus項(xiàng)目支持生成、設(shè)置默認(rèn)附件方式
這篇文章主要介紹了vue3+elementPlus項(xiàng)目支持生成、設(shè)置默認(rèn)附件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03vue+echarts實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)更新
這篇文章主要為大家詳細(xì)介紹了vue+echarts實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)更新,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04