vue实现过度动画
Vue过渡动画的实现方式
Vue提供了内置的过渡系统,可以通过<transition>和<transition-group>组件实现元素进入/离开的动画效果。主要分为CSS过渡和JavaScript过渡两种方式。
CSS过渡实现
在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;
}
JavaScript过渡实现
通过JavaScript钩子函数实现更复杂的动画逻辑:
<transition
@before-enter="beforeEnter"
@enter="enter"
@leave="leave"
:css="false"
>
<p v-if="show">JavaScript动画示例</p>
</transition>
在methods中定义动画方法:
methods: {
beforeEnter(el) {
el.style.opacity = 0
el.style.transform = 'translateX(100px)'
},
enter(el, done) {
anime({
targets: el,
opacity: 1,
translateX: 0,
duration: 500,
complete: done
})
},
leave(el, done) {
anime({
targets: el,
opacity: 0,
translateX: 100,
duration: 500,
complete: done
})
}
}
列表过渡
使用<transition-group>实现列表元素的动画:
<transition-group name="list" tag="ul">
<li v-for="item in items" :key="item.id">
{{ item.text }}
</li>
</transition-group>
对应CSS样式:
.list-enter-active, .list-leave-active {
transition: all 0.5s;
}
.list-enter, .list-leave-to {
opacity: 0;
transform: translateY(30px);
}
第三方动画库集成
可以结合Animate.css等第三方动画库:
<transition
enter-active-class="animate__animated animate__bounceIn"
leave-active-class="animate__animated animate__bounceOut"
>
<p v-if="show">使用Animate.css的动画</p>
</transition>
路由过渡
在Vue Router中实现页面切换动画:
<transition name="slide" mode="out-in">
<router-view></router-view>
</transition>
对应CSS样式:
.slide-enter-active {
transition: all 0.3s ease;
}
.slide-leave-active {
transition: all 0.3s ease;
}
.slide-enter {
transform: translateX(100%);
}
.slide-leave-to {
transform: translateX(-100%);
}
动画性能优化建议
使用transform和opacity属性进行动画,这些属性不会触发重排,性能更好
对于复杂动画,考虑使用will-change属性提前告知浏览器哪些属性会变化
.animated-element {
will-change: transform, opacity;
}
避免在动画期间执行复杂的JavaScript操作,保持动画流畅性







