用途:这是一个针对 View Transitions API 的审查(review/PR 把关)技能,不负责实现动画,而是识别过渡中的隐蔽缺陷。因为视图过渡只是包裹在 DOM 变更外的视觉增强,DOM 更新总会发生,过渡失效通常不报错,只表现为没有动画或画面冻结。
主要能力与检查点:
- 重复的 view-transition-name 会导致整段过渡静默中止,需用唯一 id/key 后缀,或使用 view-transition-name: match-element。
- 快照基于绘制而非实时 DOM,若新视图仍是 Suspense fallback、未流式传输的服务端组件或未解码的图片,会捕获错误状态;应把共享元素提升到 Suspense 边界之上,并在 startViewTransition 前等待图片 decode()/数据就绪。React 的 <ViewTransition> 会等待样式表并最多约 500ms 等待字体,但不等待任意数据。
- prefers-reduced-motion 不会自动生效,需显式媒体查询关闭伪元素动画,例如 @media (prefers-reduced-motion: reduce) { ::view-transition-group(), ::view-transition-old(), ::view-transition-new(*) { animation: none !important; } };缺失属于无障碍缺陷。
- React 中状态更新必须在 Transition 内,flushSync 会退出过渡;原生 API 则相反,需在 startViewTransition 回调里用 flushSync 包裹 setState,两种模式不可混用。
- 同一时间只运行一个过渡,新过渡会打断并跳过当前;skipTransition() 和打断只取消动画,DOM 变更仍会执行。
- 未清理的 view-transition-name 会导致幽灵动画,快照后应移除名称(包括 bfcache 场景)。
- 固定定位元素与顶层内容可能被绘制到遮罩之下,需要单独的 view-transition-name 加高 z-index,或使用元素作用域过渡。
- iframe 与跨源内容无法参与,过渡仅限同源;跨文档过渡需主框架、同源并匹配 @view-transition。
用法:可用 rg 搜索 startViewTransition、view-transition-name、ViewTransition、startTransition、flushSync、prefers-reduced-motion、@view-transition 等关键词定位代码,再在 Chromium DevTools Animations 面板查看 ::view-transition 伪元素树,并记录 transition.ready.catch(...) 捕获重复名称的拒绝,切换系统 reduced-motion 后复测。
限制与边界:仅适用于存在真实用户可见过渡且出现静默中止、冻结、忽略 reduced-motion、幽灵形变或遮挡的情况;不支持浏览器中不动画属于优雅降级而非缺陷。单一且从未重复的静态名称无问题。实现层面的工作应交给专门的框架技能。相邻技能:overlay-focus-scroll-contracts(顶层/焦点/堆叠问题)、ssr-hydration-mismatch(服务端与客户端渲染不一致)、a11y-contract-testing(把 reduced-motion 固化为测试契约)。