news 2026/6/25 22:04:32

12-Vue2 过渡与动画

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
12-Vue2 过渡与动画

Vue2 过渡与动画

过渡和动画让应用的交互更加流畅自然。Vue 提供了内置的transitiontransition-group组件,配合 CSS 和 JavaScript 钩子,可以轻松实现各种进入、离开和列表过渡效果。


一、前言

在 modern web 应用中,用户体验至关重要。元素的突然出现和消失会让界面显得生硬,而恰当的过渡动画能够:

  • 引导用户的注意力
  • 传达状态变化(加载、成功、错误)
  • 提升应用的质感与专业度

Vue 内置了一套完善的过渡系统,无需引入第三方库即可实现大多数动画需求。

Vue 过渡系统

单元素/组件过渡

列表过渡

状态过渡

transition 组件

CSS 过渡/动画

JavaScript 钩子

transition-group 组件

列表排序动画

FLIP 动画

数字/颜色插值


二、transition 组件

2.1 基本用法

使用transition包裹需要过渡的元素或组件:

<transitionname="fade"><pv-if="show">内容</p></transition>
/* 进入/离开的激活状态 */.fade-enter-active, .fade-leave-active{transition:opacity 0.5s;}/* 进入开始 / 离开结束 */.fade-enter, .fade-leave-to{opacity:0;}

2.2 过渡类名详解

Vue 为过渡元素自动添加 6 个类名:

离开激活进入离开激活进入v-enter ->> v-enter-active ->> v-enter-tov-leave ->> v-leave-active ->> v-leave-to
类名说明
v-enter进入开始状态,元素插入前生效
v-enter-active进入整个激活状态,过渡/动画生效期间
v-enter-to进入结束状态(Vue 2.1.8+)
v-leave离开开始状态
v-leave-active离开整个激活状态
v-leave-to离开结束状态(Vue 2.1.8+)

使用name="fade"后,类名前缀v-替换为fade-

2.3 CSS 过渡示例

<template><div><button@click="show = !show">切换</button><transitionname="slide-fade"><pv-if="show">带位移的淡入淡出</p></transition></div></template>
/* 进入和离开动画 */.slide-fade-enter-active{transition:all 0.3s ease;}.slide-fade-leave-active{transition:all 0.8scubic-bezier(1,0.5,0.8,1);}/* 进入开始 / 离开结束状态 */.slide-fade-enter, .slide-fade-leave-to{transform:translateX(10px);opacity:0;}

三、CSS 动画

3.1 使用 @keyframes

与 CSS 过渡的区别在于动画使用@keyframes

<transitionname="bounce"><pv-if="show"style="display:inline-block">弹跳动画</p></transition>
.bounce-enter-active{animation:bounce-in 0.5s;}.bounce-leave-active{animation:bounce-in 0.5s reverse;}@keyframesbounce-in{0%{transform:scale(0);}50%{transform:scale(1.5);}100%{transform:scale(1);}}

3.2 自定义过渡类名

当需要使用第三方 CSS 动画库(如 Animate.css)时,可以自定义类名:

<transitionenter-active-class="animate__animated animate__bounceIn"leave-active-class="animate__animated animate__bounceOut"><pv-if="show">Animate.css 动画</p></transition>

四、JavaScript 钩子

4.1 事件钩子函数

可以在过渡属性中声明 JavaScript 钩子:

<transition@before-enter="beforeEnter"@enter="enter"@after-enter="afterEnter"@enter-cancelled="enterCancelled"@before-leave="beforeLeave"@leave="leave"@after-leave="afterLeave"@leave-cancelled="leaveCancelled"><pv-if="show">JavaScript 控制过渡</p></transition>
methods:{beforeEnter(el){el.style.opacity=0;},enter(el,done){Velocity(el,{opacity:1,fontSize:'1.4em'},{duration:300,complete:done});},afterEnter(el){console.log('进入完成');}}

注意:使用 JavaScript 钩子时,需要添加:css="false"告诉 Vue 跳过 CSS 检测,避免与 JavaScript 动画冲突。


五、初始渲染过渡

5.1 appear 属性

在首次渲染时应用过渡效果:

<transitionappear><p>页面加载时自动执行进入动画</p></transition>

也可以自定义 appear 类名:

<transitionappearappear-class="custom-appear-class"appear-active-class="custom-appear-active-class"><p>自定义初始动画</p></transition>

六、transition-group 列表过渡

6.1 列表的进入/离开过渡

transition-group用于同时渲染多个元素的过渡:

<transition-groupname="list"tag="ul"><liv-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:translateX(30px);}

6.2 列表排序过渡

为列表的排序添加平滑过渡:

<transition-groupname="flip-list"tag="ul"><liv-for="item in items":key="item.id">{{ item.text }}</li></transition-group>
.flip-list-move{transition:transform 0.5s;}
methods:{shuffle(){this.items=_.shuffle(this.items);}}

