首页 / 文章 / 使用 Next.js 的 View Transitions API 实现流畅的类应用级导航体验

使用 Next.js 的 View Transitions API 实现流畅的类应用级导航体验

在 Next.js 导航中使用视图过渡 API,即可实现元素动画效果,而无需依赖复杂的动画库。

805 词

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;
}

故障、流式加载与性能

避免对延迟加载或尺寸变化较大的元素进行动画处理。要在网络速度较慢的环境下进行测试。优先使用适合合成引擎处理的属性。如果流式加载的快照对齐有问题,可延迟过渡效果或仅将其限制在静态边框上。

当导航连贯性至关重要且受众的浏览器支持时,可使用视图过渡效果。而当信息更新速度远快于动画所能带来的帮助时,则应跳过此功能。 保持测试环境正常运行,逐个阶段进行测试,切勿仅凭感觉就决定发布,因为下一次版本可能会以新名称重新出现同样的隐性故障。 保持测试环境正常运行,逐个阶段进行测试,切勿仅凭感觉就决定发布,因为下一次版本可能会以新名称重新出现同样的隐性故障。 保持测试环境正常运行,逐个阶段进行测试,切勿仅凭感觉就决定发布,因为下一次版本可能会以新名称重新出现同样的隐性故障。 保持测试环境正常运行,逐个阶段进行测试,切勿仅凭感觉就决定发布,因为下一次版本可能会以新名称重新出现同样的隐性故障。 保持测试环境正常运行,逐个阶段进行测试。

保持测试装置处于正常状态,分别检测每个阶段,切勿仅凭直觉就决定发布,因为下一次版本很可能以新名称重新出现同样的隐性故障模式。在下一个版本中,可以用新名称重新引入同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新出现同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新引入同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新出现同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新引入同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,绝不能仅凭感觉就决定发布,因为下一个版本完全有可能用新名称重新出现同样的问题。以新名称呈现的静默故障模式。