使用 Next.js 的 View Transitions API 实现流畅的类应用级导航体验
在 Next.js 导航中使用视图过渡 API,即可实现元素动画效果,而无需依赖复杂的动画库。
View Transitions API 允许浏览器以更少的自定义动画代码在 DOM 状态之间实现平滑过渡。在 Next.js App Router 项目中,当需要保持元素连续性而非生硬切换时,它能与客户端导航自然结合使用。
它是什么
这是一种浏览器功能,能够捕获旧状态和新状态,并在两者之间进行插值过渡。用户可选择启用该功能,为共享元素命名,并根据需要通过 CSS 进行自定义。
function navigateWithTransition(callback: () => void) {
if (!document.startViewTransition) {
callback();
return;
}
document.startViewTransition(() => {
callback();
});
}
为何适合 Next.js
客户端路由过渡已经能够替代庞大的视图结构,而 View Transitions 为这种替换提供了用户能与原生应用相联系的视觉体验。
浏览器支持与填充方案
虽然支持度正在提升,但尚未实现全面覆盖。需决定是采用渐进增强方案还是填充方案;填充方案会增加加载量且视觉效果不够完美。
"use client";
import { useRouter } from "next/navigation";
export function TransitionLink() {
const router = useRouter();
function navigate() {
if (!document.startViewTransition) {
router.push("/dashboard");
return;
}
document.startViewTransition(() => {
router.push("/dashboard");
});
}
return (
<button onClick={navigate}>
Dashboard
</button>
);
}
集成方式
为导航操作启用过渡效果,用稳定的名称标记共享元素,并通过预留空间防止布局跳动。
.product-image {
view-transition-name: product-image;
}
自定义动画效果
CSS的view-transition伪选择器可让你调整动画持续时间和缓动效果。建议使用柔和的动画,过长的动画会让人感觉比实际更慢。
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 350ms;
}
::view-transition-old(root) {
animation: fade-out 350ms ease;
}
::view-transition-new(root) {
animation: fade-in 350ms ease;
}
故障、流式加载与性能
避免对延迟加载或尺寸变化较大的元素进行动画处理。要在网络速度较慢的环境下进行测试。优先使用适合合成引擎处理的属性。如果流式加载的快照对齐有问题,可延迟过渡效果或仅将其限制在静态边框上。
当导航连贯性至关重要且受众的浏览器支持时,可使用视图过渡效果。而当信息更新速度远快于动画所能带来的帮助时,则应跳过此功能。 保持测试环境正常运行,逐个阶段进行测试,切勿仅凭感觉就决定发布,因为下一次版本可能会以新名称重新出现同样的隐性故障。 保持测试环境正常运行,逐个阶段进行测试,切勿仅凭感觉就决定发布,因为下一次版本可能会以新名称重新出现同样的隐性故障。 保持测试环境正常运行,逐个阶段进行测试,切勿仅凭感觉就决定发布,因为下一次版本可能会以新名称重新出现同样的隐性故障。 保持测试环境正常运行,逐个阶段进行测试,切勿仅凭感觉就决定发布,因为下一次版本可能会以新名称重新出现同样的隐性故障。 保持测试环境正常运行,逐个阶段进行测试。
保持测试装置处于正常状态,分别检测每个阶段,切勿仅凭直觉就决定发布,因为下一次版本很可能以新名称重新出现同样的隐性故障模式。在下一个版本中,可以用新名称重新引入同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新出现同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新引入同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新出现同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新引入同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新出现同样的问题。以新名称呈现的静默故障模式。