VUE实例课程---7、动画钩子函数 VUE实例课程---7、动画钩子函数

一、总结

一句话总结:

动画钩子函数也就是用函数(用js控制css)来操作动画,动画钩子函数中可以更加方便的操作动画,比如只实现半场动画,像物品添加到购物车的动画
<div id="app">
    <!-- 1. 使用 transition 元素把 小球包裹起来 -->
    <transition
            @before-enter="beforeEnter"
            @enter="enter"
            @after-enter="afterEnter">
        <div class="ball" v-show="isShow"></div>
    </transition>
    <br>
    <button @click="isShow=!isShow">添加到购物车</button>
</div>
<script src="../js/vue.js"></script>
<script>
    let vm = new Vue({
        el: '#app',
        data: {
            isShow: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
                // console.log('ok')
                // 只设置半场动画的关键,让isShow在这个半场中由false依旧变成false
                //那么下次点击的时候依旧是从隐藏开始,依旧是进入的半场
                this.isShow = !this.isShow;
            }
        }
    });
</script>

1、动画钩子函数分成两组,进场和离场,分别有哪些函数?

进场动画钩子函数:before-enter、enter、after-enter、enter-cancelled
离场动画钩子函数:before-leave、leave、after-leave、leave-cancelled
<transition
  v-on:before-enter="beforeEnter"
  v-on:enter="enter"
  v-on:after-enter="afterEnter"
  v-on:enter-cancelled="enterCancelled"

  v-on:before-leave="beforeLeave"
  v-on:leave="leave"
  v-on:after-leave="afterLeave"
  v-on:leave-cancelled="leaveCancelled"
>
</transition>

2、动画钩子函数的第一个参数el表示什么?

动画钩子函数的第一个参数el表示 要执行动画的那个DOM元素,是个原生的 JS DOM对象
  methods: {
      // 注意: 动画钩子函数的第一个参数:el,表示 要执行动画的那个DOM元素,是个原生的 JS DOM对象
      // 大家可以认为 , el 是通过 document.getElementById('') 方式获取到的原生JS DOM对象
      beforeEnter(el){
          // beforeEnter 表示动画入场之前,此时,动画尚未开始,可以 在 beforeEnter 中,设置元素开始动画之前的起始样式
          // 设置小球开始动画之前的,起始位置
          el.style.transform = "translate(0, 0)";
      },
  }

3、动画钩子函数 enter(el, done){}的第二个参数done表示什么意思?

enter的第二个参数done, 起始就是 afterEnter 这个函数,也就是说:done 是 afterEnter 函数的引用,enter中执行done可以消除动画延迟
  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
          // console.log('ok')
          // 只设置半场动画的关键,让isShow在这个半场中由false依旧变成false
          this.isShow = !this.isShow;
      }
  }

4、动画钩子函数实例(做小球半场动画)中 afterEnter 动画钩子函数中的 this.isShow = !this.isShow; 的意义是什么 ?

|||-begin

  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
          // console.log('ok')
          // 只设置半场动画的关键,让isShow在这个半场中由false依旧变成false
          this.isShow = !this.isShow;
      }
  }

|||-end

this.isShow = !this.isShow 是只设置半场动画的关键,让isShow在这个半场中由false依旧变成false,那么下次点击的时候依旧是从隐藏开始,依旧是进入的半场,直接跳过后半场动画

二、动画钩子函数

博客对应课程的视频位置:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>动画钩子函数</title>
 6     <style>
 7         .ball {
 8             width: 15px;
 9             height: 15px;
10             border-radius: 50%;
11             background-color: red;
12         }
13     </style>
14 </head>
15 <body>
16 <!--
17 
18 动画钩子函数也就是用函数(用js控制css)来操作动画,动画钩子函数中可以更加方便的操作动画,比如只实现半场动画,像物品添加到购物车的动画
19 
20 
21 -->
22 <div id="app">
23     <!-- 1. 使用 transition 元素把 小球包裹起来 -->
24     <transition
25             @before-enter="beforeEnter"
26             @enter="enter"
27             @after-enter="afterEnter">
28         <div class="ball" v-show="isShow"></div>
29     </transition>
30     <br>
31     <button @click="isShow=!isShow">添加到购物车</button>
32 </div>
33 <script src="../js/vue.js"></script>
34 <script>
35     let vm = new Vue({
36         el: '#app',
37         data: {
38             isShow:false
39         },
40         methods: {
41             // 注意: 动画钩子函数的第一个参数:el,表示 要执行动画的那个DOM元素,是个原生的 JS DOM对象
42             // 大家可以认为 , el 是通过 document.getElementById('') 方式获取到的原生JS DOM对象
43             beforeEnter(el){
44                 // beforeEnter 表示动画入场之前,此时,动画尚未开始,可以 在 beforeEnter 中,设置元素开始动画之前的起始样式
45                 // 设置小球开始动画之前的,起始位置
46                 el.style.transform = "translate(0, 0)";
47             },
48             enter(el, done){
49                 // 这句话,没有实际的作用,但是,如果不写,出不来动画效果;
50                 // 可以认为 el.offsetWidth 会强制动画刷新
51                 el.offsetWidth;
52                 // enter 表示动画 开始之后的样式,这里,可以设置小球完成动画之后的,结束状态
53                 el.style.transform = "translate(150px, 450px)";
54                 el.style.transition = 'all 1s ease';
55 
56                 // 这里的 done, 起始就是 afterEnter 这个函数,也就是说:done 是 afterEnter 函数的引用
57                 done();
58             },
59             afterEnter(el){
60                 // 动画完成之后,会调用 afterEnter
61                 // console.log('ok')
62                 // 只设置半场动画的关键,让isShow在这个半场中由false依旧变成false
63                 //那么下次点击的时候依旧是从隐藏开始,依旧是进入的半场
64                 this.isShow = !this.isShow;
65             }
66         }
67     });
68 </script>
69 </body>
70 </html>