Vue动画

1、使用过渡类名
需求:点击按钮,让 h3 显示,再点击,让 h3 隐藏
第一步:使用 transition 元素,把 需要被动画控制的元素,包裹起来

    <transition>
            <h3 v-if="flag">这是一个h3</h3>
    </transition>

第二步:自定义两组样式,来控制 transition 内部的元素实现动画

<style>
    /* v-enter  【这是一个时间点】 是进入元素之前,元素的起始状态,此时还没有开始进入 */
    /* v-leave-to  【】  是动画离开之后,离开的终止状态, 此时,元素 动画已经结束了*/

    .v-enter,
    .v-leave-to{
        opacity: 0;
        transform: translate(150px)
    }

    /* v-enter-active【入场动画的时间段】 v-leave-active【出场动画的时间段】 */
    .v-enter-active,
    .v-leave-active{
        transition: all 0.8s ease;
    }
第三步:实现按钮点击事件,控制动画的出现与隐藏
<input type="button" value="toggle" @click="flag = ! flag">

2、修改v-前缀

<!-- 自定义两组类来实现动画 ,给个name属性,把v-前缀替换掉  -->
        <transition name="my">
                <h6 v-if="flag2">这是一个h6</h6>
        </transition>

自定义两组样式,来控制 transition 内部的元素实现动画

.my-enter,
        .my-leave-to{
            opacity: 0;
            transform: translateY(70px)
        }

        /* my-enter-active【入场动画的时间段】 my-leave-active【出场动画的事件段】 */
        .my-enter-active,
        .my-leave-active{
            transition: all 0.8s ease;
        }

3、使用第三方类animate.css实现动画
在animate官网中找自己需要的动画
Vue动画
这里以bounceIn、bounceOut为例,入场使用 bounceIn 离场使用 bounceOut 。
第一步:引入第三方包

<link rel="stylesheet" href="./lib/animate.css">

第二步:使用 :duration=“毫秒值” 来统一设置 入场和离场时候的动画时长

<transition 
        enter-active-class="bounceIn" 
        leave-active-class="bounceOut" 
        :duration="{ enter:200 , leave:400 }">
            <h3 v-if="flag" class="animated">这是一个h3</h3>
        </transition>

4、使用钩子函数模拟小球半场动画
第一步:使用transition 元素把 小球包裹起来

<transition
            @before-enter="beforeEnter"
            @enter="enter"
            @after-enter="afterEnter">

            <div class="ball" v-show="flag"></div>
        </transition>

第二步:在script中调用钩子函数且实现方法

<script>
        
        Vue.directive()

        var vm = new Vue({
            el:'#app',
            data:{
                flag:false
            },
            methods:{
                // 注意: 动画钩子函数的第一个参数 :el,表示 要执行动画的那个DOM元素,是个原生的 js DOM对象
                // 大家可以认为,el 是通过 document.getElementById('')方式获取到的原生JS DOM对象
                beforeEnter(el){
                    // 表示动画入场之前,此时,动画尚未开始,可以 在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>

5、列表动画
注意:
1、在实现列表过渡的时候,如果需要过渡的元素,是通过 v-for 循环渲染出来的,不能使用 transition 包裹,需要使用 transition-group
2、如果要为 v-for循环创建的元素设置动画,必须为每一个元素设置 :key属性
第一步:包裹元素

 <!-- 给 transition-group 添加 appear 属性,实现页面刚展示出来时候 页面的入场效果
	通过 为 transition-group 元素,设置 tag 属性,指定 transition-group 渲染为指定的
    元素,如果不指定 tag 属性,默认渲染为span 标签  -->
 <transition-group appear tag="ul">
     <li v-for="(item,i) in list" :key="item.id" @click="del(i)">
         {{ item.id }}------{{ item.name }}
     </li>
 </ttransition-group>

注意:del()方法在Vue实例的methods中

del(i){
	this.list.splice(i,1)
}

第二步:设置动画,在style标签中

.v-enter,
        .v-leave-to{
            opacity: 0;
            transform: translateY(80px);
        }

        .v-enter-active,
        .v-leave-active{
            transition: all 0.6s ease;
        }

第三步:让后续列表渐渐飘上来

/* 下面的  .v-move 和 .v-leave-active 配合使用,能够实现列表后续的元素渐渐地飘上来的效果 */
        .v-move{
            transition: all 0.6s ease;
        }

        .v-leave-active{
            position: absolute;
        }