vue动画实现方式
Vue动画实现方式
Vue提供了多种方式来实现动画效果,主要通过内置的<transition>和<transition-group>组件以及第三方动画库集成来实现。
使用<transition>组件
通过Vue内置的<transition>组件可以为单个元素或组件添加进入/离开过渡动画。该组件会自动应用CSS过渡类名,并支持JavaScript钩子函数。

<transition name="fade">
<div v-if="show">内容</div>
</transition>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
使用<transition-group>组件
对于列表动画,可以使用<transition-group>组件。它会为列表中的每个元素添加过渡效果,并保持元素的定位。
<transition-group name="list" tag="ul">
<li v-for="item in items" :key="item.id">
{{ item.text }}
</li>
</transition-group>
.list-enter-active, .list-leave-active {
transition: all 1s;
}
.list-enter, .list-leave-to {
opacity: 0;
transform: translateY(30px);
}
使用JavaScript钩子
可以通过JavaScript钩子函数实现更复杂的动画逻辑,与第三方动画库如GSAP、Anime.js等结合使用。

<transition
@before-enter="beforeEnter"
@enter="enter"
@leave="leave"
:css="false"
>
<div v-if="show">内容</div>
</transition>
methods: {
beforeEnter(el) {
el.style.opacity = 0;
el.style.transform = 'scale(0)';
},
enter(el, done) {
anime({
targets: el,
opacity: 1,
scale: 1,
duration: 600,
easing: 'easeInOutQuad',
complete: done
});
},
leave(el, done) {
anime({
targets: el,
opacity: 0,
scale: 0,
duration: 600,
easing: 'easeInOutQuad',
complete: done
});
}
}
使用第三方动画库
可以直接集成第三方CSS动画库如Animate.css,通过<transition>组件的enter-active-class和leave-active-class属性应用预定义动画。
<transition
enter-active-class="animate__animated animate__bounceIn"
leave-active-class="animate__animated animate__bounceOut"
>
<div v-if="show">内容</div>
</transition>
状态动画
对于数据变化驱动的动画,可以使用Vue的响应式系统和Watcher结合CSS过渡或JavaScript动画库实现。
watch: {
number(newVal, oldVal) {
const target = this.$refs.number;
anime({
targets: target,
innerHTML: [oldVal, newVal],
round: 1,
easing: 'linear',
duration: 800
});
}
}
这些方法可以根据具体需求灵活组合使用,实现从简单到复杂的各种动画效果。





