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钩子
<transition
v-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)
},
}
})
资料来源:饥人谷