vue 3 过渡必须用小写组件包裹,配对定义v-enter-from/v-enter-to和v-leave-from/v-leave-to类,仅过渡opacity、transform等可动画属性,并排查v-if切换过快、css类未生效及父容器overflow隐藏问题。

直接用 <transition></transition> 包裹元素,别写错标签名
Vue 3 的过渡不是靠指令(比如 v-transition)或手动加 class 实现的,而是靠内置组件 <transition></transition>。它本身不渲染 DOM,只负责在 v-if、v-show 或动态组件切换时,自动添加/移除一组 CSS 类名。
常见错误是写成 <transition></transition>(首字母大写)或 <transition-group></transition-group>(这是给列表用的),结果动画完全不触发。必须小写、无属性(除非你指定 name):
<transition><div v-if="show">内容</div> </transition>
v-enter-from 和 v-leave-to 是起点和终点,别反了
Vue 3 的类名命名规则和 Vue 2 不同,且顺序直接影响动画方向。关键点:
-
v-enter-from:元素还没显示时的状态(比如opacity: 0、transform: translateY(-20px)) -
v-enter-to:显示完成后的状态(比如opacity: 1、transform: translateY(0)) -
v-leave-from:开始隐藏时的状态(通常是v-enter-to的值) -
v-leave-to:隐藏结束时的状态(通常是v-enter-from的值)
如果把 v-enter-from 和 v-leave-to 写成一样的值,或者漏掉 -active 类,动画会“闪一下”就结束。必须配对写全:
.v-enter-active, .v-leave-active {
transition: opacity 0.3s ease, transform 0.3s ease;
}
.v-enter-from, .v-leave-to {
opacity: 0;
transform: translateY(10px);
}
.v-enter-to, .v-leave-from {
opacity: 1;
transform: translateY(0);
}
只过渡可动画属性,避免用 all
transition: all 0.3s 看起来省事,但实际会过渡所有变化的属性——包括 display、height(当内容高度不固定时)、甚至 z-index,导致意外跳变或卡顿。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
推荐明确列出你要过渡的属性:
- 常用安全项:
opacity、transform(位移/缩放/旋转)、color、background-color - 慎用:
width、height、margin、padding(可能触发重排) - 绝对不用:
display、visibility(它们本身不可过渡)
例如,滑入动画优先用 transform 而非 left:
.v-enter-from {
opacity: 0;
transform: translateX(-20px); /* ✅ GPU加速,性能好 */
}
/* 不要写成 */
.v-enter-from {
opacity: 0;
left: -20px; /* ❌ 触发重排,掉帧 */
}
动画卡顿或没效果?先检查这三件事
90% 的过渡失效问题都出在这几个地方:
-
v-if切换太快:如果show值在一次同步任务中反复赋值(比如连续两次show.value = true),Vue 可能跳过中间状态,导致过渡被忽略。确保状态变更之间有明确间隔或依赖响应式更新时机 - CSS 类名没生效:检查浏览器开发者工具里元素上是否真有
v-enter-from这类 class。如果没有,说明<transition></transition>没包对元素,或条件指令(如v-if)写在了<transition></transition>外部 - 父容器设置了
overflow: hidden:如果过渡涉及位移(比如transform: translateX),而父容器裁剪了溢出内容,动画会“被切掉”。临时加overflow: visible测试是否是这个问题
复杂交互动画(比如路由切换)建议配合 key 强制重建组件,否则 Vue 可能复用旧实例,绕过 enter/leave 生命周期。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










