v-enter
類名在節點插入 DOM 後不會當即刪除,而是在 animationend
事件觸發時刪除。enter-class enter-active-class enter-to-class (2.1.8+) leave-class leave-active-class leave-to-class (2.1.8+)
Vue 提供了 transition
的封裝組件,在下列情形中,能夠給任何元素和組件添加進入/離開過渡css
v-if
)v-show
)
transition
組件中的元素時,Vue 將會作如下處理:nextTick
概念不一樣)<transition>
,則 v-
是這些類名的默認前綴。<transition name="my-transition">
,那麼 v-enter
會替換爲 my-transition-enter
。
CSS 動畫用法同 CSS 過渡,區別是在動畫中 v-enter
類名在節點插入 DOM 後不會當即刪除,而是在 animationend
事件觸發時刪除。 html
enter-class
enter-active-class
enter-to-class
(2.1.8+)leave-class
leave-active-class
leave-to-class
(2.1.8+)他們的優先級高於普通的類名,這對於 Vue 的過渡系統和其餘第三方 CSS 動畫庫,如 Animate.css結合使用十分有用。vue
<link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" 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>
animation/
animationend
"transitionend
或 animationend
,這取決於給元素應用的 CSS 規則。animation
很快的被觸發並完成了,而 transition
效果還沒結束。type
特性並設置 animation
或 transition
來明確聲明你須要 Vue 監聽的類型。1git
1: <transition :duration="1000">...</transition>github
2: <transition :duration="{ enter: 500, leave: 800 }">...</transition>
npm
<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: { // -------- // 進入中 // -------- beforeEnter: function (el) { // ... }, // 當與 CSS 結合使用時 // 回調函數 done 是可選的 enter: function (el, done) { // ... done() }, afterEnter: function (el) { // ... }, enterCancelled: function (el) { // ... }, // -------- // 離開時 // -------- beforeLeave: function (el) { // ... }, // 當與 CSS 結合使用時 // 回調函數 done 是可選的 leave: function (el, done) { // ... done() }, afterLeave: function (el) { // ... }, // leaveCancelled 只用於 v-show 中 leaveCancelled: function (el) { // ... } }
這些鉤子函數能夠結合 CSS transitions/animations 使用,也能夠單獨使用。 當只用 JavaScript 過渡的時候,在 enter 和 leave 中必須使用 done 進行回調。不然,它們將被同步調用,過渡會當即完成。 推薦對於僅使用 JavaScript 過渡的元素添加 v-bind:css="false",Vue 會跳過 CSS 的檢測。這也能夠避免過渡過程當中 CSS 的影響。
appear
特性仍是 v-on:appear
鉤子都會生成初始渲染過渡
對於原生標籤可使用 v-if
/v-else
。最多見的多標籤過渡是一個列表和描述這個列表爲空消息的元素:儘可能使用key瀏覽器
<transition> <table v-if="items.length > 0"> <!-- ... --> </table> <p v-else>Sorry, no items found.</p> </transition>
在 「on」 按鈕和 「off」 按鈕的過渡中,兩個按鈕都被重繪了,一個離開過渡的時候另外一個開始進入過渡。這是 <transition>
的默認行爲 - 進入和離開同時發生app
在元素絕對定位在彼此之上的時候運行正常:ide
同時生效的進入和離開的過渡不能知足全部要求,因此 Vue 提供了 過渡模式函數
in-out
:新元素先進行過渡,完成以後當前元素過渡離開。
out-in
:當前元素先進行過渡,完成以後新元素過渡進入。
用 out-in
重寫以前的開關按鈕過渡:
模式不是常常用到,但對於一些稍微不一樣的過渡效果仍是有用的
<transition name="fade" mode="out-in"> <!-- ... the buttons ... --> </transition>in-out
<transition-group>
組件還有一個特殊之處。不只能夠進入和離開動畫,還能夠改變定位。要使用這個新功能只需瞭解新增的 v-move
特性,它會在元素的改變定位的過程當中應用。像以前的類名同樣,能夠經過 name
屬性來自定義前綴,也能夠經過 move-class
屬性手動設置。
<transition>
或者 <transition-group>
做爲根組件,而後將任何子組件放置在其中就能夠了。Vue.component('my-special-transition', { template: '\ <transition\ name="very-special-transition"\ mode="out-in"\ v-on:before-enter="beforeEnter"\ v-on:after-enter="afterEnter"\ >\ <slot></slot>\ </transition>\ ', methods: { beforeEnter: function (el) { // ... }, afterEnter: function (el) { // ... } } })
函數式組件更適合完成這個任務:
Vue.component('my-special-transition', { functional: true, render: function (createElement, context) { var data = { props: { name: 'very-special-transition', mode: 'out-in' }, on: { beforeEnter: function (el) { // ... }, afterEnter: function (el) { // ... } } } return createElement('transition', data, context.children) } })