Back

浏览器中 View Transitions API 的简单介绍

浏览器中 View Transitions API 的简单介绍

View Transitions API 解决了 Web 开发中的一个基本问题:在不同视图之间创建流畅、类似原生应用的过渡效果,而无需复杂的 JavaScript 动画或重型库。如果您曾经希望您的 Web 应用在页面导航或内容更新时能像移动应用一样流畅,那么这个 API 正是您所需要的。

本文介绍了什么是 View Transitions API,为什么它是现代 Web 应用的游戏规则改变者,以及如何实现同文档过渡(用于 SPA)和跨文档过渡(用于 MPA)。您将学习基本的代码模式,了解当前的浏览器支持情况,并发现如何渐进式地实现这些过渡效果。

关键要点

  • View Transitions API 能够以最少的代码在 DOM 状态之间实现流畅的动画
  • 同文档过渡使用 document.startViewTransition() 适用于 SPA
  • 跨文档过渡使用 @view-transition { navigation: auto; } 适用于 MPA
  • 始终通过功能检测实现渐进式增强
  • 浏览器支持正在增长,但 Firefox 支持仍在等待中
  • 尊重用户偏好并在真实设备上测试性能

什么是 View Transitions API?

View Transitions API 是一个浏览器功能,能够在不同的 DOM 状态之间实现流畅的动画过渡。这个 API 不需要突兀的页面变化或复杂的动画库,而是通过简单的 CSS 和最少的 JavaScript 来处理捕获视觉状态和在它们之间进行动画的繁重工作。

可以将其想象为浏览器在变化前后对您的页面进行快照,然后在它们之间平滑地变形。该 API 的工作原理是:

  1. 捕获当前的视觉状态
  2. 在渲染被抑制的情况下更新 DOM
  3. 捕获新的视觉状态
  4. 在两个状态之间创建平滑的过渡

这种方法消除了传统 Web 过渡的挑战:管理 z-index、防止布局跳跃、处理中断的动画,以及在状态变化期间保持可访问性。

为什么 View Transitions 对现代 Web 应用很重要

传统的 Web 导航与原生移动应用相比感觉很突兀。用户期望平滑的过渡效果,这些过渡提供视觉连续性,帮助他们理解内容的来源或去向。View Transitions API 以最少的代码将这些类似原生的体验带到了 Web 上。

主要优势包括:

  • 降低复杂性:无需动画库或复杂的状态管理
  • 更好的性能:浏览器优化的过渡在合成器线程上运行
  • 改善用户体验:视觉连续性帮助用户保持上下文
  • 内置可访问性:自动尊重用户偏好,如减少动画

同文档视图过渡(SPA)

同文档过渡在单个页面内工作,使其非常适合单页应用程序。以下是基本实现:

function navigateToNewView() {
  // 检查是否支持该 API
  if (!document.startViewTransition) {
    // 回退:不使用过渡更新 DOM
    updateDOMContent()
    return
  }

  // 创建平滑过渡
  document.startViewTransition(() => {
    updateDOMContent()
  })
}

document.startViewTransition() 方法接受一个更新 DOM 的回调函数。浏览器处理其他所有事情:捕获状态、创建动画和后续清理。

使用 CSS 自定义过渡

您可以使用 view-transition-name 属性自定义元素的过渡方式:

.product-image {
  view-transition-name: product-hero;
}

/* 自定义过渡动画 */
::view-transition-old(product-hero) {
  animation: fade-out 0.3s ease-out;
}

::view-transition-new(product-hero) {
  animation: fade-in 0.3s ease-in;
}

当相同的 view-transition-name 出现在新旧状态中时,这会创建平滑的变形效果,非常适合主图或持久导航元素。

跨文档视图过渡(MPA)

跨文档过渡为传统的多页应用程序带来平滑的导航。不需要调用 JavaScript,您可以通过 CSS 启用它们:

@view-transition {
  navigation: auto;
}

将此规则添加到源页面和目标页面,浏览器会在导航期间自动创建过渡。无需 JavaScript。

