Vue 中 JS 動畫與 Velocity.js 的結合

前面學習了用css實現動畫效果,那 Vue 中能不能用js實現動畫效果呢?css

其實 Vue 提供了不少動畫鉤子dom

enter

入場動畫鉤子函數有before-enterenterafter-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-leaveleaveafter-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('動畫結束')
        }
    }
})
相關文章
相關標籤/搜索