vue实现动画
Vue 动画实现方法
Vue 提供了多种方式实现动画效果,主要依赖于内置的 <transition> 和 <transition-group> 组件,以及结合 CSS 或 JavaScript 钩子。
使用 <transition> 组件实现单元素动画
通过包裹需要动画的元素,Vue 会在元素插入或移除时自动添加过渡类名:
<transition name="fade">
<div v-if="show">内容</div>
</transition>
对应的 CSS 过渡样式:
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
使用 CSS 动画
定义关键帧动画并应用于 Vue 过渡:
.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); }
}
JavaScript 钩子实现动画
通过事件钩子实现更复杂的动画逻辑:
<transition
@before-enter="beforeEnter"
@enter="enter"
@leave="leave"
>
<div v-if="show">内容</div>
</transition>
对应的 JavaScript 方法:
methods: {
beforeEnter(el) {
el.style.opacity = 0;
el.style.transformOrigin = 'left';
},
enter(el, done) {
anime({
targets: el,
opacity: 1,
translateX: [20, 0],
duration: 300,
easing: 'easeInOutQuad',
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 1s;
}
.list-enter, .list-leave-to {
opacity: 0;
transform: translateY(30px);
}
.list-move {
transition: transform 1s;
}
第三方动画库集成
与 Animate.css 等库结合使用:
<transition
enter-active-class="animate__animated animate__bounceIn"
leave-active-class="animate__animated animate__bounceOut"
>
<div v-if="show">内容</div>
</transition>
状态驱动的动画
使用 Vue 的响应式系统和计算属性实现状态动画:
computed: {
animatedStyle() {
return {
transform: `rotate(${this.rotation}deg)`,
transition: 'transform 0.5s ease'
};
}
}
在模板中应用:
<div :style="animatedStyle">旋转元素</div>
路由过渡动画
为 Vue Router 添加页面切换动画:
<router-view v-slot="{ Component }">
<transition name="route" mode="out-in">
<component :is="Component" />
</transition>
</router-view>
对应的 CSS 样式:
.route-enter-active, .route-leave-active {
transition: opacity 0.3s, transform 0.3s;
}
.route-enter-from, .route-leave-to {
opacity: 0;
transform: translateX(30px);
}
以上方法可根据具体需求组合使用,实现从简单到复杂的各种动画效果。







