视图过渡
View Transitions
页面切换时,浏览器把新旧两屏接起来,补出中间那一下过渡。
- 又叫:
- 页面转场
- 跨页面过渡
- 共享元素过渡
- view transition
- view-transition
- page transition
- 展厅
- 动效与节奏
- 形态
- 整页对比
- 播放
- 手动触发
- 关键词
- 浏览器 API / 需要 JS / 合成层动画 / 动效较多 / 先查兼容
参数工作台
复制给 AI
随参数实时更新做一个视图过渡(view transition):点击列表卡片时用 document.startViewTransition 包住 DOM 更新,给被点的那张卡片加 view-transition-name,让它在详情页放大成头图,过渡 300ms、缓动 cubic-bezier(0.22, 1, 0.36, 1)。同一时刻 view-transition-name 只能有一个;不支持这个 API 的浏览器直接切换,不要留空白。
view transition, document.startViewTransition wrapping the DOM update, view-transition-name on the shared element so it morphs into the detail header, ::view-transition-old / ::view-transition-new pseudo elements, 300ms cubic-bezier(0.22, 1, 0.36, 1), instant fallback when unsupported
https://publieople.github.io/design-museum/entry/view-transitions/?stage=light
链接带着你调好的参数
什么时候用
- 列表点进详情:被点的那张卡片原地放大成详情页的头图
- 同一个应用里换标签页或换主题,希望两屏连起来而不是硬切
- 导航栏在多个页面里都一样,想让人看出它是同一个元素
适用场景:页面 / 卡片 / 导航
推荐取值
- 时长
- 200–400ms
- 缓动
- cubic-bezier(0.22, 1, 0.36, 1)
- 共享元素命名
- view-transition-name: card-3(同一时刻唯一)
- 降级
- 不支持时瞬间切换,不留空白
别搞混
和「CSS transition」的区别
CSS transition 只能让同一个元素自己变;视图过渡是浏览器给整屏拍新旧两张快照再做动画,所以能把旧界面里的某个元素平滑接到新界面的对应元素上。
和「入场动画」的区别
入场动画是新页面自己在播,旧界面已经消失;视图过渡的动画发生在两屏之间,旧屏要一起参与,所以改 DOM 的那一步必须放进 startViewTransition 的回调里。
容易踩的坑
- 同一时刻 view-transition-name 必须唯一:列表里给每张卡片都写死一个名字会直接报错,要在点击时只给被点的那张临时加上
- 改 DOM 的代码必须在 document.startViewTransition(() => …) 的回调里执行,写在回调外面拍到的还是旧界面
- 过渡期间会有一层伪元素盖在页面上,指针事件被短暂挡住,别在过渡里做点击判断
- 不支持这个 API 的浏览器要有兜底:直接切换即可,不要留一屏空白等过渡
- 跨文档(多页应用)要写 @view-transition { navigation: auto },而且必须同源
无障碍降级
prefers-reduced-motion 下不要调用 startViewTransition(或把 ::view-transition-group 的 animation-duration 设成 0),页面瞬间切换,功能完全一样。
关键词
- View Transition API
- document.startViewTransition
- view-transition-name
- ::view-transition-old
- ::view-transition-new
- shared element transition
- cross-document view transition