下面這段代碼,是點擊按鈕實現hello world
顯示與隱藏
<div id="root">
<div v-if="show">hello world</div>
<button @click="handleClick">按鈕</button>
</div>
let vm = new Vue({
el: '#root',
data: {
show:true
},
methods: {
handleClick(){
this.show = !this.show
}
}
})
此時有一個需求,希望是在顯示與隱藏時,能實現漸隱漸現的動畫效果。
<div id="root">
<transition name="fade">
<div v-if="show">hello world</div>
</transition>
<button @click="handleClick">按鈕</button>
</div>
let vm = new Vue({
el: '#root',
data: {
show:true
},
methods: {
handleClick(){
this.show = !this.show
}
}
})
如果希望hello world
有一個動畫效果的話,需要在外面套一層transition
標籤,意思它包裹的內容,有一個動畫效果,可以給它一個名字name="fade"
。
enter
當一個元素被transition
標籤包裹之後,Vue 會自動的分析元素的css
樣式,然後構建動畫流程
在動畫還沒有執行的一瞬間,Vue 會幫我們在dom
標籤上添加兩個class
,分別是fade-enter
、fade-enter-active
。
當動畫第一幀執行結束之後,transition
這個標籤分析過,裏面有一個動畫效果,Vue 會在動畫運行到第二幀的時候,會將dom
標籤上v-enter
的class
刪除,再添加一個v-enter-to
的class
。
接着動畫會繼續執行,執行到結束的一瞬間,Vue 會幹一件事,它會把之前添加的v-enter-to
和v-enter-active
都刪除,
.fade-enter{
opacity: 0;
}
.fade-enter-active{
transition: opacity 3s;
}
<div id="root">
<transition name="fade">
<div v-if="show">hello world</div>
</transition>
<button @click="handleClick">按鈕</button>
</div>
let vm = new Vue({
el: '#root',
data: {
show:true
},
methods: {
handleClick(){
this.show = !this.show
}
}
})
我們只需要在css
中給fade-enter
和fade-enter-active
分別寫上樣式就行了。這裏要注意的是 Vue 中默認以v
開頭,如:v-enter
,transition
加個name
屬性,就可以用name
屬性值做開頭,如:fade-enter
。
現在這裏兩個class
的意思是:
動畫還沒執行時,就已經有fade-enter
,fade-enter-active
,動畫第一幀運行時fade-enter
就會被移除,css
效果opacity: 0
就會變成opacity: 1
,直到動畫執行完fade-enter-active
纔會被移除,這期間它用transition
對opacity
進行監控,需要3s
才能完成。
leave
隱藏的動畫流程:
隱藏的第一個瞬間時,Vue 會在dom
上添加兩個class
,分別是v-leave
和v-leave-active
運行到第二幀時,Vue 會將v-leave
移除,再添加一個v-leave-to
接着動畫會繼續執行,執行到結束的一瞬間,Vue 會把之前添加的v-leave-to
和v-leave-active
都刪除。
.fade-leave-to{
opacity: 0;
}
.fade-leave-active{
transition: opacity 3s;
}
<div id="root">
<transition name="fade">
<div v-if="show">hello world</div>
</transition>
<button @click="handleClick">按鈕</button>
</div>
let vm = new Vue({
el: '#root',
data: {
show:true
},
methods: {
handleClick(){
this.show = !this.show
}
}
})
爲什麼加了這兩個css
動畫效果就出來了呢?
從動畫執行的第一個瞬間,到動畫執行完畢,fade-leave-active
這個class
都存在。也就是在動畫運行過程中,我要時刻監聽div
的opacity
,一旦opacity
發生變化,我要讓讓他在3s
內執行完畢。
在第一個瞬間fade-leave
的opacity
爲1
,就是顯示狀態;第二個瞬間opacity
爲0
了,此時要給它添加一個fade-leave-to
的class
,而fade-leave-active
一直在監聽opacity
的變化,一旦opacity
發生變化,會讓它在3s
內完成
總結
在transition
標籤中中不光v-if
能控制顯示隱藏,v-show
也能控制顯示隱藏,甚至動態組件也行。只要在transition
中標籤中動畫發生變化,都會有一個過渡效果