ViewTransition

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

ViewTransition 接口是 View Transition API 的一部分,它表示一个活动的视图过渡,并提供了响应过渡到达不同状态(例如,准备运行动画,或动画已完成)或完全跳过过渡的功能。

此对象类型可通过以下方式获得:

当通过 startViewTransition() 调用(或 MPA 过渡中的页面导航)触发视图过渡时,将遵循一系列步骤,具体说明请参见 视图过渡过程。这也会解释不同 Promise 何时 fulfilled。

实例属性

ViewTransition.finished 只读

一个 Promise,当过渡动画完成,并且新页面视图对用户可见且可交互时,该 Promise fulfilled。

ViewTransition.ready 只读

一个 Promise,当伪元素树创建完成并且过渡动画即将开始时,该 Promise fulfilled。

ViewTransition.updateCallbackDone 只读

一个 Promise,当 document.startViewTransition() 方法的回调函数返回的 Promise fulfilled 时,该 Promise fulfilled。

实例方法

skipTransition()

跳过视图过渡的动画部分,但不会跳过运行 document.startViewTransition() 回调函数来更新 DOM。

示例

在下面的 SPA 示例中,ViewTransition.ready Promise 用于触发自定义的圆形揭露视图过渡,该过渡从用户点击位置散开,动画由 Web Animations API 提供。

js
// Store the last click event
let lastClick;
addEventListener("click", (event) => (lastClick = event));

function spaNavigate(data) {
  // Fallback for browsers that don't support this API:
  if (!document.startViewTransition) {
    updateTheDOMSomehow(data);
    return;
  }

  // Get the click position, or fallback to the middle of the screen
  const x = lastClick?.clientX ?? innerWidth / 2;
  const y = lastClick?.clientY ?? innerHeight / 2;
  // Get the distance to the furthest corner
  const endRadius = Math.hypot(
    Math.max(x, innerWidth - x),
    Math.max(y, innerHeight - y),
  );

  // Create a transition:
  const transition = document.startViewTransition(() => {
    updateTheDOMSomehow(data);
  });

  // Wait for the pseudo-elements to be created:
  transition.ready.then(() => {
    // Animate the root's new view
    document.documentElement.animate(
      {
        clipPath: [
          `circle(0 at ${x}px ${y}px)`,
          `circle(${endRadius}px at ${x}px ${y}px)`,
        ],
      },
      {
        duration: 500,
        easing: "ease-in",
        // Specify which pseudo-element to animate
        pseudoElement: "::view-transition-new(root)",
      },
    );
  });
}

此动画还需要以下 CSS,以关闭默认 CSS 动画并阻止旧视图和新视图状态以任何方式混合(新状态“擦拭”旧状态,而不是过渡进入)

css
::view-transition-image-pair(root) {
  isolation: auto;
}

::view-transition-old(root),
::view-transition-new(root) {
  animation: none;
  mix-blend-mode: normal;
  display: block;
}

规范

规范
CSS 视图过渡模块第 1 级
# viewtransition

浏览器兼容性

另见