页面切换动画组件如何实现平滑过渡?元素位置跳动问题怎么解决?
我在用Vue的Transition组件做路由切换动画时,新页面元素总会出现0.5秒的跳动。已经给容器加了固定宽高,但当使用transform: translateX()动画时,内容区域还是会有位置偏移。
尝试过在v-enter-active里加了will-change: transform,但问题依旧存在。发现当路由参数变化时,子组件重新渲染会导致布局计算失效。有没有什么方法能保持动画过程中DOM布局稳定?
<transition name="page-slide">
<router-view class="page-container"></router-view>
</transition>
对应的CSS动画这样写的,跳动主要出现在动画结束瞬间:
.page-slide-enter-active,
.page-slide-leave-active {
transition: all 0.3s;
position: absolute;
}
.page-slide-enter {
transform: translateX(100%);
}
.page-slide-leave-to {
transform: translateX(-100%);
}
position: fixed配合inset: 0固定住位置,再加个transform: translateZ(0)触发GPU加速,动画丝滑不抖动。我之前这样搞的:官方文档里其实提到了一个关键点:用
mode="out-in"属性来控制动画顺序。默认情况下Transition是in-out模式,会先执行进入动画再处理离开动画。但在路由切换这种场景下,我们希望先等旧内容离开,再让新内容进来,避免两个视图同时渲染造成布局抖动。你可以试试给Transition加上这个属性:
另外,CSS动画部分也建议调整下。
.page-slide-enter-active和.page-slide-leave-active里用all作为过渡属性容易导致其他样式也被过渡,建议改成具体指定transform和opacity:如果页面结构比较复杂,还可以考虑结合
v-slot配合keep-alive缓存组件状态,减少重复渲染带来的布局抖动。比如:这些调整应该能解决动画结束时的位置跳动问题了。我之前用这些方法在Vue 2和Vue 3里都验证过。