vue实现动画原理
Vue 动画实现原理
Vue 的动画系统基于 CSS 过渡和动画,通过内置组件 <transition> 和 <transition-group> 实现。其核心原理分为以下几个部分:
触发条件与类名机制
当元素插入或移除 DOM 时,Vue 会自动检测目标元素是否应用了 CSS 过渡/动画。通过添加/删除预定义的 CSS 类名触发动画效果:
v-enter/v-leave: 进入/离开的初始状态v-enter-active/v-leave-active: 进入/离开的激活状态(定义过渡属性)v-enter-to/v-leave-to: 进入/离开的结束状态
例如:
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
JavaScript 钩子函数
支持通过 JavaScript 直接操作 DOM 实现更复杂的动画:
<transition
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter">
</transition>
钩子函数示例:
methods: {
enter(el, done) {
Velocity(el, { opacity: 1 }, { duration: 500, complete: done })
}
}
列表过渡
<transition-group> 通过 v-for 渲染列表时,会为每个元素添加唯一的 key 属性,在元素位置变化时执行平滑过渡。内部使用 FLIP(First-Last-Invert-Play)动画技术优化性能。
核心实现流程
- 状态检测:通过 Vue 的响应式系统监测数据变化
- DOM 操作:虚拟 DOM 比对后生成真实 DOM 操作指令
- 类名管理:根据操作类型(插入/删除)动态添加/移除 CSS 类名
- 钩子触发:在动画生命周期各阶段调用对应钩子函数
- 自动清理:动画完成后移除临时类名和事件监听
性能优化策略
- 使用
transform和opacity属性触发硬件加速 - 对持续时间长的动画应用
will-change属性 - 列表动画中使用
tag="div"减少 DOM 层级 - 复杂场景结合
requestAnimationFrame实现帧同步







