使用 View Transitions API 打造无缝的页面过渡动画
1. 页面跳转的体验鸿沟
在 Web 开发中,我们长期面临一个体验上的两难选择:
- 多页应用 (MPA): 架构简单、稳定,但每次页面跳转都会有一次完整的加载,带来“白屏”或“闪烁”,体验不连贯。
- 单页应用 (SPA): 通过前端路由实现了流畅的“无刷新”体验,但开发者需要手动处理复杂的过渡动画、状态管理和代码分割,开发成本高昂。
有没有一种方法,既能保持 MPA 的简单性,又能获得 SPA 的流畅过渡体验?View Transitions API 正是为此而生。
2. View Transitions API 是什么?
View Transitions API 是一个浏览器原生 API,它提供了一种机制,让我们能够轻松地在两个不同的 DOM 状态之间创建动画过渡。
它的核心工作流程非常简单:
- 当你触发一个转换时,API 会对当前页面(旧状态)进行“截图”。
- 然后,你用 JavaScript 更新 DOM 到新状态。
- API 会对新页面(新状态)也进行“截图”。
- 最后,浏览器会在“旧截图”和“新截图”之间创建一个平滑的默认过渡动画(通常是淡入淡出)。
这一切都由浏览器在底层高效处理,我们只需要调用一个简单的函数。
3. 如何使用?
在单页应用中,使用 View Transitions 非常简单。只需将你的 DOM 更新逻辑包裹在 document.startViewTransition 函数中即可。
// 假设你有一个更新页面内容的函数
async function updatePageContent(url) {
const response = await fetch(url);
const newHtml = await response.text();
// 用新内容替换旧内容 (具体实现取决于你的架构)
document.body.innerHTML = newHtml;
}
// 在导航链接的点击事件中调用
document.querySelector('a').addEventListener('click', (event) => {
event.preventDefault();
const url = event.target.href;
// 检查浏览器是否支持
if (!document.startViewTransition) {
updatePageContent(url); // 不支持则直接更新
return;
}
// 使用 View Transition
document.startViewTransition(() => updatePageContent(url));
});仅仅这样,你的页面跳转就会带上一个默认的淡入淡出效果!
4. 自定义过渡动画
默认的淡入淡出效果很棒,但 API 的真正威力在于其可定制性。当 startViewTransition 运行时,浏览器会创建一个包含以下伪元素的 DOM 结构:
::view-transition: 根元素,包含了整个过渡。::view-transition-old(root): 旧视图的“截图”。::view-transition-new(root): 新视图的“截图”。
我们可以通过 CSS animation 来覆盖默认效果,例如实现一个滑入动画:
@keyframes slide-in {
from { transform: translateX(100%); }
}
::view-transition-new(root) {
animation: slide-in 0.5s ease-out;
}5. 元素间的“变形”:view-transition-name
API 最令人惊艳的功能是能够让两个页面中的 不同元素 被识别为 同一个对象,并在这两个元素之间创建平滑的“变形”动画。
这通过 view-transition-name 这个 CSS 属性实现。
页面 A (列表页):
<img src="thumbnail.jpg" style="view-transition-name: hero-image;" />页面 B (详情页):
<img src="full-size.jpg" style="view-transition-name: hero-image;" />当从页面 A 跳转到页面 B 时,浏览器看到两个元素的 view-transition-name 相同,它就会自动计算它们在位置、尺寸、形状上的差异,并生成一个平滑的过渡动画,而不是简单的淡入淡出。这对于图片、卡片等元素的过渡效果极佳。
结论
View Transitions API 为 Web 带来了期待已久的原生过渡能力。它极大地简化了过去需要复杂 JavaScript 动画库才能实现的交互效果,让打造电影般流畅的应用体验变得前所未有的简单。随着 Astro、Nuxt 等框架的集成,以及未来在多页应用中的普及,它必将成为现代 Web 开发者的标准技能之一。