vue动画怎么实现
使用 Vue 内置的 <transition> 组件
Vue 提供了 <transition> 和 <transition-group> 组件,用于处理元素进入/离开的动画效果。
- 基本用法:
<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; } - 动画类名:
Vue 会自动为过渡添加类名(如v-enter-active),通过name属性可自定义前缀(如fade-enter-active)。
结合 CSS 动画库(如 Animate.css)
直接引入第三方 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>
需先安装 Animate.css:
npm install animate.css
并在项目中引入:
import 'animate.css';
使用 JavaScript 钩子实现复杂动画
通过 <transition> 的 JavaScript 钩子(如 @before-enter、@enter)实现更复杂的逻辑,例如结合 GSAP。
<transition
@before-enter="beforeEnter"
@enter="enter"
@leave="leave"
>
<div v-if="show">JavaScript 动画</div>
</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: 1,
onComplete: done
});
}
}
列表动画(<transition-group>)
对动态列表(如 v-for 渲染的元素)使用 <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, .list-leave-to {
opacity: 0;
transform: translateY(30px);
}
状态驱动的动态动画
通过 Vue 的响应式数据绑定,动态修改样式或类名实现动画。
<div :class="{ 'active': isActive }">动态类名动画</div>
.active {
transform: scale(1.2);
transition: transform 0.3s;
}
第三方库集成(如 GSAP、Motion One)
对于高级动画需求,可结合 GSAP 或 Motion One 等库。
import { gsap } from 'gsap';
export default {
mounted() {
gsap.to(this.$refs.box, {
x: 100,
duration: 1,
repeat: -1,
yoyo: true
});
}
};
注意事项
- 性能优化:避免过多复杂动画导致页面卡顿,优先使用 CSS 动画。
- 浏览器兼容性:检查 CSS 属性(如
transform)的兼容性,必要时添加前缀。 - 移动端适配:考虑触摸事件与动画的交互体验。







