vue动画实现原理
Vue动画实现原理
Vue的动画系统基于CSS过渡和动画,通过内置组件<transition>和<transition-group>实现。其核心原理分为以下几个部分:
自动应用CSS类名
当元素插入或移除时,Vue会自动添加/删除特定的CSS类名。这些类名以v-为前缀(可自定义),分为六个阶段:
v-enter:进入动画的初始状态v-enter-active:进入动画的激活状态v-enter-to:进入动画的结束状态v-leave:离开动画的初始状态v-leave-active:离开动画的激活状态v-leave-to:离开动画的结束状态
.v-enter {
opacity: 0;
}
.v-enter-active {
transition: opacity 1s;
}
.v-enter-to {
opacity: 1;
}
JavaScript钩子函数
除了CSS过渡,Vue提供JavaScript钩子实现更复杂的动画控制:
<transition
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter"
@enter-cancelled="enterCancelled"
@before-leave="beforeLeave"
@leave="leave"
@after-leave="afterLeave"
@leave-cancelled="leaveCancelled"
>
</transition>
列表过渡
<transition-group>通过FLIP技术(First, Last, Invert, Play)实现高效的位置变换动画。该技术会:
- 记录元素初始位置(First)
- 记录元素最终位置(Last)
- 计算位置差异并应用反向变换(Invert)
- 播放过渡动画回到最终位置(Play)
底层实现
Vue动画系统的核心实现位于src/platforms/web/runtime/transition目录:
- 自动嗅探目标元素是否应用了CSS过渡/动画
- 在适当时机添加/删除CSS类名
- 监听过渡结束事件(考虑浏览器兼容性)
- 如果没有检测到CSS过渡/动画,立即执行DOM操作
性能优化
Vue动画系统通过以下方式优化性能:
- 使用
requestAnimationFrame实现平滑动画 - 自动识别需要硬件加速的属性(如transform、opacity)
- 对
<transition-group>使用CSS的transform属性实现位置动画
自定义过渡类名
可以通过name属性自定义过渡类名前缀:

<transition name="fade">
<!-- 元素内容 -->
</transition>
对应的CSS类名将变为fade-enter、fade-enter-active等。






