使用钩子函数模拟小球半场动画

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Title</title>
<script src="js/vue-2.4.0.js"></script>
<style>
.ball {
width: 15px;
height: 15px;
">red;
border-radius: 50%;
}
</style>
</head>
<body>
<div id="app">
<input type="button" value="加入购物车" @click="flag=!flag">
<!--使用 transition 元素把小球包裹起来-->
<!-- v-on:before-enter 动画开始 enter 动画执行 after-enter 动画结束 钩子函数-->
<transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
<div class="ball" v-show="flag"></div>
</transition>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
flag: false,
},
methods: {
//注意:动画钩子函数的第一个参数:el,表示 要执行动画的那个DOM元素,是个原生的JS DOM对象
//大家可以认为,el 是通过 document.getElementById('') 方式获取到的原生JS DOM对象
beforeEnter(el) {
//beforeEnter 表示动画入场之前,此时,动画尚未开始,可以 在 beforeEnter 中,设置元素开始动画之前的起始样式
//设置小球开始动画之前的,起始位置
el.style.transform = "translate(0,0)"
},
enter(el, done) {
//这句话没有实际作用,但是,如果不行 出不来动画效果;可以认为 el.offsetWidth 会强制动画刷新
el.offsetWidth;
//enter 表示动画 开始之后的样式,这里可以设置小球完成动画之后的,结束状态
el.style.transform = "translate(150px,450px)";
el.style.transition = 'all 1s ease';
//这里的 done ,开始就是afterEnter 这个函数,也就是说:done 是 afterEnter 函数的引用
done();
},
afterEnter(el) {
//动画完成之后,会调用 afterEnter
this.flag = !this.flag
}
}
});
</script>
</body>
</html>

猜你喜欢

转载自www.cnblogs.com/lujieting/p/10447954.html