view transitions api 仅在单页内同步更新已挂载 dom 时生效,需正确调用 document.startviewtransition 包裹同步 dom 操作,确保 view-transition-name 成对精确匹配且元素可见。

View Transitions API 不是“给页面跳转加个动画开关”,它只在单页内同步更新已挂载 DOM 时生效;用错调用时机、写错 view-transition-name 或绕过用户手势,动画就直接不触发。
document.startViewTransition 必须包裹同步 DOM 更新
这个函数不是异步钩子,也不接受 Promise。它要求回调里立刻完成所有 DOM 变更,浏览器才能拍到“旧快照”和“新快照”。一旦里面塞了 await、setTimeout 或先改数据再改视图,快照就断层了。
- ✅ 正确:先拿到完整 HTML 字符串或 DOM 片段,再进回调里调用
replaceChildren()或赋值innerHTML - ❌ 错误:
startViewTransition(() => { fetch().then(html => el.innerHTML = html) })——fetch是异步的,回调早已执行完毕 - ⚠️ 注意:目标容器(如
<main></main>)必须已存在于document中,不能是刚createElement出来还没append的临时节点
view-transition-name 必须成对、稳定、大小写敏感
过渡是否启动,90% 取决于这个属性能否精确匹配。它不是 class,不是 id,是独立 CSS 属性,靠字符串完全一致来关联新旧元素。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- ✅ 正确:
<h1 style="view-transition-name: title">旧标题</h1>→ 新 DOM 同位置也带style="view-transition-name: title" - ❌ 错误:
view-transition-name: item-${id}但前后id不一致;或一个写"title",另一个写"Title"(大小写不同) - ⚠️ 同一页面内不能有两个元素共用同一个
view-transition-name值,否则匹配混乱,动画错位
::view-transition-old 和 ::view-transition-new 的样式陷阱
这两个伪元素由浏览器自动生成,但它们依赖旧元素在快照捕获前仍处于可绘制状态。很多看似无害的样式会直接让旧视图“消失”,导致过渡只剩新元素淡入。
- ❌ 危险操作:快照前就设了
opacity: 0、visibility: hidden、display: none—— 旧元素无法参与过渡 - ✅ 安全做法:过渡开始前确保元素可见,哪怕
opacity: 0.999或用透明遮罩占位;必要时加will-change: transform辅助合成层创建 - ⚠️ 默认动画是淡入淡出,自定义时注意统一时长:
::view-transition-old(root), ::view-transition-new(root) { animation-duration: 0.4s; }
最常被忽略的是:过渡不是发生在“导航后”,而是发生在“你主动调用 startViewTransition 并同步更新 DOM 的那一瞬间”——旧元素是否还在文档流里、是否还具备视觉输出能力,决定了整个动画是否存在。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










