vue 动画 实现
Vue 动画实现方法
Vue 提供了多种方式实现动画效果,主要通过内置组件和第三方库完成。以下是常见的实现方法:
使用 <transition> 组件
Vue 内置的 <transition> 组件可以为元素或组件的进入/离开过渡添加动画效果。通过添加 CSS 类名或 JavaScript 钩子实现动画。
<transition name="fade">
<p v-if="show">淡入淡出的内容</p>
</transition>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
使用 <transition-group> 组件
适用于列表动画,为多个元素添加过渡效果。每个元素需要唯一的 key 属性。
<transition-group name="list" tag="ul">
<li v-for="item in items" :key="item.id">
{{ item.text }}
</li>
</transition-group>
使用 JavaScript 钩子
在 <transition> 组件中通过 JavaScript 钩子实现更复杂的动画逻辑。
<transition
@before-enter="beforeEnter"
@enter="enter"
@leave="leave"
>
<p v-if="show">JavaScript 动画</p>
</transition>
methods: {
beforeEnter(el) {
el.style.opacity = 0;
},
enter(el, done) {
anime({
targets: el,
opacity: 1,
duration: 1000,
complete: done
});
}
}
使用第三方动画库
结合 GSAP、Anime.js 等库实现复杂动画效果。
import anime from 'animejs';
export default {
methods: {
animate() {
anime({
targets: '.box',
translateX: 250,
rotate: '1turn',
duration: 800
});
}
}
}
状态驱动的动画
通过数据绑定和计算属性驱动 CSS 动画。

<div
class="box"
:style="{ transform: `rotate(${rotateDegrees}deg)` }"
@click="rotate"
></div>
data() {
return {
rotateDegrees: 0
}
},
methods: {
rotate() {
this.rotateDegrees += 45;
}
}
动画性能优化建议
- 优先使用 CSS 动画而非 JavaScript 动画
- 使用
transform和opacity属性实现动画,避免触发重排 - 对于复杂动画考虑使用
requestAnimationFrame - 适当使用
will-change属性提示浏览器优化
以上方法可根据具体需求组合使用,Vue 的动画系统既支持简单的 CSS 过渡,也能实现复杂的 JavaScript 动画。






