用钩子函数才能实现小球的半场动画
<!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>