一、View Transitions API 概述

View Transitions API 是由 Web 社区组(WICG)提出的一项新的 Web API,旨在为单页应用(SPAs)和多页应用(MPAs)提供简单而强大的页面切换动画支持。该 API 的灵感来源于 Material Design 原则中的过渡效果,借鉴了 Android 活动中共享元素动画的理念,通过在两个文档(视图)之间创建动画过渡,实现类似 PPT 幻灯片切换的流畅视觉效果。



二、View Transitions API 的核心原理

View Transitions API 的核心在于通过快照机制实现动画过渡。当开发者调用 document.startViewTransition() 方法时,浏览器会执行以下步骤:

  1. 捕获初始状态:浏览器对当前页面进行快照,记录所有 DOM 元素的状态(包括位置、大小、样式等)。
  2. 执行 DOM 变更:在回调函数中,开发者可以自由修改 DOM,例如添加、删除元素或更改样式。
  3. 捕获最终状态:浏览器再次对页面进行快照,记录变更后的 DOM 状态。
  4. 生成过渡动画:浏览器基于两个快照生成一个伪元素树,包含 ::view-transition-old 和 ::view-transition-new 两个伪元素,分别代表旧视图和新视图。通过 CSS 动画属性,开发者可以自定义过渡效果,例如淡入淡出、缩放、位移等。

伪元素树的结构如下:

css
::view-transition {
└─ ::view-transition-group(root) {
└─ ::view-transition-image-pair(root) {
├─ ::view-transition-old(root)
└─ ::view-transition-new(root)
}
}
}

三、View Transitions API 的关键特性

  1. 渐进增强:该 API 是渐进式增强的特性,在不支持的浏览器中会回退到无动画的页面切换,确保兼容性。
  2. 跨文档支持:除了单页应用内的过渡,API 还支持跨文档的视图过渡,例如多页应用中的页面跳转。
  3. CSS 自定义:通过 ::view-transition-old 和 ::view-transition-new 伪元素,开发者可以完全控制动画的样式和时长。
  4. 共享元素动画:通过 view-transition-name 属性,开发者可以为特定元素指定名称,使浏览器在过渡时识别并匹配这些元素,实现共享元素动画。

四、View Transitions API 的应用场景

  1. 单页应用路由切换:在单页应用中,当用户切换路由时,可以使用 View Transitions API 实现平滑的页面过渡效果。
  2. 多页应用页面跳转:在多页应用中,当用户从一个页面跳转到另一个页面时,可以使用该 API 实现跨文档的视图过渡。
  3. 列表项动画:在列表中添加、删除或重新排序项时,可以使用 View Transitions API 实现项的平滑过渡。
  4. 主题切换:在切换应用主题时,可以使用该 API 实现背景色、字体等属性的渐变动画。

五、View Transitions API 的使用方法

以下是一个简单的案例,展示如何在单页应用中使用 View Transitions API 实现页面切换动画。

