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

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

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script>
 8     <style type="text/css">
 9         .ball{
10             height: 15px;
11             width: 15px;
12             background: red;
13             border-radius: 50%;
14         }
15     </style>
16     <body>
17         <div id="app">
18             <input type="button" id="" value="快到碗里来" @click="flag =! flag"/>
19             <!-- 1. 使用 transition 元素把小球 包裹起来 -->
20             <transition 
21                 @before-enter="beforeEnter"
22                 @enter="enter"
23                 @after-enter="afterEnter">
24                 <div class="ball" v-show="flag"></div>    
25             </transition>
26             
27         </div>
28     </body>
29 </html>
30 <script>
31     var vm = new Vue({
32         el:'#app',
33         data:{
34             flag: false
35         },
36         methods:{
37             // 注意: 动画钩子函数的第一个参数:el, 表示 要执行动画的那个DOM元素, 是个原生的 JS DOM对象
38             beforeEnter(el){
39                 //   beforeEnter 表示动画入场之前, 此时, 动画尚未开始, 可以 在 beforeEnter 中, 设置元素
40                 // 开始动画之前的起始样式
41             // 设置小球开始动画的, 起始位置    
42                 el.style.transform = "translate(0, 0)"
43                 
44             },
45             enter(el, done){
46             
47                 // 这句话 没有实际作用, 但是, 如果不写, 出不来实际的效果
48                 // 可以认为 offsetWidth 会强制动画的刷新
49                 el.offsetWidth
50             // enter 表示动画 开始之后的样式, 这里, 可以设置小球完成动画之后的, 结束状态
51             el.style.transform = "translate(150px, 450px)"
52             // 经过1s 到达实际位置
53             el.style.transition = 'all 1s ease'
54             
55             // 这里的 done, 起始就是 afterEnter 这个函数, 也就是说: done 是 afterEnter 函数的引用
56             done()
57             },
58             afterEnter(el){
59                 console.log("动画执行结束")
60                 this.flag = ! this.flag 
61             }
62         }
63     })
64 </script>

效果图

一定要在enter 里调用 done 否则 不会立即消失

原文地址:https://www.cnblogs.com/wo1ow1ow1/p/11100838.html