4-2 自定义指令与过渡-过渡(动画)

目录:

  • 简介
  • 基本用法
  • 钩子函数
  • 结合第三方动画库 Animate.css 一起使用(实际项目中使用)

一、简介

Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。官方使用文档:过渡 & 动画

本质上还是使用css3动画:transition、animation

包括工具如下:

  • 在 CSS 过渡和动画中自动应用 class
  • 可以配合使用第三方 CSS 动画库,如 Animate.css
  • 在过渡钩子函数中使用 JavaScript 直接操作 DOM
  • 可以配合使用第三方 JavaScript 动画库,如 Velocity.js

二、基本用法

2.1、基本定义

使用 transition 组件,将要执行动画的元素包含在该组件内。Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡。

<transition  name="fade"> //name的值可以自定义,但是必须要有,不然光有组件是没用的
      运动的元素
</transition>

2.2、过渡的类名

在进入/离开的过渡中,会有 6 个 class 切换。v-enter 其实就是  名字-动画动作 。

1.v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。(进入动画)

2.v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。

3.v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。

4.v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。(离开动画)

5.v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。

6.v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。

如图:

                                

以下代码示例可以显示:

<head>
    <meta charset="UTF-8">
    <title>动画</title>
    <style>
        p{
            width: 300px;
            height: 300px;
            background-color: red;
        }
        /* 设置持续时间和动画函数 */
        .fade-enter-active,.fade-leave-active{
            transition:all 1s ease;
        }
        .fade-enter-active{
            opacity: 1;
            width: 300px;
            height: 300px;
        }
        .fade-leave-active{
            opacity: 0;
            width: 0px;
            height: 0px;
        }
        /*必须要定义初始化进入状态,不然进入动画,不显示动画效果,且fade-enter需要放在fade-enter-active后面*/
        .fade-enter{
            opacity: 0;
            width: 100px;
            height: 100px;
        }
    </style>
</head>
<body>
    <div id="box">
        <button @click="flag=!flag">点我啊</button>
        <hr>
        <!--只用transition是没用的,必须要有name,name的值是随便定义-->
        <transition name="fade">
            <!--显示叫进入动画,隐藏叫离开动画-->
            <p v-show="flag">高哥哥真帅啊!!!</p>
        </transition>

    </div>
    <script type="text/javascript" src="../vue.js"></script>
    <script>
        let vm = new Vue({
            el: "#box",
            data:{
                flag: false
            }
        });
    </script>
</body>
过渡类名练习

三、钩子函数

可以在属性中声明 JavaScript 钩子,钩子函数一共有8个。官方文档:JavaScript 钩子

<transition
  @before-enter="beforeEnter"  //动画进去之前
  @enter="enter"        //动画进入
  @after-enter="afterEnter" //动画进入之后
  @enter-cancelled="enterCancelled"  //进入动画过程中可以去掉进入动画

  @before-leave="beforeLeave"   //动画即将离开之前
  @leave="leave"     //动画离开
  @after-leave="afterLeave"   //动画离开之后
  @leave-cancelled="leaveCancelled"   //动画离开过程中可以取消离开动画
>
  <!-- ... -->
</transition>

用法:

// ...
methods: {
  // --------
  // 进入中
  // --------

  beforeEnter(el) {  //钩子函数是有参数的,el:表示你运动的元素
    // ...
  },
  // 当与 CSS 结合使用时
  // 回调函数 done 是可选的
  enter(el, done) {
    // ...
    done()
  },
  afterEnter(el) {
    // ...
  },
  enterCancelled(el) {
    // ...
  },

  // --------
  // 离开时
  // --------

  beforeLeave(el) {
    // ...
  },
  // 当与 CSS 结合使用时
  // 回调函数 done 是可选的
  leave(el, done) {
    // ...
    done()
  },
  afterLeave(el) {
    // ...
  },
  // leaveCancelled 只用于 v-show 中
  leaveCancelled(el) {
    // ...
  }
}

完整的代码例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>动画</title>
    <style>
        p{
            width: 300px;
            height: 300px;
            background-color: red;
        }
        /* 设置持续时间和动画函数 */
        .fade-enter-active,.fade-leave-active{
            transition:all 1s ease;
        }
        .fade-enter-active{
            opacity: 1;
            width: 300px;
            height: 300px;
        }
        .fade-leave-active{
            opacity: 0;
            width: 0px;
            height: 0px;
        }
        /*必须要定义初始化进入状态,不然进入动画,不显示动画效果,且fade-enter需要放在fade-enter-active后面*/
        .fade-enter{
            opacity: 0;
            width: 100px;
            height: 100px;
        }
    </style>
</head>
<body>
    <div id="box">
        <button @click="flag=!flag">点我啊</button>
        <hr>
        <!--只用transition是没用的,必须要有name,name的值是随便定义-->
        <transition name="fade"
        @before-enter="beforeEnter"  //调用js钩子函数
        @enter="enter"
        @after-enter="afterEnter"
        @before-leave="beforeLeave"
        @leave="leave"
        @after-leave="afterLeave">
            <!--显示叫进入动画,隐藏叫离开动画-->
            <p v-show="flag">高哥哥真帅啊!!!</p>
        </transition>

    </div>
    <script type="text/javascript" src="../vue.js"></script>
    <script>
        let vm = new Vue({
            el: "#box",
            data:{
                flag: false
            },
            methods:{   //js钩子函数
                beforeEnter(el){
                    //alert("动画进入之前");
                },
                enter(){
                    //alert("动画进入");
                },
                afterEnter(el){
                    //alert("动画进入之后");
                    el.style.backgroundColor = "blue";
                },
                beforeLeave(){
                    //alert("动画离开之前");
                },
                leave(){
                    //alert("动画离开");
                },
                afterLeave(el){
                    //alert("动画离开之后");
                    el.style.backgroundColor = "red";
                }
            }
        });
    </script>
</body>
</html>
钩子函数练习

四、结合第三方动画库 Animate.css 一起使用

可以配合使用第三方 CSS 动画库,如 Animate.css,在实例的项目中,其实是用Animate.css的。下载Animate.css。如果发生变化,请在百度中搜索Animate.css。

结合Animate.css,需要自定义过渡类名,Vue官网:自定义过渡的类名

其实我们只需要用以下两个就可以了:

enter-active-class
leave-active-class

基本使用:

bounceInLeft和bounceOouRight必须是Animate.css中有的,animated是基础样式,必须要有

<!--animated是基础样式,必须要有-->
<transition enter-active-class="animated bounceInLeft" leave-active-class="animated bounceOouRight">
    <p v-show="flag">高哥哥真帅啊!!!</p>
</transition>

示例:

<head>
    <meta charset="UTF-8">
    <!--引入animate.css-->
    <link rel="stylesheet" href="css/animate.css">
    <title>动画</title>
    <style>
        p{
            width: 300px;
            height: 300px;
            background-color: red;
            margin: 0 auto;
        }
    </style>
</head>
<body>
    <div id="box">
        <button @click="flag=!flag">点我啊</button>
        <hr>
        <!--animated是基础样式,必须要有-->
        <transition enter-active-class="animated bounceInLeft" leave-active-class="animated bounceOouRight">
            <p v-show="flag">高哥哥真帅啊!!!</p>
        </transition>

    </div>
    <script type="text/javascript" src="../vue.js"></script>
    <script>
        let vm = new Vue({
            el: "#box",
            data:{
                flag: false
            }
        })
    </script>
</body>
animate.css过渡动画练习

 

posted @ 2020-03-10 10:11  帅丶高高  阅读(269)  评论(0)    收藏  举报