Nuxt 3页面过渡时进入动画和离开动画同时触发怎么办?
在Nuxt 3项目里给布局加了页面过渡,但切换路由时进出动画会同时闪一下。用了mode="out-in"也没用,代码是这样的:
<template>
<transition
mode="out-in"
enter-active-class="duration-100 ease-out"
leave-active-class="duration-100 ease-in"
>
<component :is="$route.component" />
</transition>
</template>
手机端测试时感觉更明显,离开动画还没结束新页面就突然出现。是不是要手动控制过渡的显示时机?或者需要在路由守卫里做什么处理?
没有正确作用在路由视图上,而且你用的是这种手动渲染方式,Vue 的 transition 是检测不到路由切换的“新旧组件”关系的。推荐的做法是使用 Nuxt 提供的内置组件
,它已经集成了对 Transition 的支持,并且能正确处理 out-in 模式。把你的代码改成这样:
确保你在
app.vue或布局文件中使用的是而不是手动操作$route。NuxtPage 是专门为页面过渡设计的,内部会管理好组件的插入时机,避免进出动画重叠。另外,duration 设置为 100ms 可能太短了,视觉上容易闪,建议至少 200-300ms,比如加上
enter-from-class和leave-to-class配合 Tailwind 的 opacity 类做渐变效果更顺滑:这样就能保证离开动画完全结束后才开始进入动画,不会闪屏。手机端性能差一点,反而更能暴露这类问题,用标准方案就没啥大坑。
直接套在上,而 Nuxt 3 的布局和页面组件结构会干扰动画的执行顺序,特别是在手机上性能较低时更明显。正确的做法是把
放在布局组件外面,或者用自带的过渡功能,这样能确保页面组件的切换时机和动画同步。下面是修改后的代码示例:
或者直接使用
:这样可以确保页面组件的切换逻辑在 Vue Router 控制之下,动画顺序不会错乱。另外,手机端性能较弱时,建议把动画时长控制在 150ms 以内,避免用户感知到卡顿或闪屏。