# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。