vue实现的的动画
Vue 动画实现方法
Vue 提供了多种方式实现动画效果,包括内置组件、CSS 过渡/动画、JavaScript 钩子以及第三方库集成。
使用 <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;
}
使用 CSS 动画
通过定义 CSS @keyframes 实现更复杂的动画效果。
<transition name="bounce">
<p v-if="show">弹跳动画效果</p>
</transition>
.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 钩子
对于需要更精细控制的动画,可以使用 JavaScript 钩子函数。
<transition
@before-enter="beforeEnter"
@enter="enter"
@leave="leave"
:css="false"
>
<p v-if="show">JavaScript 控制的动画</p>
</transition>
methods: {
beforeEnter(el) {
el.style.opacity = 0
el.style.transform = 'translateX(100px)'
},
enter(el, done) {
anime({
targets: el,
opacity: 1,
translateX: 0,
duration: 500,
complete: done
})
},
leave(el, done) {
anime({
targets: el,
opacity: 0,
translateX: 100,
duration: 500,
complete: done
})
}
}
列表过渡
使用 <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);
}
第三方动画库集成
可以结合 GSAP、Anime.js 等专业动画库实现复杂效果。
import gsap from 'gsap'
export default {
methods: {
beforeEnter(el) {
gsap.set(el, {
scale: 0.8,
opacity: 0
})
},
enter(el, done) {
gsap.to(el, {
duration: 1,
scale: 1,
opacity: 1,
ease: 'elastic.out(1, 0.3)',
onComplete: done
})
}
}
}
动画性能优化
使用 will-change 属性提示浏览器哪些属性会变化,提升动画性能。
.animated-element {
will-change: transform, opacity;
}
优先使用 transform 和 opacity 属性实现动画,这些属性不会触发重排,性能更好。避免使用 height、width、margin 等会触发重排的属性。
对于复杂动画,考虑使用 requestAnimationFrame 替代 setTimeout 或 setInterval。







