CSS transition
<div id="demo"><button v-on:click="visible = !visible">Toggle</button><!-- 第一步,先写transition动画,name=fade表示css中的动画选择器要以fade开头 --><transition name="fade"><p v-if="visible">hello</p></transition></div>
/*以fade开头*/.fade-enter-active,.fade-leave-active{transition: all 3s;}.fade-enter,.fade-leave-to{opacity:0;width:100px;}p{border:1px solid red;width:300px;}
new Vue({el:'demo',data:{visible:true}})
v-enter 第一帧的样式,也就是进入过渡的开始状态,
v-enter-active 动画中,正在进入状态
v-enter-to 第二帧,进入过渡的结束状态
动画过程细节,首先v-enter 和 v-enter-active出现。然后变成v-enter-to 和 v-enter-active在,最后这两个都被删掉了。
CSS animation
<div id="example-2"><button @click="show = !show">Toggle show</button><transition name="bounce"><p v-if="show">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.</p></transition></div>
.bounce-enter-active {animation: bounce-in .5s;}.bounce-leave-active {animation: bounce-in .5s reverse;}@keyframes bounce-in {0% {transform: scale(0);}50% {transform: scale(1.5); /*先变大*/}100% {transform: scale(1); //再缩回正常状态}}
new Vue({el: '#example-2',data: {show: true}})
JS操作动画
javascript钩子
<transitionv-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>
// ...methods: {// --------// 进入中// --------beforeEnter: function (el) {// ...},// 当与 CSS 结合使用时// 回调函数 done 是可选的enter: function (el, done) {// ...done()},afterEnter: function (el) {// ...},enterCancelled: function (el) {// ...},// --------// 离开时// --------beforeLeave: function (el) {// ...},// 当与 CSS 结合使用时// 回调函数 done 是可选的leave: function (el, done) {// ...done()},afterLeave: function (el) {// ...},// leaveCancelled 只用于 v-show 中leaveCancelled: function (el) {// ...}}
velocity是一个用js做动画的库
多元素动画
<transition mode="out-in"> //out-in可以让两个动画,一个先淡出完成,另一个再淡入<button v-if="isEditing" key="save"> //要加key,不然vue识别不了这两个button的区别Save</button><button v-else key="edit"> //要加key,不然vue识别不了这两个button的区别Edit</button></transition>
多个组件过渡
<transition name="component-fade" mode="out-in"><component v-bind:is="view"></component></transition>
.component-fade-enter-active, .component-fade-leave-active {transition: opacity .3s ease;}.component-fade-enter, .component-fade-leave-to/* .component-fade-leave-active for below version 2.1.8 */ {opacity: 0;}
new Vue({el: '#transition-components-demo',data: {view: 'v-a'},components: {'v-a': {template: '<div>Component A</div>'},'v-b': {template: '<div>Component B</div>'}}})
列表动画
transition-group组件,会在html中以一个默认span标签来渲染,用tag可以自定义标签。mode=”out-in”不能用了。注意内部元素需要key。
<div id="list-demo" class="demo"><button v-on:click="add">Add</button><button v-on:click="remove">Remove</button><transition-group name="list" tag="p"> //tag="p"表示带有for循环的span外面自动套一个p标签<span v-for="item in items" v-bind:key="item" class="list-item">{{ item }}</span></transition-group></div>
.list-item {display: inline-block;margin-right: 10px;}.list-enter-active, .list-leave-active {transition: all 1s;}.list-enter, .list-leave-to/* .list-leave-active for below version 2.1.8 */ {opacity: 0;transform: translateY(30px);}
new Vue({el: '#list-demo',data: {items: [1,2,3,4,5,6,7,8,9],nextNum: 10},methods: {randomIndex: function () {return Math.floor(Math.random() * this.items.length)},add: function () {this.items.splice(this.randomIndex(), 0, this.nextNum++)},remove: function () {this.items.splice(this.randomIndex(), 1)},}})
资料来源:饥人谷
