Vue transition 失效的根本原因是过渡系统未触发:transition 必须直接包裹 v-if/v-show 元素,且类名需匹配 scoped 样式(用 :deep 或全局样式),CSS 属性要可动画,动态组件 key 不能频繁变更。

transition在 Vue 组件切换时没效果,根本原因不是 CSS 写错了,而是 Vue 的过渡系统压根没触发——类名没加到元素上,动画阶段根本没开始。
transition 包裹的元素必须是直接子节点
Vue 的 只监听它**紧邻的子元素**的插入/移除。中间插一层 v-show 或 v-if 控制的父容器,就断链了。
- ❌ 错误写法:
——...的子节点是,它从不销毁,所以v-enter/v-leave类名永远不会加- ✅ 正确写法:把
v-if或动态直接放在里面,且只能有一个根节点- ⚠️ 注意:如果用了
v-show,它只是切display,DOM 一直存在,不会响应 —— 必须用v-ifscoped 样式里 .fade-enter-active 类不生效
Vue 的
添加的类名(如fade-enter-active)不会带data-v-xxx属性,而里的规则会被自动加上该属性,导致匹配失败。- ❌
→ 实际生成的是.fade-enter-active[data-v-abc123] {},但 DOM 上没有这个属性 - ✅ 改用深度选择器:
/deep/ .fade-enter-active(Vue 2)或:deep(.fade-enter-active)(Vue 3) - ? 更推荐:把过渡样式提出来放到全局
中,避开 scoped 限制
动态组件 + key 导致动画跳过
在
或场景下,如果key随路由或状态变化,Vue 会强制销毁旧组件、创建新组件,绕过leave钩子和过渡流程。- ❌
→ 每次路由变,key 变,组件被 unmount,v-leave来不及执行 - ✅ 去掉
:key,或固定 key(如:key="'main-view'"),让 Vue 复用组件实例 - ? 如果确实需要 key 控制重渲染,改用
包裹,再配合
CSS transition 属性没写对或值不可动画
即使类名加上了,CSS 本身也可能“静音”:
- ❌
height: auto、max-height: none、display: none → block这些都不可过渡 —— 浏览器无法计算中间帧 - ✅ 推荐可动画属性:
opacity、transform、max-height(设具体数值,如max-height: 500px) - ⚠️ 注意:
transition必须写在*-active类里,且要包含具体属性名,比如transition: opacity 0.3s,不能只写transition: all 0.3s(部分浏览器兼容性差)
真正卡住的地方往往不在动画逻辑本身,而在于 DOM 生命周期是否被意外截断 —— 比如多套
v-if嵌套、key滥用、scoped 样式失配,这些都会让彻底静默。检查时优先打开 DevTools 看元素上有没有v-enter类名出现,没有就说明 Vue 过渡系统根本没启动。 - ✅ 正确写法:把
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











