Vue3 TransitionGroup 组件:列表动画就这么简单

更新日期: 2026-04-28 阅读: 21 标签: 动画

做后台管理系统的时候,经常要给列表加动画。商品列表、消息通知、标签页、看板卡片,这些东西加个动画,用户体验会好很多。Vue3 把 TransitionGroup 做成内置组件,就是为了解决这个问题。


为什么 Vue3 要把它做成内置组件

Vue2 时代要做列表动画,得找第三方库或者自己写复杂的 CSS 和 JS。Vue3 直接把它收进核心,原因有三个。

第一,列表太常见了。一个后台管理系统里,跟列表有关的组件占了四成以上。内置了就不用装依赖,拿来就能用。

第二,性能有保障。Vue 团队针对列表动画做了深度优化,数据变动大了也不卡。比社区方案更轻量也更稳。

第三,跟 Transition 用同一套规则。你会用 Transition 就会用 TransitionGroup,类名都一样,不用重新学。


核心用法:三步上手

第一步:用 TransitionGroup 包住列表

用 TransitionGroup 替换掉普通的容器。用 tag 指定要渲染成什么 HTML 标签,用 name 指定动画类名的前缀。

<TransitionGroup name="list" tag="ul">
  <li v-for="item in items" :key="item.id">{{ item.name }}</li>
</TransitionGroup>

这里有个关键点:每个列表项必须绑唯一的 :key。Vue 要靠这个来识别每个元素,知道谁是谁,动画才能正常跑。

第二步:写好 CSS 动画

Vue 会自动加上这几个类名:

类名什么时候触发
.list-enter-from元素插入之前
.list-enter-active元素插入过程中
.list-enter-to元素插入完成
.list-leave-from元素离开之前
.list-leave-active元素离开过程中
.list-leave-to元素离开完成
.list-move元素位置变了

下面是一个完整的示例:

/* 进入动画 */
.list-enter-active {
  transition: all 0.4s ease;
}
.list-enter-from {
  opacity: 0;
  transform: translateX(-30px);
}

/* 离开动画 */
.list-leave-active {
  transition: all 0.4s ease;
  position: absolute;  /* 这个很关键,让离开的元素不占位置 */
}
.list-leave-to {
  opacity: 0;
  transform: translateX(30px);
}

/* 位置变化动画,这是 TransitionGroup 的核心 */
.list-move {
  transition: transform 0.4s ease;
}

离开动画里 position: absolute 这行很重要。如果不加,离开的元素还占着位置,其他元素移动的时候就会卡顿。

第三步:直接操作数组数据

加数据:

items.value.push({ id: Date.now(), name: "新项目" });

删数据:

items.value.splice(index, 1);

排序,会触发 move 动画:

items.value.sort((a, b) => a.priority - b.priority);


跟 Transition 有什么不一样

特性TransitionTransitionGroup
用途单个元素或组件一整个列表
渲染不渲染额外 DOM默认渲染成 span,可以用 tag 改
模式支持 in-out 和 out-in不支持
特殊类没有支持 move-class

tag 属性的用法

默认情况下 TransitionGroup 会渲染成一个 <span>。你可以用 tag 改成别的标签。

<!-- 渲染成 ul -->
<TransitionGroup tag="ul" name="list">
  <li v-for="item in items" :key="item.id">{{ item.text }}</li>
</TransitionGroup>

<!-- 渲染成 div -->
<TransitionGroup tag="div" name="grid" class="grid-container">
  <div v-for="card in cards" :key="card.id">{{ card.title }}</div>
</TransitionGroup>


move-class 是什么

当列表顺序变了的时候,元素需要平滑地移到新位置。Vue 会自动计算位置差异,你只需要定义好过渡效果就行。

/* 用默认命名 */
.list-move {
  transition: transform 0.5s ease;
}

如果想自定义类名,可以用 move-class:

<TransitionGroup name="list" move-class="custom-move">


离开动画一定要设 position: absolute

为了让其他元素能平滑地移到离开元素的位置,离开的元素必须脱离文档流。

