View Transitions API核心原理
CSS View Transitions API是浏览器原生提供的页面过渡动画方案,开发者无需手动计算元素位置和尺寸,浏览器自动捕获新旧页面状态并生成过渡动画。该API在文档层面工作,通过startViewTransition()方法触发,浏览器在调用瞬间截取当前DOM快照(旧状态),执行回调更新DOM后再次截取快照(新状态),然后对两个快照执行可配置的过渡动画。
View Transitions API最大的优势在于自动处理元素形态差异——位置、尺寸、圆角、透明度等属性变化均由浏览器补间动画完成,开发者只需标记哪些元素参与过渡,无需手动编写动画关键帧。
同文档内视图过渡的基本用法
同文档SPA导航的过渡实现非常简洁:
document.startViewTransition(async () => { // 更新DOM到新状态 await updateContent(newPage);});
浏览器自动执行以下流程:截图当前状态 -> 执行回调更新DOM -> 截图新状态 -> 执行过渡动画。默认过渡效果是300ms的淡入淡出。
自定义过渡样式通过::view-transition-old和::view-transition-new伪元素控制:
::view-transition-old(root) { animation: 300ms ease-out fade-out;}::view-transition-new(root) { animation: 300ms ease-in fade-in;}@keyframes fade-out { to { opacity: 0; }}@keyframes fade-in { from { opacity: 0; }}
元素级共享过渡动画配置
共享过渡(Shared Element Transition)是View Transitions API最强大的特性,允许指定新旧页面中的对应元素执行变形动画而非简单的淡入淡出。通过view-transition-name属性为元素分配唯一标识:
.hero-image { view-transition-name: hero;}::view-transition-old(hero) { animation: 400ms ease-in-out both clip-old;}::view-transition-new(hero) { animation: 400ms ease-in-out both clip-new;}
浏览器自动匹配新旧状态中view-transition-name相同的元素,生成从旧位置/尺寸到新位置/尺寸的补间动画。这在列表页到详情页的图片过渡、卡片展开动画等场景中效果极佳。
动态分配transition-name需要用JavaScript设置:
function switchPage(itemId) { const item = document.querySelector( `[data-id="${itemId}"]` ); item.style.viewTransitionName = 'active-item'; document.startViewTransition(() => { item.style.viewTransitionName = ''; updateContent(itemId); });}
跨文档视图过渡(MPA场景)
跨文档视图过渡适用于多页面应用(MPA),浏览器在页面导航时自动捕获旧页面快照并在新页面中执行过渡。启用方式通过HTTP响应头或meta标签:
<meta http-equiv="Cross-Origin-Opener-Policy" content="same-origin"><meta name="view-transition" content="same-origin">
跨文档过渡的CSS同样使用::view-transition伪元素控制。浏览器在导航时自动执行截图和过渡,无需JavaScript参与。
降级方案与浏览器兼容性处理
View Transitions API目前Chrome 111+和Edge 111+已支持,Firefox和Safari尚未完全实现。生产环境必须做好降级:
function navigateWithTransition(updateCallback) { if (!document.startViewTransition) { // 浏览器不支持,直接更新DOM updateCallback(); return; } document.startViewTransition(updateCallback);}
在CSS中也应使用@supports做样式降级:
/* 不支持View Transitions时使用普通过渡 */.page-enter { opacity: 0; transition: opacity 300ms ease;}@supports (view-transition-name: none) { .page-enter { opacity: 1; transition: none; }}
性能注意事项:参与过渡的DOM元素越少越好,大型列表或复杂布局的全局过渡可能导致帧率下降。view-transition-name应只分配给需要动画的关键元素,而非所有元素。过渡动画时长建议200ms~500ms,过短看不清效果,过长影响操作响应。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/cssviewtransitionsapi-kua-ye-mian-guo-du-dong-hua-shi-xian/