Vue过渡系统通过Transition+CSS类、JS钩子、TransitionGroup和第三方库协同实现复杂交互动画:CSS类提供时间锚点控制样式与时机;JS钩子支持逐帧与链式动画;TransitionGroup管理列表增删排布;第三方库增强动效表现力,Vue专注状态驱动。

Vue.js 的过渡系统本身不直接处理“复杂交互动画”,但它提供了极强的扩展性和控制力,让你能以清晰、可维护的方式组合出复杂效果。关键不在于堆砌动画,而在于合理拆解交互逻辑、精准控制动画时机,并与状态变化深度协同。
用 Transition + CSS 动画类 打好基础
所有复杂效果都始于标准过渡类。Vue 会在元素进入/离开时自动添加六类 CSS 类(如 .fade-enter-from、.fade-enter-active、.fade-enter-to,以及对应的 leave 系列)。这些类不是装饰,而是精确的“时间锚点”:
-
-enter-from:动画起始样式(比如opacity: 0; transform: scale(0.8);) -
-enter-active:定义过渡属性和持续时间(比如transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);) -
-enter-to:动画结束样式(比如opacity: 1; transform: scale(1);) - 同理,
-leave-from和-leave-to控制退出过程,-leave-active决定退出的缓动与时长
注意:-active 类必须显式声明 transition 或 animation,否则 Vue 不会等待动画完成;而 from 和 to 类只管样式,不参与时序控制。
用 JavaScript 钩子 突破 CSS 局限
当需要逐帧控制、链式动画、或操作多个 DOM 元素时,CSS 就不够用了。Vue 提供了完整的 JS 钩子,让动画完全可控:
立即学习“前端免费学习笔记(深入)”;
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
-
@before-enter:DOM 插入前,可初始化样式(如设display: none、预设 transform) -
@enter:DOM 已插入,但尚未渲染完成。在这里调用done回调,或使用requestAnimationFrame启动动画 -
@after-enter:动画真正结束,适合触发后续逻辑(如启用按钮、发送埋点) -
@leave:离开开始,可读取当前尺寸、位置,为位移动画做准备 -
@leave-cancelled:动画中途被中断(比如快速连续点击),用于清理未完成的状态
例如实现一个“卡片滑入+缩放+文字淡入”的组合效果:在 @enter 中获取元素引用,用 gsap.to() 或原生 animate() 分别驱动容器位移、图片缩放、标题 opacity,再统一在最后回调 done。
用 TransitionGroup 管理列表级交互动画
单个元素过渡是点,列表过渡是面。当增删、排序、过滤一个列表时,<TransitionGroup> 是唯一正解:
- 必须为每个子项提供稳定唯一的
:key(不能用 index) - 默认渲染为
<span>,可用tag="ul"或tag="div"指定语义化容器 - 它额外提供
-move类,专门处理元素在列表中“移动”时的过渡(比如拖拽排序、搜索过滤后顺序重排) -
.list-move需配合transform: translateX/Y()实现平滑位移,Vue 会自动计算目标位置并插值
常见组合:新增项从右侧滑入(enter),删除项向上收缩消失(leave),其余项自动重排并带轻微位移(move),三者互不干扰、各自独立生效。
集成第三方动画库提升表现力
GSAP、Anime.js、Velocity 等库不是替代 Vue 过渡,而是增强它。核心思路是:Vue 负责“何时动”,动画库负责“怎么动”:
- 通过
ref获取真实 DOM 元素,在@enter或@leave钩子中调用库的 API - 利用 GSAP 的
stagger实现列表项依次入场;用timeline编排多阶段动画(比如先位移、再旋转、最后变色) - 务必在动画结束时调用
done(),否则 Vue 会认为动画卡住,可能提前移除 DOM - 避免在钩子中直接修改响应式数据——动画应纯粹作用于 DOM,状态变更由 Vue 自身驱动
一个小技巧:把常用动画封装成可复用的 hook(如 useSlideIn),传入 ref 和配置项,让业务组件保持干净。

















