vue动画

https://cn.vuejs.org/v2/guide/transitions.html

在进入/离开的过渡中,会有 6 个 class 切换:

  1. v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
  2. v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
  3. v-enter-to2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
  4. v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
  5. v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
  6. v-leave-to2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。

vue动画

对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 <transition>,则 v- 是这些类名的默认前缀。如果你使用了 <transition name="my-transition">,那么 v-enter 会替换为 my-transition-enter

v-enter-active 和 v-leave-active 可以控制进入/离开过渡的不同的缓和曲线

 

  1. 使用transition元素把需要被动画控制的元素包括起来
    <body>
            <div id="app">
                <input type="button" value="toggle" @click='flag = !flag'>
                <!--需求:点击按钮,让h3显示,再点击让h3隐藏-->
                <!--1.使用transition元素,把需要动画的控制的元素包括起来-->
                <transition>
                    <h3 v-if='flag'>这是一个H3</h3>
                </transition>    
            </div>
            <script>        
                var vm  = new Vue({
                    el: '#app', 
                    data: {
                        flag: false
                    },
                    methods: {}
    
                })
            </script>
    </body>

     

  2. 自定义两组样式控制transition内部元素的动画实现,默认.v-但是有一个问题,当需要实现不同动画时就没办法,当遇到这种情况时,<transitiono name='my-transition1'></transition>就可以了,将.v-改为.my-transition1就可以了
//v-enter和v-leave-to是动画进入之前和离开之后的时间点,他们两个时间点的状态是一致的
.v-enter,.v-leave-to {
    opacity: 0;//透明度为0
    transform: translateX(80px)
}
//v-enter-active和v-leave-active入场和出场的时间段
.v-enter-active,v-leave-active {
    transition: all 0.4s ease
}

实现半场动画:只有进入的动画,没有离开的动画

小球半场动画:

<!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>Document</title>
        <script src="./lib/vue-2.4.0.js"></script>
        <link rel="stylesheet" href="./lib/bootstrap-3.3.7.css">
        <style>
            .ball {
                width: 15px;
                height: 15px;
                border-radius: 50%;
                background-color: red;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <input type="button" value="快到碗里来" @click='flag = !flag'>
            <transition 
                @before-enter='beforeEnter'
                @enter='enter'
                @after-enter='afterEnter'>
                <div class='ball' v-show='flag'></div>
            </transition>
            
        </div>
        <script>        
            var vm  = new Vue({
                el: '#app', 
                data: {
                    flag: false
                },
                methods: {
                    //注意:动画钩子函数的第一个函数el表示要执行的那个元素,是个原生的js DOM对象
                    beforeEnter(el) {
                        //beforeEnter表示动画入场之前,表示动画尚未开始,可以再beforeEnter中设置元素的样式
                        //设置小球的起始位置
                        el.style.transform = 'translate(0 , 0)'
                    },
                    enter(el , done) {
                        //表示动画开始之后的样式,这里可以设置小球完成动画之后的状态
                        el.offsetWidth
                        //设置小球的结束位置
                        el.style.transform = 'translate(150px , 450px)'
                        //小球动画时长
                        el.style.transition = 'all 0.5s ease'
                        //这里的done其实就是afterEnter这个函数,也就是说done是afterEnter的引用(我认为是结束enter函数)
                        done()
                       
                    },
                    afterEnter(el) {
                        //动画完成之后
                        this.flag = !this.flag
                    }

                }




            })
        </script>

    </body>

</html>