ViewTransition

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Experimental: これは実験的な機能です。
本番で使用する前にブラウザー互換性一覧表をチェックしてください。

ViewTransitionビュー遷移 API のインターフェースで、ビュー遷移を表し、トランジションが様々な状態(例えば、アニメーションを実行する準備ができている、またはアニメーションが終了した)に達したときに反応する機能、またはトランジションを完全にスキップする機能を提供します。

このオブジェクト型は document.startViewTransition() メソッドが返します。 startViewTransition() が呼び出されると、ビュー遷移のプロセスで説明されている一連のステップに従います。これは様々なプロミスが履行されるタイミングについても説明しています。

インスタンスプロパティ

ViewTransition.finished Experimental

Promise で、トランジションのアニメーションが完了し、新しいページビューがユーザーに表示され操作可能になると履行されます。

ViewTransition.ready Experimental

Promise で、擬似要素ツリーが作成され、トランジションのアニメーションが始まろうとすると履行されます。

ViewTransition.updateCallbackDone Experimental

Promise で、 document.startViewTransition() のコールバックが返すプロミスが履行されたときに履行されます。

インスタンスメソッド

skipTransition() Experimental

ビュー遷移のアニメーション部分をスキップします。ただし、 DOM を更新する document.startViewTransition() コールバックの実行はスキップしません。

次の例では、 ViewTransition.ready プロミスを使用して、クリック時のユーザーカーソルの位置から発生する独自の円形表示ビュー遷移を発生させ、 ウェブアニメーション API によってアニメーションが指定されています。

js
// 最後のクリックイベントを保存
let lastClick;
addEventListener("click", (event) => (lastClick = event));

function spaNavigate(data) {
  // この API に対応していないブラウザーのためのフォールバック
  if (!document.startViewTransition) {
    updateTheDOMSomehow(data);
    return;
  }

  // クリック位置を取得するか、画面の中央へフォールバックする
  const x = lastClick?.clientX ?? innerWidth / 2;
  const y = lastClick?.clientY ?? innerHeight / 2;
  // 最も遠いコーナーまでの距離を取得
  const endRadius = Math.hypot(
    Math.max(x, innerWidth - x),
    Math.max(y, innerHeight - y),
  );

  // トランジションを作成
  const transition = document.startViewTransition(() => {
    updateTheDOMSomehow(data);
  });

  // 擬似要素が作成されるのを待つ
  transition.ready.then(() => {
    // ルートの新しいビューをアニメーション
    document.documentElement.animate(
      {
        clipPath: [
          `circle(0 at ${x}px ${y}px)`,
          `circle(${endRadius}px at ${x}px ${y}px)`,
        ],
      },
      {
        duration: 500,
        easing: "ease-in",
        // アニメーションさせる擬似要素を指定
        pseudoElement: "::view-transition-new(root)",
      },
    );
  });
}

このアニメーションには以下の 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;
}

仕様書

Specification
CSS View Transitions Module Level 1
# viewtransition

ブラウザーの互換性

BCD tables only load in the browser

関連情報