当前位置: 首页 > news >正文

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 组件,用于路由切换动画
http://www.jsqmd.com/news/1077494/

相关文章:

  • XGBoost标签噪声识别与清洗实战指南
  • 伊曲莫德与 etrasimod 的首过心脏效应监测
  • 从素材库快速做歌的平台
  • MPC8315E安全引擎寄存器深度解析:MDEU、PKEU、RNGU实战配置与避坑指南
  • 个人微信聊天记录怎么变成 AI 知识库?聊聊异构接口的打通方法
  • 照着用就行:2026年最值得信赖的专业AI论文写作工具
  • Adobe-GenP 3.0完整指南:三步解锁Adobe全家桶的简单方案
  • 革命性Koikatsu Sunshine完整优化方案:一键解锁专业级角色创作体验
  • 2026年,GEO优化为何成为企业必争之地?源码开源揭秘
  • JoyCon-Driver:任天堂Switch手柄PC驱动的终极解决方案
  • Rust 并发编程:Tokio 运行时与 Channel 通信的深度实战
  • 如何用PX4神经网络控制技术让无人机自主巡检电力线路?
  • Windows系统文件d3dx10_41.dll丢失找不到问题解决
  • 3步永久免费激活IDM:解锁Internet Download Manager完整功能的终极指南
  • 计算机视觉模型部署后维护实战指南:应对三重漂移与四维监控
  • Log4j漏洞复现:从JNDI注入原理到靶场实战与防御
  • 告别网盘限速烦恼:开源下载助手LinkSwift让你的文件传输飞起来
  • Django计算机毕设之基于 Django 的 Python 程序设计智能答疑平台设计与实现 基于 Django 的课程知识点智能检索问答系统(完整前后端代码+说明文档+LW,调试定制等)
  • 想深耕网络安全竞赛?一文吃透 CTF 全赛道知识点,新手快速上手拿奖必备干货指南
  • QuickRecorder:解锁macOS屏幕录制的专业级解决方案
  • CTF-XXE XML大冒险:你能找到隐藏的宝藏吗?
  • 统一搜索与推荐:大语言模型时代的信息获取新探索
  • 计算机毕业设计之基于Java的私人牙科诊治管理系统的设计与实现
  • Git 常用操作(format-patch, diff)
  • OpenCorePkg实战手册:构建稳定黑苹果引导的5个关键场景
  • 3步掌握Chrome图片格式转换:一键另存为JPG/PNG/WebP的终极指南
  • MySQL 深度优化:从索引原理到分库分表的进阶实战
  • 从手搓LLM到智能体架构:大模型工程化实战路径
  • 白杨SEO:企业官网有啥价值?AI搜索友好网站页面三大标准是啥?
  • SSH 隧道实用指南:本地与远程端口转发全解析,助你成隧道高手!