HTML 结构
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>View Transitions API Demo</title>
<style>
body {
margin: 0;
font-family: Arial, sans-serif;
}
.page {
display: none;
width: 100%;
height: 100vh;
justify-content: center;
align-items: center;
font-size: 2rem;
}
.page.active {
display: flex;
}
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 0.5s;
animation-timing-function: ease-in-out;
}
::view-transition-old(root) {
animation-name: fadeOut;
}
::view-transition-new(root) {
animation-name: fadeIn;
}
@keyframes fadeOut {
from { opacity: 1; }
to { opacity: 0; }
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
</style>
</head>
<body>
<div id="page1" class="page active">Page 1</div>
<div id="page2" class="page">Page 2</div>
<button id="navigateBtn">Navigate</button>
<script>
const page1 = document.getElementById('page1');
const page2 = document.getElementById('page2');
const navigateBtn = document.getElementById('navigateBtn');
let isPage1Active = true;
navigateBtn.addEventListener('click', () => {
if (document.startViewTransition) {
document.startViewTransition(() => {
if (isPage1Active) {
page1.classList.remove('active');
page2.classList.add('active');
} else {
page2.classList.remove('active');
page1.classList.add('active');
}
isPage1Active = !isPage1Active;
});
} else {
// Fallback for unsupported browsers
if (isPage1Active) {
page1.classList.remove('active');
page2.classList.add('active');
} else {
page2.classList.remove('active');
page1.classList.add('active');
}
isPage1Active = !isPage1Active;
}
});
</script>
</body>
</html>
代码解析
  1. HTML 结构:页面包含两个 div 元素,分别代表两个页面,初始时只显示第一个页面。
  2. CSS 样式
    • .page 类用于控制页面的显示和隐藏。
    • .active 类用于标记当前显示的页面。
    • ::view-transition-old(root) 和 ::view-transition-new(root) 伪元素用于定义过渡动画的样式。
  3. JavaScript 逻辑
    • 当用户点击导航按钮时,调用 document.startViewTransition() 方法。
    • 在回调函数中,切换两个页面的 active 类,实现页面内容的更新。
    • 如果浏览器不支持 View Transitions API,则回退到无动画的页面切换。

六、View Transitions API 的高级用法

1. 共享元素动画

通过 view-transition-name 属性,可以为特定元素指定名称,使浏览器在过渡时识别并匹配这些元素。例如:

html
<div id="list">
<div class="item" style="--i: a1">Item 1</div>
<div class="item" style="--i: a2">Item 2</div>
</div>
<style>
.item {
view-transition-name: var(--i);
}
::view-transition-old(a1),
::view-transition-new(a1) {
animation: move 0.5s;
}
@keyframes move {
from { transform: translateX(0); }
to { transform: translateX(100px); }
}
</style>

在这个例子中,每个列表项都有一个唯一的 view-transition-name,当列表项被删除或重新排序时,浏览器会根据名称匹配新旧元素,实现平滑的过渡动画。

2. 自定义动画时长和类型

通过修改 ::view-transition-old(root) 和 ::view-transition-new(root) 伪元素的 animation-duration 和 animation-name 属性,可以自定义动画的时长和类型。例如:

css
::view-transition-old(root) {
animation-name: slideOut;
animation-duration: 1s;
}
::view-transition-new(root) {
animation-name: slideIn;
animation-duration: 1s;
}
@keyframes slideOut {
from { transform: translateX(0); }
to { transform: translateX(-100%); }
}
@keyframes slideIn {
from { transform: translateX(100%); }
to { transform: translateX(0); }
}
3. 结合 JavaScript 动态控制动画

通过 ViewTransition 对象,可以获取过渡的开始和结束状态,从而动态控制动画。例如:

javascript
const transition = document.startViewTransition(() => {
// DOM 变更逻辑
});
transition.ready.then(() => {
console.log('Transition started');
});
transition.finished.then(() => {
console.log('Transition finished');
});

七、View Transitions API 的兼容性与未来展望

目前,View Transitions API 仍处于实验阶段,但已被最新版的 Chromium 内核浏览器(如 Chrome 115+)支持。Firefox 和 Safari 尚未全面支持该 API,但 Safari 18.0 已增加了对 View Transitions API 的支持。

随着浏览器的不断更新,View Transitions API 有望成为 Web 开发中的标准工具,为开发者提供更简单、更强大的页面切换动画支持。未来,我们可能会看到更多基于该 API 的插件、组件和解决方案,进一步丰富 Web 应用的用户体验。

八、总结

View Transitions API 为 Web 开发者提供了一种全新的方式来实现页面切换动画。通过简单的几行代码,开发者就可以实现类似 PPT 幻灯片切换的流畅视觉效果,提升用户体验。该 API 的核心在于快照机制和伪元素树,通过捕获页面的初始状态和最终状态,生成平滑的过渡动画。

无论是单页应用还是多页应用,无论是列表项动画还是主题切换,View Transitions API 都能提供强大的支持。随着浏览器的不断更新,该 API 的兼容性和功能将不断完善,成为 Web 开发中不可或缺的一部分。

 

扫描下方二维码,一个老毕登免费为你解答更多软件开发疑问!

物业管理工单AI调度方案:维修响应缩短至30分钟的核心算法

物业报修总是慢半拍?业主群里天天吐槽维修不及时?物业管理人员为工单分配焦头烂额?别慌!今天给大家揭秘一套超实用的物业工单 AI 调度方案,手把手教你用核心算法把维修响应时间从几小时压缩到 30 分钟内,让业主满意度直线飙升!​据中国物业管理协会发布的《2023 年物业管理行业发展报告》显示,在业主对物业的投诉中,维修响应不及时占比高达 38%。而当维修响应时间控制在 30 分钟以内时,业主对物业的

电商网站加速方案:WooCommerce加载从5s到0.9s的实操

你的 WooCommerce 电商网站是不是也总被用户吐槽 “加载慢如龟”?明明商品超有吸引力,却因为 5 秒的加载时间,白白流失了大量潜在客户!别慌!今天手把手教你把网站加载速度从 5 秒直接干到 0.9 秒,让你的店铺直接起飞!​根据 Akamai 的研究报告显示,网页加载时间每延迟 1 秒,就会导致用户转化率下降 7%,销售额降低 11% ,用户跳出率增加 16%。想象一下,每天几百上千的访

APP开发后如何做A/B测试? (转化率提升指南!界面/文案/按钮优化案例)

辛辛苦苦开发的 APP,转化率却总是上不去?根据麦肯锡发布的《2024 年移动应用用户行为报告》显示,经过科学 A/B 测试优化的 APP,平均转化率能提升 35%!想要让界面、文案、按钮成为转化 “利器”,A/B 测试绝对是必备技能。今天就通过真实案例,手把手教你用 A/B 测试提升 APP 转化率!一、为啥 A/B 测试是转化率的 “加速器”?用数据说话先看两组真实数据:某电商 APP 对商品

APP开发后如何做热更新? (动态修复BUG!不重新上架的更新方案)

APP 刚上线就发现严重 BUG,难道只能等重新上架 “干着急”?据 App Annie 发布的《2024 年移动应用质量报告》显示,因等待重新上架修复问题,平均每个 APP 会流失 12% 的用户。而热更新技术能让你绕过应用商店审核,动态修复 BUG!今天就手把手教你 APP 热更新的实现方案,让你的应用随时 “满血复活”。一、为啥热更新成了开发者的 “救命稻草”?先看一组真实数据:某热门游戏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部