您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Vue3过渡动画的方法
## 引言
在现代前端开发中,流畅的过渡动画能显著提升用户体验。Vue3作为当前流行的前端框架,提供了强大的过渡动画系统,允许开发者通过声明式语法实现元素进入/离开、状态变化的动画效果。本文将全面解析Vue3中实现过渡动画的四种核心方法,包括:
1. `<transition>` 基础组件
2. CSS过渡与动画
3. JavaScript钩子函数
4. 第三方动画库集成
---
## 一、`<transition>` 基础组件
### 1.1 基本用法
Vue3内置的`<transition>`组件是动画系统的核心,包裹需要动画的元素即可启用:
```html
<transition>
<div v-if="show">内容</div>
</transition>
当元素插入/移除时,Vue会自动检测目标元素是否应用了CSS过渡/动画,并在以下时机添加对应的类名:
阶段 | 类名 | 生效时机 |
---|---|---|
进入前 | v-enter-from |
元素插入前生效 |
进入中 | v-enter-active |
整个进入阶段 |
进入后 | v-enter-to |
插入完成且动画结束后 |
离开前 | v-leave-from |
离开过渡触发时 |
离开中 | v-leave-active |
整个离开阶段 |
离开后 | v-leave-to |
离开完成且动画结束后 |
通过name
属性可自定义类名前缀:
<transition name="fade">
<!-- 类名将变为 fade-enter-from 等 -->
</transition>
/* 淡入淡出效果 */
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
/* 弹跳动画 */
.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.25) }
100% { transform: scale(1) }
}
处理多个元素切换时的时序问题:
<transition mode="out-in">
<button :key="isEditing" @click="isEditing = !isEditing">
{{ isEditing ? 'Save' : 'Edit' }}
</button>
</transition>
模式 | 效果 |
---|---|
in-out |
新元素先进入,当前元素后离开 |
out-in |
当前元素先离开,新元素后进入(推荐) |
<transition
@before-enter="onBeforeEnter"
@enter="onEnter"
@after-enter="onAfterEnter"
@enter-cancelled="onEnterCancelled"
@before-leave="onBeforeLeave"
@leave="onLeave"
@after-leave="onAfterLeave"
@leave-cancelled="onLeaveCancelled"
>
<!-- 内容 -->
</transition>
const onEnter = (el, done) => {
const elastic = (t) =>
t*(2-t) // 简易弹性函数
let progress = 0
const animate = () => {
progress += 0.02
el.style.transform = `scale(${elastic(progress)})`
if (progress < 1) {
requestAnimationFrame(animate)
} else {
done()
}
}
animate()
}
import gsap from 'gsap'
const onEnter = (el, done) => {
gsap.from(el, {
duration: 0.7,
opacity: 0,
y: 50,
ease: "back.out(1.7)",
onComplete: done
})
}
<transition
enter-active-class="animate__animated animate__bounceIn"
leave-active-class="animate__animated animate__bounceOut"
>
<p v-if="show">Hello</p>
</transition>
import { animate } from "motion"
const onEnter = (el) => {
animate(el,
{ x: [-100, 0], opacity: [0, 1] },
{ duration: 0.6 }
)
}
transform
和opacity
属性(不触发重排)
.animated-element {
will-change: transform;
transform: translateZ(0);
}
requestAnimationFrame
<transition-group>
)<transition-group tag="ul" name="list">
<li v-for="item in items" :key="item.id">
{{ item.text }}
</li>
</transition-group>
<style>
.list-move { /* 对移动元素添加过渡 */
transition: transform 0.8s ease;
}
</style>
<transition :name="transitionName">
<!-- 根据状态动态切换动画 -->
</transition>
通过侦听器实现数字变化动画:
import { ref, watch } from 'vue'
const count = ref(0)
const animatedNumber = ref(0)
watch(count, (newVal) => {
gsap.to(animatedNumber, {
duration: 0.5,
value: newVal
})
})
Vue3的过渡动画系统提供了从简单到复杂的全方位解决方案。关键要点总结:
<transition-group>
通过合理组合这些技术,可以创造出既流畅又高效的动画体验。建议根据实际项目需求选择适当的技术方案,并始终关注动画性能指标。
本文示例代码需配合Vue3环境运行,完整项目示例可参考Vue官方示例仓库 “`
注:本文实际约3200字,完整3600字版本可扩展以下内容: 1. 增加”动画性能监测”章节(约200字) 2. 补充”移动端适配注意事项”(约200字) 3. 添加更多第三方库对比表格
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。