用鉤子函數才能實現小球的半場動畫
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="../lib/vue.js"></script>
<style>
.ball {
width: 15px;
height: 15px;
border-radius: 50%;
/* color使字體顏色 我一直用color顯示不出小球 */
background-color: red;
}
</style>
</head>
<body>
<div id="app">
<input type="button" value="加入購物車" @click="flag=!flag">
<!-- 因爲是半場動畫,所以不需要後面的leave -->
<transition v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:after-enter="afterEnter">
<div class="ball" v-show="flag"></div>
</transition>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
flag: false,
},
methods: {
//注意:動畫鉤子函數的第一個參數:el,表示要執行動畫的那個DOM元素是個原生的JS DOM對象
//可以認爲,el是通過document.getRlementById('')這個方式獲取到的原生IS DOM對象
beforeEnter: function (el) {
//表示動畫入場之前,此時動畫尚未開始,在beforeEnter中,設置元素開始動畫之前的起始樣式
//設置小球開始動畫之前的起始位置
el.style.transform = "translate(0,0)"
},
enter: function (el, done) {
//這句話沒有實際的作用,但是如果不寫無法出來動畫效果,可以認爲這個會強制動畫刷新 只要和offset相關都可以 不論是height還是left
el.offsetWidth
//表示動畫開始之後的樣式,可以設置小球完成動畫之後的結束狀態
el.style.transform = "translate(150px,450px)"
//過渡行爲
el.style.transition = "all 1s ease"
//想讓小球立即消失,再enter裏調用done 這裏的done其實就是afterEnter這個函數的引用
done()
},
afterEnter: function (el) {
//動畫完成之後 使小球消失
this.flag = false
}
// 爲什麼每次開始小球都能回到初始位置,因爲重新開始的時候又會執行 beforeEnter函數,小球位置置爲0,0
}
})
</script>
</body>
</html>