.list-leave-active {
  position: absolute;
  width: 100%;  /* 保持宽度,避免布局抖动 */
}


列表重新排序要注意 key

Vue 默认策略是就地更新。如果顺序变了,Vue 不会移动 DOM 元素,而是直接更新每个元素的内容。为了让 Vue 能认出每个元素,必须用唯一的 :key。

<!-- 正确:用唯一 id -->
<TransitionGroup name="list">
  <li v-for="item in items" :key="item.id">{{ item.name }}</li>
</TransitionGroup>

<!-- 错误:用索引当 key -->
<TransitionGroup name="list">
  <li v-for="(item, index) in items" :key="index">{{ item.name }}</li>
</TransitionGroup>

用索引当 key 的话,Vue 分不清哪个是哪个,动画就会乱。


实际场景能做什么

一个演示项目里能看到这些场景:列表增删动画、排序动画、网格布局动画、标签页切换、消息通知队列、拖拽排序效果。

地址:https://gitee.com/benxiaohai1071/bxh-admin-vue3/tree/master/src/views/study/builtIncomponent/transitionGroup


总结

TransitionGroup 做三件事:用 tag 指定容器标签,用 name 指定动画前缀,用唯一的 key 标识每个元素。CSS 里记住进入动画、离开动画要加 absolute、以及 move 动画这三个核心部分就可以了。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13727

相关推荐

css transition 实现滑入滑出

transition是css最简单的动画。 通常当一个div属性变化时,我们会立即看的变化,从旧样式到新样式是一瞬间的,嗖嗖嗖!!!但是,如果我希望是慢慢的从一种状态,转变成另外一种状态,怎么办? transition可以做到。

css3贝塞尔曲线(cubic-bezier)

css3 animation模块,其中animation-timing-function 和 transition-timing-function两个属性来控制动画速度分别提供了ease,liner,ease-in,ease-out

CSS动画@keyframes的用法

CSS动画允许大多数HTML元素的动画,而无需使用JavaScript或Flash!IE10+支持该属性的。其他低浏览器版本数字后跟-ms-, -webkit-,-moz-或-o-指定使用前缀的第一个版本。

css @keyframes属性 语法

@keyframes是CSS的一种规则,可以用来定义CSS动画的一个周期的行为,创建简单的动画。作用:通过 @keyframes 规则,您能够创建动画。

css3实现椭圆轨迹旋转

X轴Y轴在一个矩形内移动;设置动画延时设置Y轴延时为动画时长的一半, 运动轨迹变成菱形;设置三次贝塞尔曲线,为了看起来有立体感添加scale属性,scale动画应该是X轴和Y轴的时间总和

css环形滚动_内容加载的环形滚动动画效果

创建一个没有背景的圆,然后声明透明度为0.1的黑色边框(看起来是灰色),修改左侧边框颜色。此时会有一个静态的看起来只有左边框有颜色的空心圆。然后声明一个该元素逆时针旋转360度的动画,并让该动画无限播放(infinite)即可

Vue.js动画笔记_vue实现动画效果

Vue.js中的元素动画或页面跳转动画有多种实现方式比如:1、自己手动写CSS3动画来实现2、使用第三方CSS动画库如:Animate.css3、在构子函数中操作DOM4、使用第三方Js动画库如:Velocity.js。

动画函数的绘制及自定义动画函数

制作动画效果离不开动画运动函数,而我们用得最多的无疑就是Tween.js。根据不同的数学公式原理,Tween.js划分出了不同的动画类型,每种动画类型里面都包含以下的缓动类型:ease in 先慢后快、ease out 先块后慢、ease in out 先慢后快再慢

只用 CSS 就能做到的像素画/像素动画

这篇文章将会介绍只用 CSS 就能制作像素画·像素动画的方法。虽说纯 CSS 就能做到,但是为了更高的可维护性,也会顺便介绍使用 Sass 的制作方法。

Transform(CSS动态属性的开始)

transform 属性向元素应用 2D 或 3D 转换;该属性允许我们对元素进行旋转、缩放、移动或倾斜。这两点是Transform的概念和应用场景,重点在于2D和3D的转换,那么呢?

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!