vue提供了一个封装动画的组件 <transition name="tr"></transition>,将须要执行动画的元素包裹在该组件中,在经过css修改样式便可知足需求
命名该动画的样式使用 .v-enter等过渡类名来定义动画 如<transition name="tr"></transition> 的类名为 .tr-enter
vue一共提供了6个过渡类名,官方文档的解释有一些拗口,我决定以点击显示底部弹框为例解释6个类名的状态css
用通俗的语句解释完6个状态后开始书写样式,将点击显示/点击隐藏 两个动做分解vue
// 点击显示弹窗的动画 // 弹框出现前的样式 .slide-enter{ transform: translate3d(0,100%,0) } // 从下往上弹出的过程,即过渡效果的样式 .slide-enter-active{ transition:all 0.5s } // 弹框弹出的动画结束,即显示在页面底部 .slide-enter-to{ transform: translate3d(0,0,0) } // 点击隐藏弹框的动画 // 弹框隐藏前的样式,此时在页面底部 .slide-leave{ transform: translate3d(0,100%,0) } // 弹框从上往下滑的过渡效果 .slide-leave-active{ transition:all 0.5s } // 弹框滑出页面底部即隐藏:这一步骤的样式能够忽略不写,由于在slide-leave-to这个状态时v-leave的样式已经被删除 v-show为false弹框隐藏,弹框隐藏的样式 .slide-leave-to{ transform: translate3d(0,100%,0) }
有时候过渡元素时须要条件渲染,若是渲染的两个标签是相同的,须要用key惟一值来区别。代码以下数组
<transition> <div> <button v-if="flag" :key="submit">submit</button> <button v-else :key="cancel">cancel</button> </div> </transition>
假如在这个基础下增长一个需求,先隐藏submit按钮再显示cancel,即离开和开始的动画同时进行。能够使用过渡模式来解决问题。
mode="out-in" 当前元素先进行过渡,过渡结束后新元素再进行过渡
mode="in-out" 新元素先进行过渡,过渡结束当前元素再过渡app
除了单个标签过渡外,在实际开发中确定还会涉及到列表过渡。例如往一个列表添加或删除一条数据。
例以下图,动态添加或删除一个数组中的数字,插入的数字和原有的都要有一个过渡的动画。在这种状况下须要使用<transition-group><transition-group>过渡组件,具体代码以下dom
组件的结构以下ide
<template> <div class="number-wrapper"> <button @click="add">add</button> <button @click="remove">remove</button> <div class="list"> <transition-group name="fade"> //注意,在transition-group下:key的值不可以是index <span v-for="(item) in list" :key="item" class="item">{{item}}</span> </transition-group> </div> </div> </template>
js代码动画
<script> export default { data () { return { list: [1] } }, methods: { add () { // 获取当前数组长度 let num = this.list.length // 获取随机位置 let index = Math.floor(Math.random() * num) // 添加下一个数字到随机位置 this.list.splice(index, 0, num + 1) }, remove () { let num = this.list.length let index = Math.floor(Math.random() * num) //随机移除一个数字 this.list.splice(index, 1) } } } </script>
css部分this
.fade-enter, .fade-leave-to opacity:0 transform:translateY(20px) .fade-leave-active position: absolute .item margin-right: 10px display: inline-block transition: all 0.5s