增强跨文档过渡

您仍然可以使用 view-transition-name 创建更复杂的效果:

/* 在两个页面上 */
.site-header {
  view-transition-name: main-header;
}

.hero-image {
  view-transition-name: hero;
}

具有匹配名称的元素将在页面之间平滑变形,而其他所有内容都会获得默认的交叉淡入淡出效果。

浏览器支持和渐进式增强

截至 2025 年 8 月,不同过渡类型的浏览器支持情况有所不同:

同文档过渡:

  • ✅ Chrome 111+、Edge 111+、Safari 18+、Opera、Samsung Internet 22+
  • ❌ Firefox(不支持)

跨文档过渡:

  • ✅ Chrome 126+、Edge 126+、Safari 18.2+
  • ❌ Firefox(不支持)

渐进式增强策略

在使用视图过渡之前,始终检查 API 支持:

// 对于同文档过渡
if (document.startViewTransition) {
  // 使用视图过渡
  document.startViewTransition(() => updateContent())
} else {
  // 直接 DOM 更新
  updateContent()
}

对于跨文档过渡,使用 CSS 功能查询:

@supports (view-transition-name: none) {
  @view-transition {
    navigation: auto;
  }
  
  .hero {
    view-transition-name: hero;
  }
}

这确保您的 CSS 在不支持的浏览器中不会出错,同时在可用的地方提供增强的体验。

尊重用户偏好

始终遵守减少动画偏好:

@media (prefers-reduced-motion: no-preference) {
  @view-transition {
    navigation: auto;
  }
}

/* 替代方案:减少过渡持续时间 */
@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*) {
    animation-duration: 0.01s !important;
  }
}

实现最佳实践

  1. 从简单开始:在添加复杂动画之前,先从基本的交叉淡入淡出过渡开始
  2. 策略性命名:使用描述内容的语义化 view-transition-name
  3. 测试回退:确保您的应用在没有过渡的情况下也能正常工作
  4. 监控性能:复杂的过渡可能会影响较慢的设备
  5. 考虑可访问性:不仅仅是减少动画,还包括焦点管理和屏幕阅读器通知

要避免的常见陷阱

  • 重复名称:每个 view-transition-name 在页面内必须是唯一的
  • 过度使用:不是每个交互都需要过渡
  • 缺少回退:始终提供非过渡路径
  • 忽略性能:在真实设备上测试,而不仅仅是高端开发机器

结论

View Transitions API 代表了 Web 用户体验的重大飞跃。通过在浏览器级别处理状态过渡的复杂性,它使开发人员能够以最少的代码创建流畅、类似应用的体验。无论您是在构建单页应用程序还是增强传统的多页站点,这个 API 都提供了使导航感觉平滑和有意图的工具。

关键是从简单开始:实现基本过渡,彻底测试,并根据浏览器功能和用户偏好逐步增强。随着浏览器支持的扩展,View Transitions API 将成为每个 Web 开发人员工具包中的必备工具。

准备在您的项目中实现视图过渡了吗?从为您的导航添加简单的交叉淡入淡出开始,然后逐步使用命名元素进行更复杂的效果增强。检查您的分析以了解用户的浏览器支持情况,并记住在真实设备上测试。Web 导航的未来是平滑、上下文相关和可访问的——它从一行代码开始。

常见问题

什么都不会出错。DOM 更新会立即发生,没有任何过渡效果。这就是为什么功能检测很重要——它确保优雅降级。

是的,视图过渡适用于任何框架。对于同文档过渡,将您的状态更新包装在 document.startViewTransition() 中。许多框架正在添加内置支持。

视图过渡由浏览器优化,通常比 JavaScript 动画性能更好。但是,复杂的过渡或许多过渡元素可能会影响低端设备的性能。

是的,视图过渡在底层使用标准的 CSS 动画。您可以使用熟悉的 CSS 动画属性自定义时间、缓动和效果。

浏览器供应商正在重新考虑这个要求。目前,它帮助浏览器优化渲染,但未来版本可能会移除这个要求。

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers