前面學習了用css
實現動畫效果,那 Vue 中能不能用js
實現動畫效果呢?css
其實 Vue 提供了不少動畫鉤子dom
enter
入場動畫鉤子函數有before-enter
、enter
、after-enter
函數
before-enter
動畫出現前的事件學習
<div id="root"> <transition name="fade" @before-enter="handleBeforeEnter" //動畫出現前的事件 > <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 }, handleBeforeEnter(el){ //接收一個參數 el,爲 dom 元素 el.style.color = 'red' } } })
enter
before-enter
事件結束後執行動畫
<div id="root"> <transition name="fade" @before-enter="handleBeforeEnter" @enter="handleEnter" //before-enter 事件結束後執行 > <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 }, handleBeforeEnter(el){ el.style.color = 'red' } handleEnter(el,done){ //接收兩個參數,第一個參數 el 爲 dom 元素,第二個參數是 done 是個回調函數 setTimeout(()=>{ el.style.color = 'green' done() //done 回調函數很是重要,在執行完動畫後需手動執行下這個函數,至關於告訴 Vue 這個動畫已經執行完了,會再去調用 after-enter 事件 },2000) } } })
after-enter
enter
事件中done
被調用後,after-enter
事件會被觸發this
<div id="root"> <transition name="fade" @before-enter="handleBeforeEnter" @enter="handleEnter" @after-enter="handleAfterEnter" //enter 事件中 done 被調用後,after-enter 事件會被觸發 > <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 }, handleBeforeEnter(el) { el.style.color = 'red' }, handleEnter(el, done) { setTimeout(() => { el.style.color = 'green' done() }, 2000) }, handleAfterEnter(el) { //接收一個參數 el,爲 dom 元素 setTimeout(()=>{ el.style.color = 'blue' },2000) } } })
leave
與入場動畫對應的出場動畫鉤子函數有before-leave
、leave
、after-leave
。它們的用法與入場動畫用法同樣code
Velocity.js
庫有了上面基礎後,配合Velocity.js
庫,能實現更強大的動畫效果。事件
<div id="root"> <transition name="fade" @before-enter="handleBeforeEnter" @enter="handleEnter" @after-enter="handleAfterEnter" //enter 事件中 done 被調用後,after-enter 事件會被觸發 > <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 }, handleBeforeEnter(el) { el.style.opacity = 0 }, handleEnter(el, done) { Velocity(el, { //第一個參數是要操做的 dom 元素 opacity: 1 }, { duration: 1000, //第三參數中須要配置一個 complete 屬性,值爲 done,由於 Velocity 執行完後會自動執行 complete 屬性,這裏設置爲 done 是讓它去觸發 after-enter 事件 complete: done }) }, handleAfterEnter(el) { console.log('動畫結束') } } })