6.3 列表的交错过渡

通过 data 属性与 CSS 变量实现交错延迟:

<transition-groupname="stagger"tag="ul"><liv-for="(item, index) in items":key="item.id":data-index="index">{{ item.text }}</li></transition-group>
.stagger-enter-active, .stagger-leave-active{transition:all 0.5s;}.stagger-enter, .stagger-leave-to{opacity:0;transform:translateY(30px);}.stagger-move{transition:transform 0.5s;}/* 交错过渡 */.stagger-enter-active{transition-delay:calc(0.1s *var(--index));}

七、可复用的过渡组件

将过渡封装为可复用组件:

// components/FadeTransition.vue<template><transition name="fade"mode="out-in"><slot></slot></transition></template><style scoped>.fade-enter-active,.fade-leave-active{transition:opacity0.3s ease;}.fade-enter,.fade-leave-to{opacity:0;}</style>

使用:

<FadeTransition><router-view/></FadeTransition>

八、过渡模式

8.1 mode 属性

当切换两个元素时,控制进入和离开的顺序:

<!-- in-out:新元素先进入,旧元素再离开 --><transitionname="fade"mode="in-out"><button:key="isEditing"@click="isEditing = !isEditing">{{ isEditing ? '保存' : '编辑' }}</button></transition><!-- out-in:旧元素先离开,新元素再进入(推荐) --><transitionname="fade"mode="out-in"><component:is="currentView"></component></transition>
模式说明适用场景
in-out新元素先进入较少使用,可能重叠
out-in旧元素先离开推荐,避免位置重叠

九、第三方动画库集成

9.1 使用 GSAP

<transition@enter="enter"@leave="leave":css="false"><pv-if="show">GSAP 动画</p></transition>
importgsapfrom'gsap';methods:{enter(el,done){gsap.from(el,{opacity:0,y:-50,duration:0.5,onComplete:done});},leave(el,done){gsap.to(el,{opacity:0,y:50,duration:0.5,onComplete:done});}}

十、总结

特性用途关键属性/类名
transition单元素/组件过渡name, mode, appear
进入类控制进入动画v-enter, v-enter-active, v-enter-to
离开类控制离开动画v-leave, v-leave-active, v-leave-to
transition-group列表过渡tag, move-class
JavaScript 钩子复杂动画控制@enter, @leave
appear初始渲染动画appear, appear-class

核心原则:优先使用 CSS 过渡(性能更好),复杂场景使用 JavaScript 钩子配合动画库。

下一章我们将学习 Vue 的渲染函数与 JSX,深入理解 Vue 的模板编译机制。


十一、练习

  1. 实现一个带淡入淡出效果的模态框组件
  2. 创建一个可排序的待办事项列表,添加/删除/排序都有平滑动画
  3. 使用 transition-group 实现一个图片画廊,支持添加/删除图片
  4. 封装一个通用的 FadeTransition 组件,用于路由切换动画
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 22:04:11

Mem Reduct:基于Native API的Windows实时内存管理技术深度解析

Mem Reduct&#xff1a;基于Native API的Windows实时内存管理技术深度解析 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct…

作者头像 李华
网站建设 2026/6/25 22:02:46

SDE:扩散模型的底层操作系统与工程实践指南

1. 项目概述&#xff1a;当“时间倒流”成为可计算的工程任务你有没有想过&#xff0c;让一张清晰的照片“退化”成一片雪花噪点&#xff0c;再从这片噪点里&#xff0c;一帧一帧地“长出”一张全新的人脸、一幅山水画&#xff0c;甚至一段3D场景&#xff1f;这听起来像科幻电影…

作者头像 李华
网站建设 2026/6/25 22:02:14

适合先选Beat再创作的AI做歌工具:主流伴奏创作平台实测分享

对于绝大多数独立创作者、说唱爱好者和新手音乐人来说&#xff0c;先定Beat、再写词曲、最后补人声&#xff0c;是远比凭空创作更顺畅的做歌流程。很多时候创作卡顿、灵感枯竭&#xff0c;不是没有创作能力&#xff0c;而是缺少适配的伴奏基调。固定的节拍、曲风、情绪氛围&…

作者头像 李华
网站建设 2026/6/25 22:00:56

web第八次作业

一、接口文档1. 管理员登录1.1 管理员登录基本信息请求参数格式&#xff1a;application/x-www-form-urlencoded参数名类型是否必须备注usernamestring必须管理员账号passwordstring必须管理员密码请求示例usernameadmin&password123456响应数据格式&#xff1a;applicatio…

作者头像 李华
网站建设 2026/6/25 21:59:46

Java毕设项目: 民宿宾馆客房入住智能化管理系统设计与实现 酒店客房状态更新与入住预约管理系统设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华