vue动画的实现方案
Vue动画的实现方案
Vue提供了多种方式来实现动画效果,主要通过内置的过渡和动画系统,结合CSS或JavaScript来完成。
使用<transition>组件实现基础过渡
Vue的<transition>组件可以包裹任何元素或组件,为其添加进入/离开过渡效果。需要在CSS中定义过渡类名:
<transition name="fade">
<p v-if="show">淡入淡出的文本</p>
</transition>
对应的CSS样式:
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
使用CSS动画替代过渡
除了过渡效果,可以直接使用CSS动画:
.bounce-enter-active {
animation: bounce-in 0.5s;
}
.bounce-leave-active {
animation: bounce-in 0.5s reverse;
}
@keyframes bounce-in {
0% { transform: scale(0) }
50% { transform: scale(1.5) }
100% { transform: scale(1) }
}
自定义过渡类名
可以覆盖默认的过渡类名,与第三方CSS动画库(如Animate.css)配合使用:
<transition
enter-active-class="animated tada"
leave-active-class="animated bounceOutRight"
>
<p v-if="show">自定义类名的动画</p>
</transition>
JavaScript钩子实现复杂动画
通过JavaScript钩子可以在过渡过程中执行自定义JavaScript代码:
<transition
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter"
@enter-cancelled="enterCancelled"
@before-leave="beforeLeave"
@leave="leave"
@after-leave="afterLeave"
@leave-cancelled="leaveCancelled"
>
<p v-if="show">JavaScript动画</p>
</transition>
对应的JavaScript方法:
methods: {
beforeEnter(el) {
el.style.opacity = 0
},
enter(el, done) {
Velocity(el, { opacity: 1 }, { duration: 1000, complete: done })
}
}
列表过渡<transition-group>
对多个元素进行过渡需要使用<transition-group>组件:
<transition-group name="list" tag="ul">
<li v-for="item in items" :key="item.id">
{{ item.text }}
</li>
</transition-group>
状态动画
通过数据变化驱动动画,通常结合第三方库如GreenSock或Velocity.js:
watch: {
number(newValue) {
TweenLite.to(this.$data, 0.5, { tweenedNumber: newValue })
}
}
可复用过渡组件
将过渡封装为可复用组件:
Vue.component('fade-transition', {
template: `
<transition name="fade" mode="out-in" v-on="$listeners">
<slot></slot>
</transition>
`
})
性能优化技巧
使用transform和opacity属性实现动画可获得最佳性能。避免使用height、margin等可能引发重排的属性。对于复杂动画,考虑使用requestAnimationFrame或CSS的will-change属性。







