vue 动画 实现
Vue 动画实现基础
Vue 提供了 <transition> 和 <transition-group> 组件,结合 CSS 或 JavaScript 钩子实现动画效果。核心是通过条件渲染(如 v-if、v-show)或动态数据驱动元素进入/离开的过渡。
使用 CSS 过渡类名
Vue 会自动为元素添加以下类名,通过 CSS 定义动画效果:
.v-enter-from/.v-leave-from:进入/离开的初始状态。.v-enter-active/.v-leave-active:定义过渡持续时间、缓动函数。.v-enter-to/.v-leave-to:进入/离开的结束状态。
示例代码:
<transition name="fade">
<p v-if="show">内容</p>
</transition>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter-from, .fade-leave-to {
opacity: 0;
}
自定义过渡类名
可通过 enter-class、leave-class 等属性指定自定义类名,与第三方动画库(如 Animate.css)结合:
<transition
enter-active-class="animate__animated animate__fadeIn"
leave-active-class="animate__animated animate__fadeOut"
>
<p v-if="show">内容</p>
</transition>
JavaScript 钩子动画
通过 @before-enter、@enter 等钩子函数实现更复杂的动画逻辑,适合与 GSAP 等库配合:
<transition
@before-enter="beforeEnter"
@enter="enter"
@leave="leave"
>
<p v-if="show">内容</p>
</transition>
methods: {
beforeEnter(el) {
el.style.opacity = 0;
},
enter(el, done) {
gsap.to(el, {
opacity: 1,
duration: 1,
onComplete: done
});
},
leave(el, done) {
gsap.to(el, {
opacity: 0,
duration: 0.5,
onComplete: done
});
}
}
列表动画(transition-group)
为动态列表项添加动画时,需使用 <transition-group> 并设置 key:
<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 0.5s;
}
.list-enter-from, .list-leave-to {
opacity: 0;
transform: translateY(30px);
}
状态动画
通过响应式数据驱动 SVG 或数字变化,结合计算属性或侦听器实现动态效果:
<svg>
<circle :r="radius" fill="blue"></circle>
</svg>
data() {
return { radius: 10 };
},
methods: {
grow() {
gsap.to(this, { radius: 20, duration: 1 });
}
}
性能优化建议
- 优先使用 CSS 动画(如
transform和opacity),避免触发重绘。 - 对复杂动画使用
will-change提示浏览器优化。 - 列表动画中为元素设置
key以提高 Diff 效率。
通过组合上述方法,可覆盖从简单过渡到复杂交互动画的大部分场景。







