CSSビュー遷移モジュール レベル1

W3C 候補勧告ドラフト,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2024/CRD-css-view-transitions-1-20240328/
最新公開バージョン:
https://www.w3.org/TR/css-view-transitions-1/
編集者ドラフト:
https://drafts.csswg.org/css-view-transitions-1/
履歴:
https://www.w3.org/standards/history/css-view-transitions-1/
実装レポート:
https://wpt.fyi/results/css/css-view-transitions
フィードバック:
CSSWG イシューレポジトリ
編集者:
Tab Atkins-Bittner (Google)
Jake Archibald (Google)
Khushal Sagar (Google)
この仕様への編集提案:
GitHub エディター

概要

このモジュールは、View Transition APIと、それに関連するプロパティや疑似要素を定義します。これにより、開発者はドキュメントの状態変化を表現するアニメーション付きのビジュアル遷移を作成できます。

CSSは、構造化文書(HTMLやXMLなど)の画面表示、印刷などのレンダリングを記述する言語です。

この文書のステータス

このセクションは、公開時点での本書のステータスについて説明します。 現在のW3C出版物の一覧や本技術レポートの最新改訂版は、W3C技術レポートインデックス https://www.w3.org/TR/で確認できます。

この文書はCSS作業部会によって、候補勧告ドラフトとして勧告トラックに従い公開されました。 候補勧告として公開されたことは、W3Cおよびそのメンバーによる承認を意味するものではありません。 候補勧告ドラフトは、前回の候補勧告から作業部会が次回の候補勧告スナップショットに含める予定の変更を統合したものです。

この文書はドラフトであり、随時更新、置換、または他の文書によって廃止される可能性があります。 この文書を進行中の作業以外として引用することは適切ではありません。

フィードバックは、GitHubのissueに投稿(推奨)、タイトルに仕様コード「css-view-transitions」を含めてください(例: “[css-view-transitions] …コメントの概要…”)。 すべてのissueおよびコメントはアーカイブされています。 または、アーカイブ済みの公開メーリングリストwww-style@w3.orgに送信することもできます。

この文書は、2023年11月3日 W3Cプロセス文書によって管理されています。

この文書は、W3C特許ポリシーの下で運営されるグループによって作成されました。 W3Cは、グループの成果物に関連して行われた特許開示の公開リストを管理しています。 そのページには特許開示の手順も記載されています。 個人が特許の存在を認識し、その特許が必須クレームを含むと考える場合、W3C特許ポリシー第6節に従って情報を開示しなければなりません。

1. はじめに

このセクションは規範的ではありません。

この仕様は、DOM APIおよび関連するCSS機能を導入し、 開発者がアニメーション付きのビジュアル遷移 (ビュー遷移) を異なるドキュメントの状態間で作成できるようにします。

1.1. ビジュアル遷移とDOM更新の分離

従来、2つのドキュメント状態間でビジュアル遷移を作成するには、 両方の状態が同時にDOM内に存在する期間が必要でした。 実際には、両方の状態を表現できる特定のDOM構造を作成することが多く、 例えば、ある要素がコンテナ間を「移動」する場合、 遷移期間中はその要素がどちらのコンテナにも属さない状態にする必要があり、 どちらのコンテナや祖先要素によるクリッピングを避けるためです。

このような中間状態は、純粋にビジュアル効果のためにDOM構造を損なうため、 UXやアクセシビリティの問題を引き起こすことがよくありました。

ビュー遷移は、この中間状態を回避し、 DOMを即座に状態切り替えした後、別レイヤーでカスタマイズ可能なビジュアル遷移を行います。 旧状態の静的キャプチャと新状態のライブキャプチャを用いて、 これらのキャプチャは疑似要素のツリー(§ 3.2 ビュー遷移疑似要素で詳細)として表現され、 旧ビジュアル状態と新状態が共存することで、 サイズや位置のアニメーション中にクロスフェードなどの効果を実現できます。

1.2. ビュー遷移のカスタマイズ

デフォルトでは、 document.startViewTransition() は、2つのDOM状態間でページ全体のクロスフェードを行う ビュー遷移 を作成します。 開発者は、view-transition-name CSSプロパティを使い、 どの要素を個別にキャプチャするか選択でき、 ページ全体とは独立してアニメーションさせることができます。 遷移状態(旧・新のビジュアルキャプチャが共存する状態)は疑似要素で表現されるため、 開発者はCSSアニメーションWebアニメーションなどの使い慣れた機能で それぞれの遷移をカスタマイズできます。

1.3. ビュー遷移のライフサイクル

正常なビュー遷移は、次の段階を経て進行します:

  1. 開発者が document.startViewTransition(updateCallback) を呼び出すと、 ViewTransition 型のviewTransitionが返されます。

  2. 現在の状態が「旧」状態としてキャプチャされる。

  3. レンダリングが一時停止される。

  4. 開発者のupdateCallback 関数(指定されていれば)が呼び出され、 ドキュメントの状態が更新される。

  5. viewTransition.updateCallbackDone が完了する。

  6. 現在の状態が「新」状態としてキャプチャされる。

  7. 遷移疑似要素が生成される。 この構造の概要は§ 3.2 ビュー遷移疑似要素を参照。

  8. レンダリングが再開され、遷移疑似要素が表示される。

  9. viewTransition.ready が完了する。

  10. 疑似要素がアニメーションし、終了まで続く。

  11. 遷移疑似要素が削除される。

  12. viewTransition.finished が完了する。

1.4. 拡張機能としての遷移

View Transition API設計の重要な点は、 アニメーション付きの遷移が基盤となるドキュメント状態変化への視覚的拡張であることです。 つまり、設定ミスやデバイス制約などによりビジュアル遷移の生成に失敗しても、 UpdateCallback の呼び出しは妨げられません。 遷移アニメーションが事前にできないと分かっていても、状態変更のためのコールバックは必ず呼ばれます。

例えば、開発者がビュー遷移のライフサイクルの開始時に skipTransition() を呼び出すと、 アニメーション遷移に関する手順(ビュー遷移ツリーの生成など)は実行されません。 しかし、UpdateCallback は必ず呼ばれます。 スキップされるのはビジュアル遷移のみで、基盤となる状態変更は必ず行われます。

注: DOMの変更自体もスキップしたい場合は、 それには別の機能が必要です。 navigateEvent.signal はそのために利用できる機能例です。

View Transition APIは、UpdateCallback によりDOM変更を非同期化できますが、 API自体はDOM変更のキューイングやスケジューリングの責任は持ちません(遷移自体に必要なスケジューリング以外は)。 非同期DOM変更が同時並行で発生する場合(例:独立したコンポーネント内)もあれば、 キューイングや以前の変更の中止が必要な場合もあります。 これらはアプリケーション全体をより包括的に見渡せるフレームワークや機能に委ねるのが最適です。

1.5. レンダリングモデル

ビュー遷移は、UAが生成する疑似要素を使って、要素のレンダリング状態を複製することで動作します。 要素自身やその子孫に適用されるレンダリングの側面、例えば filteropacity のような視覚効果、 あるいは overflowclip-path によるクリッピングなどは、 画像のキャプチャで画像を生成する際に適用されます。

ただし、mix-blend-mode のような、 要素が埋め込まれたときの描画方法を定義するプロパティは画像には適用できません。 このようなプロパティは、要素に対応する ::view-transition-group() 疑似要素に適用されます。 これは要素と同等のボックスを生成するためのものです。

::view-transition-group() が "新しい"状態に対応する要素を持つ場合、 ブラウザは ::view-transition-group() にコピーされたプロパティを DOMの "新しい"状態の要素と同期します。 ::view-transition-group() が "古い"状態と"新しい"状態の両方に対応する場合、 かつコピーされるプロパティが補間可能なものであれば、 ブラウザはそのプロパティを滑らかにアニメーションするためのデフォルトのアニメーションも設定します。

1.6.

すでに次のようなパターンでコンテンツを更新しているページの場合:
function spaNavigate(data) {
  updateTheDOMSomehow(data);
}

ビュー遷移は次のように追加できます:

function spaNavigate(data) {
  // このAPIをサポートしないブラウザ用のフォールバック:
  if (!document.startViewTransition) {
    updateTheDOMSomehow(data);
    return;
  }

  // 遷移ありの場合:
  document.startViewTransition(() => updateTheDOMSomehow(data));
}

これにより、デフォルトの素早いクロスフェード遷移が実現されます:

クロスフェードは 疑似要素のツリー上でCSSアニメーションによって実現されているため、 CSSでカスタマイズ可能です。例:

::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 5s;
}

これにより、よりゆっくりとした遷移になります:

前の例を基に、動きを追加できます:
@keyframes fade-in {
  from { opacity: 0; }
}

@keyframes fade-out {
  to { opacity: 0; }
}

@keyframes slide-from-right {
  from { transform: translateX(30px); }
}

@keyframes slide-to-left {
  to { transform: translateX(-30px); }
}

::view-transition-old(root) {
  animation: 90ms cubic-bezier(0.4, 0, 1, 1) both fade-out,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-to-left;
}

::view-transition-new(root) {
  animation: 210ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-from-right;
}

結果は以下の通りです:

前の例を基に、 ヘッダーとヘッダー内のテキストに、それぞれ専用の ::view-transition-group() を設定して遷移できます:
.main-header {
  view-transition-name: main-header;
}

.main-header-text {
  view-transition-name: main-header-text;
  /* テキストが同じであると仮定して一貫したサイズを指定 */
  width: fit-content;
}

デフォルトでは、これらのグループは「古い」状態から「新しい」状態へサイズと位置を遷移し、 視覚状態はクロスフェードします:

前の例を基に、ページにサイドバーがあるとします:

この場合、サイドバーが「古い」状態と「新しい」状態の両方に存在する場合は静的にして、 そうでなければアニメーションで出現・消失させた方がよいでしょう。

:only-child 疑似クラスを使うことで、 これらの状態に特化したアニメーションを作成できます:

.sidebar {
  view-transition-name: sidebar;
}

@keyframes slide-to-right {
  to { transform: translateX(30px); }
}

/* 登場遷移 */
::view-transition-new(sidebar):only-child {
  animation: 300ms cubic-bezier(0, 0, 0.2, 1) both fade-in,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-from-right;
}

/* 退場遷移 */
::view-transition-old(sidebar):only-child {
  animation: 150ms cubic-bezier(0.4, 0, 1, 1) both fade-out,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-to-right;
}

サイドバーが「古い」状態と「新しい」状態の両方に存在する場合は、デフォルトのアニメーションが適切です。

今回は前の例を基にせず、 ユーザーのカーソル位置から円形リビールを作りたい場合を考えます。 これはCSSだけでは実現できません。

まずCSSで、「古い」状態と「新しい」状態が重なり合ってもデフォルトのブレンドを無効化し、 デフォルトのクロスフェードアニメーションも防ぎます:

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

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

次にJavaScript:

// 最後のクリックイベントを保存
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(() => {
    // rootの新ビューをアニメーション
    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)',
      }
    );
  });
}

結果は以下の通りです:

2. CSSプロパティ

2.1. 個別に遷移するサブツリーのタグ付け: view-transition-name プロパティ

名前: view-transition-name
値: none | <custom-ident>
初期値: none
適用対象: すべての要素
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散

注: view-transition-name離散的にアニメーション可能ですが、 これをアニメーションしても 実行中のビュー遷移には影響しません。むしろ、値を時間やタイムラインに応じて変化させるための手段です。例えば、view-transition-nameスクロール駆動アニメーションに基づき変更する例があります。

view-transition-name プロパティは要素を ビュー遷移でキャプチャするために「タグ付け」し、 指定された ビュー遷移名 の下で ビュー遷移ツリー内で個別に追跡します。 このようにキャプチャされた要素は、他のページ部分とは独立してアニメーションします。

none

要素は ビュー遷移に個別参加しません。

<custom-ident>

要素は 指定された ビュー遷移名で 古い/新しい 要素として個別にビュー遷移に参加します。

ここでは none および auto の値は <custom-ident> から除外されます。

注: この名前が一意でない場合 (つまり複数要素が同時に同じ ビュー遷移名を指定した場合)、 ビュー遷移は中断されます。

注: このAPIの観点では、 旧状態で ビュー遷移名 foo を持つ要素と 新状態で ビュー遷移名 foo を持つ要素は、 同じ要素の異なる視覚状態を表すものと見なされ、 ビュー遷移ツリーでペアとなります。 実際は同じオブジェクトを指していなくても、同一概念のページ要素の視覚状態だとみなすモデルが有用です。

要素の principal box分断スキップ、 または 非レンダリング の場合、 このプロパティは効果を持ちません。 詳細は § 7 アルゴリズム を参照してください。

2.1.1. レンダリングの統合

要素ビュー遷移でキャプチャされている、 または view-transition-name算出値none でない場合(任意のタイミング):

3. 疑似要素

3.1. 疑似要素ツリー

注: これは疑似要素ツリーの一般的な定義です。 他の機能でこの動作が必要な場合は、これらの定義は[css-pseudo-4]に移動されます。

疑似要素ルートツリー従属疑似要素の一種で、 ツリーのルートとして ツリー内で ツリー従属疑似要素となります。 これを 疑似要素ツリーと呼びます。

疑似要素ツリーは その子孫 ツリー従属疑似要素の文書順を定義します。

疑似要素疑似要素ツリーに参加する場合、 その発生元疑似要素になります。

子孫 pseudo疑似要素ルートの下にあり、 他に兄弟がいない場合、 :only-childがそのpseudoにマッチします。

注: つまり ::view-transition-new(ident):only-childは 親 ::view-transition-image-pair(ident)が1つだけの場合のみ ::view-transition-new(ident)を選択します。 つまり、兄弟 ::view-transition-old(ident)が存在しない場合です。

3.2. ビュー遷移疑似要素

ビュー遷移の可視化は、疑似要素ツリーとして表現され、これは下記で定義されるビュー遷移ツリーおよびビュー遷移疑似要素で構成されます。 このツリーは遷移疑似要素のセットアップ手順で構築され、 ::view-transition疑似要素の下にルート化され、発生元ルート要素です。 すべてのビュー遷移疑似要素は、 究極の発生元要素、つまりドキュメント要素から選択されます。

ビュー遷移ツリーはアクセシビリティツリーには公開されません。

例として、 ::view-transition-group() 疑似要素は、ルート要素セレクターに直接付与されます。 例えば :root::view-transition-group() のようになります。 これは親である::view-transition疑似要素には付与されません。
ユーザーエージェントがドキュメントの「旧」状態と「新」状態をキャプチャした後、次のような疑似要素構造を生成します:
::view-transition
├─ ::view-transition-group(name)
│  └─ ::view-transition-image-pair(name)
│     ├─ ::view-transition-old(name)
│     └─ ::view-transition-new(name)
└─ …その他のグループ…

view-transition-name を持つ各要素は個別にキャプチャされ、 各一意な view-transition-name ごとに ::view-transition-group() が生成されます。

便宜上、ドキュメント要素には view-transition-name "root" がユーザーエージェントスタイルシートで設定されています。

「旧」状態や「新」状態のどちらかが存在しない場合は、::view-transition-old() または ::view-transition-new() が欠落します。

生成された各疑似要素はCSSでターゲット指定して外観や挙動、アニメーションをカスタマイズできます。 これにより遷移を完全にカスタマイズ可能です。

3.2.1. 名前付きビュー遷移疑似要素

複数のビュー遷移疑似要素名前付きビュー遷移疑似要素であり、 これらは関数型ツリー従属ビュー遷移疑似要素で、ビュー遷移名と関連付けられます。 これら疑似要素は <pt-name-selector> を引数に取り、構文は以下のパターンに従います:

::view-transition-pseudo(<pt-name-selector>)

ここで <pt-name-selector>ビュー遷移名を選択し、構文定義は以下の通りです:

<pt-name-selector> = '*' | <custom-ident>

名前付きビュー遷移疑似要素セレクターは、 対応する疑似要素<pt-name-selector> が その疑似要素ビュー遷移名に一致する場合のみマッチします。 つまり、* または一致する <custom-ident> の場合です。

注: ビュー遷移名は、 ビュー遷移疑似要素の生成を引き起こした view-transition-name に設定されます。

名前付きビュー遷移疑似要素セレクター<custom-ident> 引数を持つものの詳細度(specificity)は 型セレクターと同等です。 名前付きビュー遷移疑似要素セレクター* 引数の場合、詳細度はゼロです。

3.2.2. ビュー遷移ツリーのルート: ::view-transition 疑似要素

::view-transition 疑似要素ツリー従属疑似要素であり、かつ疑似要素ルートでもあります。 発生元要素はドキュメントのドキュメント要素であり、 包含ブロックは包含ブロックとしてスナップショット包含ブロックになります。

注: この要素はすべての::view-transition-group()疑似要素の親となります。

3.2.3. ビュー遷移名付きサブツリーのルート: ::view-transition-group() 疑似要素

::view-transition-group() 疑似要素名前付きビュー遷移疑似要素であり、 一致するビュー遷移名に対応するビュー遷移キャプチャを表します。 ::view-transition-group() 疑似要素は、各ビュー遷移名ごとに 子要素として::view-transition 疑似要素の下に生成され、 対応する::view-transition-image-pair()を含みます。

この要素は初期状態で「旧」要素のサイズ・位置を反映し、 「旧」要素がなければ「新」要素を反映します。

「旧」と「新」の両方の状態がある場合、 動的ビュー遷移スタイルシートのスタイルで、 この疑似要素のwidth および heightが旧要素のborder boxから新要素の border box へアニメーションします。

また、要素のtransform は 旧要素のスクリーンスペース変換から新要素のスクリーンスペース変換へアニメーションします。

このスタイルは、アニメーションプロパティの値が遷移開始時に決まるため、動的に生成されます。

3.2.4. ビュー遷移画像ペアの分離: ::view-transition-image-pair() 疑似要素

::view-transition-image-pair() 疑似要素名前付きビュー遷移疑似要素であり、 対応する旧/新のビュー遷移キャプチャのペアを表します。 この疑似要素は対応する子要素として::view-transition-group()疑似要素の下に生成され、 対応する::view-transition-old()疑似要素 および/または ::view-transition-new()疑似要素 (この順)を含みます。

この要素は、子要素にisolation: isolateを提供するために存在し、 常に各子要素として::view-transition-group()の下に現れます。 この分離により、画像ペアが通常以外のブレンドモードで他のビジュアル出力に影響せずに合成可能になります。

3.2.5. ビュー遷移旧状態画像: ::view-transition-old() 疑似要素

::view-transition-old() 疑似要素は、 「旧」状態のビジュアルスナップショットを 置換要素として表現する 空の名前付きビュー遷移疑似要素です。 表現すべき「旧」状態がない場合は省略されます。 各 ::view-transition-old() 疑似要素は、 対応する ::view-transition-image-pair() 疑似要素の 子要素です。

:only-child は、この要素が ::view-transition-image-pair() 内で唯一の場合にマッチさせることができます。

この要素の見た目は、他の置換要素同様に object-* プロパティで操作できます。

注: 画像の内容および本来の寸法画像のキャプチャで取得され、 遷移疑似要素のセットアップで設定されます。

注: これら疑似要素をアニメーションするために追加される 動的ビュー遷移スタイルシート上の追加スタイルについては、 遷移疑似要素のセットアップおよび 疑似要素スタイルの更新で詳述されています。

3.2.6. ビュー遷移新状態画像: ::view-transition-new() 疑似要素

::view-transition-new() 疑似要素::view-transition-old() 疑似要素と同様)は、 「新」状態のビジュアルスナップショットを 置換要素として表現する 空の名前付きビュー遷移疑似要素です。 表現すべき「新」状態がない場合は省略されます。 各 ::view-transition-new() 疑似要素は、 対応する ::view-transition-image-pair() 疑似要素の 子要素です。

注: 画像の内容および本来の寸法画像のキャプチャで取得され、 遷移疑似要素のセットアップおよび 疑似要素スタイルの更新で 設定・更新されます。

4. ビュー遷移レイアウト

ビュー遷移疑似要素は、通常の要素と同様にスタイル・レイアウト・レンダリングされますが、 スナップショット包含ブロック内で発生し、 初期包含ブロックではなく、 ドキュメントの他の部分の上に ビュー遷移レイヤーで描画されます。

4.1. スナップショット包含ブロック

スナップショット包含ブロックは、 ウィンドウ内でページ内容が表示されうるすべての領域をカバーする矩形です (したがって、ルートのスクロールバーや インタラクティブウィジェットに関係なく一貫性があります)。 これにより、ドキュメント要素旧画像新要素に対して一貫性が保たれます。

iframeの場合、スナップショット包含ブロック初期包含ブロックに対応します。

スマートフォン画面の図。上部ステータスバー、ブラウザーURLバー、浮遊スクロールバー付きWebコンテンツ領域、仮想キーボード、OSの戻るボタン付き下部バーが含まれる 前図。スナップショット包含ブロックにあたる領域が強調。上部ステータスバーと下部OSバーを除く全領域
モバイルOS上の スナップショット包含ブロックの例。 スナップショットにはURLバーが含まれます(スクロールで消えるため)。 キーボードは表示・非表示が切り替わるため含まれます。 上下バーはOSの一部であり、ブラウザーの一部ではないためスナップショット包含ブロックには含まれません。
デスクトップブラウザーウィンドウの図。タブバー、URLバー、水平・垂直スクロールバー付きWebコンテンツ領域 前図。スナップショット包含ブロックにあたる領域が強調。Webコンテンツ領域とスクロールバーを含む
デスクトップOS上の スナップショット包含ブロックの例。 スクロールバーは含まれますが、URLバーはWebコンテンツが表示されないため含まれません。

スナップショット包含ブロック原点は、 スナップショット包含ブロックの左上隅を指します。

スナップショット包含ブロックサイズは、 スナップショット包含ブロックの幅・高さを 2つの数値のタプルとして表します。

スナップショット包含ブロック絶対位置付け包含ブロックおよび 固定位置付け包含ブロックとみなされ、 ::view-transitionおよびその子孫に適用されます。

4.2. ビュー遷移の描画順序

この仕様では、新しいスタッキングレイヤー ビュー遷移レイヤー を、 CSS2§E スタッキングコンテキストの詳細な説明 で定義された描画順序の末尾に追加します。 [CSS2]

::view-transition 疑似要素は、新しいスタッキングコンテキスト ビュー遷移レイヤー を生成し、 ドキュメントのすべての他のコンテンツ(トップレイヤーでレンダリングされる内容も含む)より後に 描画されます。また、これらのコンテンツに適用されるフィルターやエフェクトの後に描画されます。 (ただし、ビュー遷移レイヤー自体はフィルターやエフェクトの対象にはなりません。 ただし、::view-transition-old() および ::view-transition-new() 疑似要素のレンダリング内容に影響する場合は除きます。)

注: この機能の目的は、ページの内容(トップレイヤー要素も含む)をキャプチャできるようにすることです。 そのため、ビュー遷移レイヤーはキャプチャされたスタッキングコンテキストの一部にはできません。 そうすると循環依存が生じるためです。 よって、ビュー遷移レイヤーは他のすべてのコンテンツの兄弟要素として扱われます。

Documentアクティブなビュー遷移phase が "animating" の場合、 Document 内で ビュー遷移でキャプチャされた要素およびその 要素内容によって生成されるボックスは、 遷移ルート疑似要素包括的子孫を除き、 描画されません(visibility: hidden のように)、 またヒットテストにも応答しません(pointer-events: none のように)。

注: 遷移に参加する要素は、DOM上の位置での描画をスキップする必要があります。 なぜなら画像が対応する ::view-transition-new() 疑似要素で描画されるためです。 同様に、ヒットテストもスキップされます。DOM上の位置が実際の描画位置と一致しないためです。 ただし、これらの要素のアクセシビリティツリーや支援技術によるアクセス方法には変更はありません。

5. ユーザーエージェントスタイルシート

グローバルビュー遷移ユーザーエージェントスタイルシートは、 以下のルールを含むユーザーエージェント起源のスタイルシートです:

:root {
  view-transition-name: root;
}

:root::view-transition {
  position: fixed;
  inset: 0;
}

:root::view-transition-group(*) {
  position: absolute;
  top: 0;
  left: 0;

  animation-duration: 0.25s;
  animation-fill-mode: both;
}

:root::view-transition-image-pair(*) {
  position: absolute;
  inset: 0;

  animation-duration: inherit;
  animation-fill-mode: inherit;
  animation-delay: inherit;
}

:root::view-transition-old(*),
:root::view-transition-new(*) {
  position: absolute;
  inset-block-start: 0;
  inline-size: 100%;
  block-size: auto;

  animation-duration: inherit;
  animation-fill-mode: inherit;
  animation-delay: inherit;
}

/* デフォルトのクロスフェード遷移 */
@keyframes -ua-view-transition-fade-out {
  to { opacity: 0; }
}
@keyframes -ua-view-transition-fade-in {
  from { opacity: 0; }
}

/* 画像が2枚ある場合のブレンディング用キーフレーム */
@keyframes -ua-mix-blend-mode-plus-lighter {
  from { mix-blend-mode: plus-lighter }
  to { mix-blend-mode: plus-lighter }
}
解説 このUAスタイルシートは以下のことを行います:

追加のスタイルは、ユーザーエージェント起源ビュー遷移時に 動的ビュー遷移スタイルシート経由で動的に追加されます。

6. API

6.1. Documentへの追加

partial interface Document {
  ViewTransition startViewTransition(optional UpdateCallback updateCallback);
};

callback UpdateCallback = Promise<any> ();
viewTransition = document.startViewTransition(updateCallback)

新しい ビュー遷移 を開始します(document の 既存の アクティブなビュー遷移があればキャンセルします)。

updateCallback が指定されていれば、ドキュメントの現在の状態がキャプチャされた後に非同期で呼び出されます。 その後、updateCallback が返すPromiseがfulfilledになると、 ドキュメントの新しい状態がキャプチャされ、遷移が開始されます。

なお updateCallback は、遷移が実行できない場合(例:重複した view-transition-name の値がある場合)でも 必ず呼び出されます。 遷移は状態変更への拡張であり、遷移の生成失敗によって状態変更自体が妨げられることはありません。 この原則の詳細は § 1.4 拡張機能としての遷移 を参照してください。

updateCallback が返すPromiseがrejectされた場合、遷移はスキップされます。

6.1.1. startViewTransition() メソッド手順

startViewTransition(updateCallback)メソッド手順は以下の通りです:
  1. transitionthis関連Realm内で新しい ViewTransition オブジェクトとして生成する。

  2. updateCallback が指定されていれば、transitionupdate callbackupdateCallback に設定する。

  3. documentthis関連グローバルオブジェクト関連付けられたドキュメントとする。

  4. documentvisibility state が "hidden" なら、 skip transition ("InvalidStateError" DOMException 付き)で終了し、transition を返す。

  5. documentアクティブなビュー遷移 が null でない場合、 そのビュー遷移をスキップ ("AbortError" DOMExceptionthis関連Realmで発生させる)。

    注: これにより2つの非同期な update callback が同時実行される可能性があり (順序が入れ替わる場合もある): 1つは document の現在の アクティブなビュー遷移用、 もう1つは今回の transition 用。 この機能の設計に従い、開発者が別の機能やフレームワークでこれらDOM変更の正しいスケジューリングを行うことを想定しています。

  6. documentアクティブなビュー遷移transition に設定する。

    注: ビュー遷移の処理は ビュー遷移のセットアップ内で 保留遷移操作の実行を通じて継続します。

  7. transition を返す。

6.2. ViewTransition インターフェース

[Exposed=Window]
interface ViewTransition {
  readonly attribute Promise<undefined> updateCallbackDone;
  readonly attribute Promise<undefined> ready;
  readonly attribute Promise<undefined> finished;
  undefined skipTransition();
};

ViewTransition インターフェースは、同一ドキュメント内の1つのビュー遷移(開始・終了ドキュメントが同じで、DOM構造が変更される可能性がある遷移)を表し、制御します。

viewTransition.updateCallbackDone

updateCallback が返すPromiseがfulfilledになるときにfulfilledし、rejectされるとrejectされるPromiseです。

注: View Transition APIはDOM変更をラップし、ビジュアル遷移を生成します。 しかし、遷移アニメーションの成否を気にせず、DOM変更がいつ実行されるかだけ知りたい場合があります。updateCallbackDone はその用途向けです。

viewTransition.ready

遷移用疑似要素が生成され、アニメーションが開始される直前にfulfilledするPromiseです。

遷移が開始できない場合はrejectされます。 これは重複した'view-transition-name'などの設定ミスや、 updateCallbackDone がrejectされた場合などです。

ready がfulfilledするタイミングは、 ビュー遷移疑似要素Web Animation API でアニメーションするのに最適です。

viewTransition.finished

エンド状態が完全にユーザーに見えて、操作可能になったときにfulfilledするPromiseです。

rejectされるのは updateCallback がrejectされた場合のみで、 これはエンド状態が生成されなかったことを示します。

それ以外の場合、遷移が開始できなかったり skipTransition() でスキップされた場合でも、エンド状態には到達するので finished はfulfilledします。

viewTransition.skipTransition()

遷移を即座に終了するか、開始を防ぎます。

これは updateCallback の呼び出しを妨げません。 DOM変更は遷移とは独立しているためです。 この原則の詳細は § 1.4 拡張機能としての遷移 を参照してください。

これが ready 解決前に呼ばれると、ready はrejectされます。

finished が解決されていなければ、updateCallbackDone と一緒にfulfilledまたはrejectされます。

ViewTransition には以下があります:

named elements

キーが view transition name、 値が captured element である map。 初期値は新しい map。 注: これは ViewTransition に紐付くため、 Clear view transitionが呼ばれるとクリーンアップされます。

phase

次の順序付きフェーズのうち1つ。初期値は "pending-capture":

  1. "pending-capture"

  2. "update-callback-called"

  3. "animating"

  4. "done"

注: このAPIを使う開発者は通常、各フェーズを意識する必要はありません。フェーズは自動的に進行します。 ただし、各フェーズで何が行われるか(スナップショットの取得、疑似要素DOMの生成など)は重要です。 以下のフェーズ説明は、実装者が仕様準拠の実装を作るために曖昧さのない手順を提供することを目指しています。

update callback

UpdateCallback または null。初期値は null。

ready promise

Promise。 初期値は 新しいpromisethis関連Realm内)。

update callback done promise

Promise。 初期値は 新しいpromisethis関連Realm内)。

注: ready promiseupdate callback done promise は即座に生成されるため、 rejectされると unhandledrejection が発生します (getter(updateCallbackDone など)がアクセスされていなくても)、 handledされない限りです。

finished promise

Promise。 初期値は 新しいpromisethis関連Realm内)、handledとしてマークされる。

注: このpromiseは handledとしてマークされているため、重複した unhandledrejection を防げます。 このpromiseは update callback done promise と一緒にrejectされる場合のみrejectされます。

transition root pseudo-element

::view-transition。 初期値は新しい ::view-transition

initial snapshot containing block size

2つの数値(幅と高さ)の tuple、または null。 初期値は null。

注: これは スナップショット包含ブロックサイズ の変化を検出するために使われます。 変化があれば遷移は skip されます。この挙動の議論

finishedgetter手順は、 thisfinished promise を返すこと。

readygetter手順は、 thisready promise を返すこと。

updateCallbackDonegetter手順は、 thisupdate callback done promise を返すこと。

6.2.1. skipTransition() メソッド手順

skipTransition()メソッド手順は以下の通り:
  1. thisphase が "done" でなければ、 skip the view transitionthis で "AbortError" DOMException で行うこと。

7. アルゴリズム

7.1. データ構造

7.1.1. Documentへの追加

Document にはさらに以下が含まれる:

active view transition

ViewTransition または null。初期値は null。

rendering suppression for view transitions

boolean型。初期値は false。

Documentrendering suppression for view transitions が true の場合、 すべてのポインターヒットテストは document element をターゲットとし、 他の 要素は無視される。

注: これは pointer capture されているポインターには影響しません。

dynamic view transition style sheet

スタイルシート。 初期値は新しい スタイルシートで、 ユーザーエージェント起源に属し、 グローバルビュー遷移ユーザーエージェントスタイルシートの後に順序付けされる。

注: これは遷移に関連する動的スタイルを保持するために使用されます。

show view transition tree

boolean型。初期値は false。

これが true の場合、thisactive view transitiontransition root pseudo-elementthisdocument element の子としてレンダリングされ、 thisdocument element が その originating element となる。

注: transition root pseudo-elementdocument element 内での位置は重要ではありません。 transition root pseudo-element包含ブロックスナップショット包含ブロックだからです。

7.1.2. 要素への追加

要素ビュー遷移でキャプチャされた boolean型(初期値は false)を持ちます。

注: この仕様ではCSSの 要素の定義を使用しており、 疑似要素も含みます。

7.1.3. キャプチャされた要素

キャプチャされた要素は、以下を持つ構造体です:

old image

2Dビットマップまたは null。初期値は null。

old width
old height

unrestricted double型、初期値は 0。

old transform

<transform-function>型。初期値は 単位変換関数

old writing-mode

nullまたはwriting-mode。初期値は null。

old direction

nullまたはdirection。初期値は null。

old text-orientation

nullまたはtext-orientation。初期値は null。

old mix-blend-mode

nullまたはmix-blend-mode。初期値は null。

old backdrop-filter

nullまたはbackdrop-filter。初期値は null。

old color-scheme

nullまたはcolor-scheme。初期値は null。

new element

要素または null。初期値は null。

さらに、キャプチャされた要素は以下のスタイル定義を持つ:

group keyframes

CSSKeyframesRule または null。初期値は null。

group animation name rule

CSSStyleRule または null。初期値は null。

group styles rule

CSSStyleRule または null。初期値は null。

image pair isolation rule

CSSStyleRule または null。初期値は null。

image animation name rule

CSSStyleRule または null。初期値は null。

注: これらは documentdynamic view transition style sheet から スタイルを更新・削除するために使われます。

7.2. 保留中の遷移操作の実行

このアルゴリズムは html仕様の rendering loopの更新 の一部として呼び出されます。

保留中の遷移操作の実行は、Document document に対して以下の手順を実行する:

  1. documentactive view transition が null でない場合:

    1. documentactive view transitionphase が "pending-capture" なら、 ビュー遷移のセットアップdocumentactive view transition に対して実行する。

    2. それ以外の場合、documentactive view transitionphase が "animating" なら、 遷移フレームの処理documentactive view transition に対して実行する。

7.3. ビュー遷移のセットアップ

setup view transitionViewTransition transition に対して行う手順は以下の通り:

注: このアルゴリズムはドキュメントの現在の状態をキャプチャし、 遷移の UpdateCallback を呼び出し、 その後ドキュメントの新しい状態をキャプチャします。

  1. documenttransition関連グローバルオブジェクト関連付けられたドキュメントとする。

  2. 旧状態のキャプチャtransition に対して行う。

    失敗が返された場合、ビュー遷移のスキップtransition に対し "InvalidStateError" DOMExceptiontransition関連Realm で行い、return。

  3. documentビュー遷移用レンダリング抑制 を true にする。

  4. グローバルタスクをキューに追加する。 DOM操作タスクソースで、 transition関連グローバルオブジェクト を指定し、以下の手順を実行:

    注: 画像のキャプチャ のテクスチャの読み出しは非同期となる場合があるため、ここでタスクをキューしていますが、HTML仕様のレンダーステップでは同期的に扱われます。

    1. transitionphase が "done" の場合、これらの手順を中止する。

      注: これは transition がこの時点で スキップ された場合に発生します。

    2. update callback の呼び出しを行う。

activate view transitionViewTransition transition に対して行う手順は以下の通り:
  1. transitionphase が "done" の場合、return。

    注: これは transition がこの時点で スキップ された場合に発生します。

  2. ビュー遷移用レンダリング抑制 を false にする。

  3. transition初期スナップショット包含ブロックサイズスナップショット包含ブロックサイズ と等しくない場合、 ビュー遷移のスキップtransition に対して行い、return。

  4. 新状態のキャプチャtransition に対して行う。

    失敗が返された場合、ビュー遷移のスキップtransition に対し "InvalidStateError" DOMExceptiontransition関連Realm で行い、return。

  5. resolve transitionupdate callback done promise を undefined で解決する。

  6. capturedElementtransitionnamed elementsでイテレート:

    1. capturedElementnew element が null でなければ、 capturedElementnew elementビュー遷移でキャプチャされた を true に設定。

  7. 遷移疑似要素のセットアップtransition に対して行う。

  8. 疑似要素スタイルの更新transition に対して行う。

    失敗が返された場合、ビュー遷移のスキップtransition に対し "InvalidStateError" DOMExceptiontransition関連Realm で行い、return。

    注: 上記の手順では、スタイル・レイアウト中に計算される情報を得るために、ドキュメントのライフサイクルフェーズの実行が必要となります。

  9. transitionphase を "animating" に設定。

  10. resolve transitionready promise を解決する。

7.3.1. 旧状態のキャプチャ

capture the old stateViewTransition transition に対して行う手順:
  1. documenttransition関連グローバルオブジェクト関連付けられたドキュメントとする。

  2. namedElementstransitionnamed elementsとする。

  3. usedTransitionNames を新しい セット(string型)とする。

  4. captureElements を新しい リスト(要素型)とする。

  5. documenttransition関連グローバルオブジェクト関連付けられたドキュメントとする。

  6. スナップショット包含ブロックサイズ実装依存の最大値を超える場合、失敗を返す。

  7. transition初期スナップショット包含ブロックサイズスナップショット包含ブロックサイズ に設定する。

  8. element を、要素connected かつ ノードドキュメントdocument であるものを、 描画順でイテレート:

    描画順でイテレートすることで、この順序が namedElements にキャッシュされます。 これによりペイントスタックの一番下の要素が ::view-transition の最初の疑似子要素を生成するなど、 ::view-transition-group 疑似要素のDOM順が定義されます。
    1. この elementflat tree の祖先が 内容をスキップしている場合、continue

    2. element が複数の box fragment を持つ場合、continue

      注: 将来のバージョンでは分断要素の遷移も有効化するかもしれません。 #8900を参照。

      注: ここでの box fragment は、 インラインボックスラインボックスをまたぐ分断とは異なります。 そのようなインラインも遷移に参加できます。

    3. transitionNameelement算出値view-transition-name)とする。

    4. transitionNamenone または element非レンダリングなら、continue

    5. usedTransitionNamestransitionNameを含む場合、失敗を返す。

    6. transitionNameを追加 (usedTransitionNamesに)。

    7. elementビュー遷移でキャプチャされた を true に設定。

    8. elementを追加 (captureElementsに)。

    このアルゴリズムは別のループで続行され、 ビュー遷移でキャプチャされた が すべての参加要素に設定された後、後続ステップで読まれるためです。
  9. elementcaptureElements でイテレート:

    1. capture を新しい キャプチャされた要素構造体とする。

    2. captureold image画像のキャプチャ の結果で設定する(elementに対して)。

    3. originalRectelementdocument element なら スナップショット包含ブロック、それ以外なら border box とする。

    4. captureold widthoriginalRectwidth で設定。

    5. captureold heightoriginalRectheight で設定。

    6. captureold transform<transform-function> で設定(elementborder boxスナップショット包含ブロック原点 から現在の視覚位置までマッピングするもの)。

    7. captureold writing-mode算出値writing-mode)で設定。

    8. captureold direction算出値direction)で設定。

    9. captureold text-orientation算出値text-orientation)で設定。

    10. captureold mix-blend-mode算出値mix-blend-mode)で設定。

    11. captureold backdrop-filter算出値backdrop-filter)で設定。

    12. captureold color-scheme算出値color-scheme)で設定。

    13. transitionNameelement算出値view-transition-name)とする。

    14. namedElements[transitionName] に capture を設定。

  10. elementcaptureElements でイテレート:

    1. elementビュー遷移でキャプチャされた を false に設定。

7.3.2. 新状態のキャプチャ

新状態のキャプチャViewTransition transition に対して行う手順:
  1. documenttransition関連グローバルオブジェクト関連付けられたドキュメントとする。

  2. namedElementstransitionnamed elementsとする。

  3. usedTransitionNames を新しい セット(string型)とする。

  4. element を、要素connected かつ ノードドキュメントdocument であるものを、 描画順でイテレート:

    1. この elementflat tree の祖先が 内容をスキップしている場合、continue

    2. transitionNameelement算出値view-transition-name)とする。

    3. transitionNamenone または element非レンダリングの場合、continue

    4. usedTransitionNamestransitionNameを含む場合、失敗を返す。

    5. transitionNameを追加 (usedTransitionNamesに)。

    6. namedElements[transitionName] が 存在しない場合、 namedElements[transitionName] に新しい キャプチャされた要素構造体を設定。

      注: この構造体は意図的にこの順序付きmapの末尾に追加されます。 新DOMにのみ存在する名前(エントリーアニメーション)は旧DOMのみの名前(退場アニメーション)や両DOMに存在する名前(ペアアニメーション)より上に描画されます。 このレイヤリングがすべての場合に正しいとは限りません。issue 8941参照。

    7. namedElements[transitionName] の new elementelement を設定。

7.3.3. 遷移疑似要素のセットアップ

setup transition pseudo-elementsViewTransition transition に対して行う手順:

注: このアルゴリズムは遷移用疑似要素ツリーを構築し、 初期スタイルを生成します。 疑似ツリーの構造は § 3.2 ビュー遷移疑似要素で説明されています。

  1. documentthis関連グローバルオブジェクト関連付けられたドキュメントとする。

  2. documentshow view transition tree を true に設定。

  3. transitionNamecapturedElementtransitionnamed elements でイテレート:

    1. group を新しい ::view-transition-group() とし、 ビュー遷移名transitionName に設定。

    2. grouptransitiontransition root pseudo-element に追加。

    3. imagePair を新しい ::view-transition-image-pair() とし、 ビュー遷移名transitionName に設定。

    4. imagePairgroup に追加。

    5. capturedElementold image が null でなければ:

      1. old を新しい ::view-transition-old() とし、 ビュー遷移名transitionName に設定、 capturedElementold image置換内容として表示。

      2. oldimagePair に追加。

    6. capturedElementnew element が null でなければ:

      1. new を新しい ::view-transition-new() とし、 ビュー遷移名transitionName に設定。

        注: この疑似要素のスタイリングは 疑似要素スタイルの更新で扱います。

      2. newimagePair に追加。

    7. capturedElementold image が null の場合:

      1. Assert: capturedElementnew element は null ではない。

      2. capturedElementimage animation name rule を新しい CSSStyleRule (以下のCSSを表現)とし、 documentdynamic view transition style sheet に追加:

        :root::view-transition-new(transitionName) {
          animation-name: -ua-view-transition-fade-in;
        }
        

        注: 上記コード例は変数を置換する必要があります。

    8. capturedElementnew element が null の場合:

      1. Assert: capturedElementold image は null ではない。

      2. capturedElementimage animation name rule を新しい CSSStyleRule (以下のCSSを表現)とし、 documentdynamic view transition style sheet に追加:

        :root::view-transition-old(transitionName) {
          animation-name: -ua-view-transition-fade-out;
        }
        

        注: 上記コード例は変数を置換する必要があります。

    9. capturedElementold imagenew element が両方 null でない場合:

      1. transformcapturedElementold transform とする。

      2. widthcapturedElementold width とする。

      3. heightcapturedElementold height とする。

      4. backdropFiltercapturedElementold backdrop-filter とする。

      5. capturedElementgroup keyframes を新しい CSSKeyframesRule (以下のCSSを表現)とし、 documentdynamic view transition style sheet に追加:

        @keyframes -ua-view-transition-group-anim-transitionName {
          from {
            transform: transform;
            width: width;
            height: height;
            backdrop-filter: backdropFilter;
          }
        }
        

        注: 上記コード例は変数を置換する必要があります。

      6. capturedElementgroup animation name rule を新しい CSSStyleRule (以下のCSSを表現)とし、 documentdynamic view transition style sheet に追加:

        :root::view-transition-group(transitionName) {
          animation-name: -ua-view-transition-group-anim-transitionName;
        }
        

        注: 上記コード例は変数を置換する必要があります。

      7. capturedElementimage pair isolation rule を新しい CSSStyleRule (以下のCSSを表現)とし、 documentdynamic view transition style sheet に追加:

        :root::view-transition-image-pair(transitionName) {
          isolation: isolate;
        }
        

        注: 上記コード例は変数を置換する必要があります。

      8. capturedElementimage animation name rule を新しい CSSStyleRule (以下のCSSを表現)とし、 documentdynamic view transition style sheet に追加:

        :root::view-transition-old(transitionName) {
          animation-name: -ua-view-transition-fade-out, -ua-mix-blend-mode-plus-lighter;
        }
        :root::view-transition-new(transitionName) {
          animation-name: -ua-view-transition-fade-in, -ua-mix-blend-mode-plus-lighter;
        }
        

        注: 上記コード例は変数を置換する必要があります。

        注: mix-blend-mode: plus-lighter の効果で、 old/new両画像の同じピクセルを合成したときに正しいクロスフェードが実現できます。

7.4. update callback の呼び出し

update callback の呼び出しViewTransition transition に対して行う手順:

注: これはすべての ViewTransition に対し必ず発生します。遷移が skip された場合も同様です。 この理由は § 1.4 拡張機能としての遷移で説明されています。

  1. Assert: transitionphase が "done" または "update-callback-called" 前であること。

  2. callbackPromise を null とする。

  3. transitionupdate callback が null なら、 callbackPromiseundefinedで解決されたpromisetransition関連Realm内)に設定。

  4. それ以外の場合、callbackPromiseupdate callbackの呼び出しの結果に設定。

  5. transitionphase が "done" でなければ、phase を "update-callback-called" に設定。

  6. fulfillSteps を以下の手順とする:

    1. activate view transitiontransition に対して行う。

    2. resolve transitionupdate callback done promise を undefined で解決。

      注: 前手順で既にpromiseを解決している場合はno-opです。

  7. rejectStepsreasonを引数に以下の手順とする:

    1. reject transitionupdate callback done promisereason でreject。

    2. transitionphase が "done" なら return。

      注: これは transition がこの時点で skip された場合に発生します。

    3. handledとしてマーク transitionready promise

      注: transitionupdate callback done promiseunhandledrejection を提供します。この手順は重複を避けるものです。

    4. skip the view transitiontransitionreason で行う。

  8. callbackPromiseをsettle時に fulfillStepsrejectSteps を実行。

  9. ユーザーエージェントがタイムアウト後に遷移をスキップする場合、以下の手順を 並列で実行する:

    1. 実装依存の duration だけ待つ。

    2. グローバルタスクをキューDOM操作タスクソースで)、transition関連グローバルオブジェクト指定、以下の手順実行:

      1. transitionphase が "done" なら return。

        注: これは transition がこの時点で skip された場合に発生します。

      2. skip transition を "TimeoutError" DOMException で行う。

7.5. ビュー遷移をスキップする

ビュー遷移をスキップするViewTransition transition に対して reason を用いて行う手順:
  1. documenttransition関連グローバルオブジェクト関連付けられたドキュメントとする。

  2. Assert: transitionphase が "done" でないこと。

  3. transitionphase が "update-callback-called"より前なら、 グローバルタスクをキューする(DOM操作タスクソースで、 transition関連グローバルオブジェクト指定)し、 update callback の呼び出しtransition に対して行う。

  4. ビュー遷移用レンダリング抑制 を false に設定。

  5. documentactive view transitiontransition なら、 ビュー遷移のクリアtransition に対して行う。

  6. transitionphase を "done" に設定。

  7. reject transitionready promisereason でreject。

    注: ready promise は、 この時点で既に解決済みである場合もある(skipTransition() がアニメーション開始後に呼ばれた場合)。 その場合、このステップは no-op です。

  8. resolve transitionfinished promise を、 update callback done promise の settle時に反応した結果で解決:

    • promiseがfulfilledなら undefined を返す。

    注: transitionupdate callback done promise のrejectは明示的にここで処理されないため、 transitionupdate callback done promise がrejectされた場合、 transitionfinished promise も同じ理由でrejectされる。

7.6. ビュー遷移のページ可視性変更手順

ビュー遷移のページ可視性変更手順は、Document document に対して次の通り:
  1. documentvisibility state が "hidden" なら:

    1. documentactive view transition が null でなければ、 skip documentactive view transition を "InvalidStateError" DOMException でスキップする。

  2. それ以外の場合、assert: active view transition は null であること。

注: これはHTML仕様から呼ばれます。

7.7. 画像のキャプチャ

画像のキャプチャelement element に対して行う手順。 画像を返す。
  1. elementdocument element なら:

    1. ドキュメント領域 (canvas backgroundトップレイヤーの内容を含む) が スナップショット包含ブロックと交差する部分を、 スナップショット包含ブロックと同じサイズの透明なキャンバス上にレンダリングする。 キャプチャレンダリング特性および以下の特性に従う:

      • elementスクロールボックス の外側領域は、 レイアウトビューポートを移動・サイズ変更せずに、スクロールされたかのようにレンダリングされるべき。 これはスクロールやリサイズ関連のイベント(IntersectionObserverなど)を発火してはならない。

        スマートフォンブラウザーウィンドウ。URLバー、直下に固定要素、その下にページコンテンツ。スクロールバーはページが大きくスクロールされていることを示す。 キャプチャされたスナップショット。URLバー下のコンテンツもキャプチャに含まれることが分かる。
        ユーザーが見ているものとキャプチャスナップショットの例。 この例ではルートだけがtransition nameを持つと仮定。
      • スクロール不可能な領域(スクロール範囲外)は canvas background をレンダリングするべき。

        スマートフォンブラウザーウィンドウ。URLバーとその下にコンテンツ。スクロールバーはページが一番上にあることを示す。 キャプチャスナップショット。URLバー下の領域が他のドキュメント部分と同じ色になっている。
        ユーザーが見ているものとキャプチャスナップショットの例。 この例ではルートだけがtransition nameを持つと仮定。
    2. このキャンバスを画像として返す。 画像の自然サイズは スナップショット包含ブロックと同じ。

  2. それ以外の場合:

    1. element およびその 子孫 を、 ノードドキュメントで表示されるのと同じサイズで、 無限透明キャンバス上にレンダリングする。 キャプチャレンダリング特性に従う。

    2. このキャンバスのうち、elementink overflow rectangle を含む部分を画像として返す。 この画像の自然寸法は、その principal border boxと同じで、 原点もその border box の原点に対応する。 画像はこの border box の内容と、キャプチャされた ink overflow がその外側に表現される。

      注: この画像を 置換要素として自然サイズでレンダリングすると、 要素の principal box のサイズと内容が表示され、 キャプチャされた ink overflowcontent boxの外に溢れる。

7.7.1. キャプチャレンダリング特性

キャプチャレンダリング特性は次の通り:

7.8. 遷移フレームの処理

遷移フレームの処理ViewTransition transition に対して行う手順:
  1. documenttransition関連グローバルオブジェクト関連付けられたドキュメントとする。

  2. hasActiveAnimations を boolean型(初期値 false)とする。

  3. elementtransitiontransition root pseudo-elementinclusive descendants でイテレート:

    1. animationtimelinedocument timelinedocumentに関連し、 少なくとも1つ associated effecteffect targetelementであるもの)について、 以下いずれかがtrueなら hasActiveAnimations を true にする:

  4. hasActiveAnimations が false の場合:

    1. transitionphase を "done" に設定。

    2. ビュー遷移のクリアtransition に対して実行。

    3. resolve transitionfinished promise

    4. return。

  5. transition初期スナップショット包含ブロックサイズスナップショット包含ブロックサイズと等しくない場合、 ビュー遷移のスキップtransition に対して実行し、return。

  6. 疑似要素スタイルの更新transition に対して実行。

    失敗が返された場合、ビュー遷移のスキップtransition に対し "InvalidStateError" DOMExceptiontransition関連Realm で行い、return。

    注: 上記は、要素のサイズや位置が変化した場合に新しいキーフレームが生成されることを意味します。 このため、視覚的なジャンプが発生する場合があります。 より滑らかなリターゲットも可能ですが、複雑さに見合うユースケースがまだありません。 詳細は issue 7813 を参照。

7.9. 疑似要素スタイルの更新

疑似要素スタイルの更新ViewTransition transition に対して行う手順:
  1. transitionNamecapturedElementtransitionnamed elements でイテレート:

    1. width, height, transform, writingMode, direction, textOrientation, mixBlendMode, backdropFilter, colorScheme を null で初期化。

    2. capturedElementnew element が null の場合:

      1. widthcapturedElementold width で設定。

      2. heightcapturedElementold height で設定。

      3. transformcapturedElementold transform で設定。

      4. writingModecapturedElementold writing-mode で設定。

      5. directioncapturedElementold direction で設定。

      6. textOrientationcapturedElementold text-orientation で設定。

      7. mixBlendModecapturedElementold mix-blend-mode で設定。

      8. backdropFiltercapturedElementold backdrop-filter で設定。

      9. colorSchemecapturedElementold color-scheme で設定。

    3. それ以外の場合:

      1. 以下いずれかがtrueなら失敗を返す:

        注: その他のレンダリング制約は capturedElementnew elementビュー遷移でキャプチャされたであることで強制される。

      2. widthcapturedElementnew elementborder box の現時点の幅で設定。

      3. heightcapturedElementnew elementborder box の現時点の高さで設定。

      4. transformcapturedElementnew elementborder boxスナップショット包含ブロック原点 から現在の視覚位置にマッピングするtransformで設定。

      5. writingMode算出値writing-modecapturedElementnew element)で設定。

      6. direction算出値directioncapturedElementnew element)で設定。

      7. textOrientation算出値text-orientationcapturedElementnew element)で設定。

      8. mixBlendMode算出値mix-blend-modecapturedElementnew element)で設定。

      9. backdropFilter算出値backdrop-filtercapturedElementnew element)で設定。

      10. colorScheme算出値color-schemecapturedElementnew element)で設定。

    4. capturedElementgroup styles rule が null なら、 group styles rule に新しい CSSStyleRule (以下のCSS)を設定し、transition関連グローバルオブジェクト関連付けられたドキュメントdynamic view transition style sheet に追加。

      それ以外の場合、group styles rule を以下のCSSに更新:

      :root::view-transition-group(transitionName) {
        width: width;
        height: height;
        transform: transform;
        writing-mode: writingMode;
        direction: direction;
        text-orientation: textOrientation;
        mix-blend-mode: mixBlendMode;
        backdrop-filter: backdropFilter;
        color-scheme: colorScheme;
      }
      

      注: 上記コード例は変数を置換する必要があります。

    5. capturedElementnew element が null でなければ:

      1. new::view-transition-new()ビュー遷移名transitionName)とする。

      2. new置換要素内容に、画像のキャプチャcapturedElementnew element)の結果を設定。

このアルゴリズムは、Web APIからその効果が観測できる場合、ユーザーエージェント起源でスタイルを更新するために必ず実行されなければならない。

注: 例えば、window.getComputedStyle(document.documentElement, "::view-transition") のようなWeb APIが該当する。

7.10. ビュー遷移のクリア

ビュー遷移のクリアViewTransition transition に対して行う手順:
  1. documenttransition関連グローバルオブジェクト関連付けられたドキュメントとする。

  2. Assert: documentactive view transitiontransition であること。

  3. capturedElementtransitionnamed elementsでイテレート:

    1. capturedElementnew element が null でない場合、 new elementビュー遷移でキャプチャされた を false に設定。

    2. stylecapturedElementスタイル定義でイテレート:

      1. style が null でなく、かつ styledocumentdynamic view transition style sheet に含まれている場合、 styledocumentdynamic view transition style sheet から削除する。

  4. documentshow view transition tree を false に設定。

  5. documentactive view transition を null に設定。

プライバシーに関する考慮事項

この仕様は新たなプライバシー考慮事項を導入しません。

セキュリティに関する考慮事項

画像のキャプチャアルゴリズムによって生成される画像は(ドキュメントがクロスオリジンリソースを埋め込んでいる場合)クロスオリジンデータや閲覧履歴等の機密情報を含む可能性があります。 実装はこのデータがドキュメントからアクセスできないように保証しなければなりません。 このデータへのアクセスは、通常のドキュメント描画でも既に防止されているはずなので、対応は容易です。

付録A. 変更点

この付録は参考情報です。

2022-05-30 ワーキングドラフトからの変更

2022-05-25 ワーキングドラフトからの変更

2022-11-24 ワーキングドラフトからの変更

2022-10-25 ワーキングドラフト (FPWD)からの変更

適合性

文書の慣例

適合性要件は、記述的な断定とRFC 2119の用語の組み合わせによって表現されます。重要な語句「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」は、この文書の規範的な部分ではRFC 2119の定義通りに解釈されます。 ただし、可読性のために、これらの語句は本仕様ではすべて大文字ではありません。

本仕様のすべての本文は規範的ですが、明示的に非規範的と示されたセクション、例、および注は除きます。 [RFC2119]

本仕様の例は「例えば」で始まるか、class="example"を付与して規範文から分離されます。例:

これは情報提供用の例です。

情報提供用の注は「注:」で始まり、class="note"で規範文と分離されます。例:

注: これは情報提供用の注です。

アドバイスは、特別な注意を促すために規範的なセクションとして強調表示され、<strong class="advisement">で他の規範文から分離されます。例: UAはアクセシブルな代替を提供しなければなりません。

適合性クラス

本仕様への適合性は、3つの適合性クラスで定義されます:

スタイルシート
CSSスタイルシート
レンダラー
UA。スタイルシートの意味を解釈し、それらを用いた文書を描画するもの。
オーサリングツール
UA。スタイルシートを書き出すもの。

スタイルシートは、本モジュールで定義された構文を使用するすべての文が、一般CSS文法および本モジュールで定義された各機能の個別文法に従って有効であれば、本仕様に適合します。

レンダラーは、スタイルシートを適切な仕様通りに解釈することに加え、本仕様で定義されるすべての機能を正しくパースし、文書をそれに従って描画できれば、本仕様に適合します。ただし、デバイスの制限によりUAが文書を正しく描画できない場合でも、UAは非適合とはなりません。(例:UAはモノクロモニターで色を描画する必要はありません。)

オーサリングツールは、一般CSS文法および本モジュールの各機能の個別文法に従って構文的に正しいスタイルシートを書き出し、本モジュールで記載されたスタイルシートの他の適合要件も満たしていれば、本仕様に適合します。

部分的な実装

著者がフォールバック値を割り当てられるように、CSSレンダラーは、サポートレベルのないat-ルール、プロパティ、プロパティ値、キーワードその他構文的な構成要素を無効として適切に無視しなければなりません。特に、ユーザーエージェントは、未サポートのコンポーネント値のみ選択的に無視し、単一の複数値プロパティ宣言でサポートされる値のみを認めてはなりません。値のいずれかが無効(未サポート値は必ずそうなる)と判断された場合、CSSは宣言全体を無視する必要があります。

不安定・独自機能の実装

将来の安定したCSS機能との競合を避けるため、CSSWGはベストプラクティスに従い、不安定機能や独自拡張のCSS実装を推奨します。

非実験的実装

仕様がCandidate Recommendation段階に到達した時点で、非実験的な実装が可能となり、実装者は仕様通りに正しく実装できたCRレベルの機能については、非プレフィックスの実装をリリースするべきです。

CSSの実装間で相互運用性を確立・維持するため、CSS Working Groupは、非実験的CSSレンダラーがCSS機能の非プレフィックス実装をリリースする前に、実装報告書(必要ならそのテストケースも)をW3Cに提出するよう要請します。W3Cへ提出されたテストケースはCSS Working Groupのレビュー・修正対象となります。

テストケース・実装報告書の提出方法など詳細は、CSS Working GroupのWebサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問は public-css-testsuite@w3.org メーリングリストにお問い合わせください。

CR移行基準

本仕様がProposed Recommendationに進むためには、各機能について少なくとも2つの独立した相互運用可能な実装が必要です。各機能は異なる製品セットで実装されても構いません。すべての機能が単一製品で実装される必要はありません。この基準に関して、以下の用語を定義します:

独立
各実装は異なる当事者によって開発され、他の適格実装のコードを共有・再利用・派生してはならない。仕様の実装に関係しないコード部分はこの要件から除外されます。
相互運用可能
公式CSSテストスイートの該当テストケースに合格すること、またはWebブラウザでない場合は同等のテスト。該当するすべてのテストには、同等のテストを作成し、該当UAが相互運用性を主張する場合は、他のUAも同等テストに合格できる必要があります。同等テストはピアレビューのため公開されなければなりません。
実装
ユーザーエージェントであり、以下を満たすもの:
  1. 仕様を実装している。
  2. 一般公開されている。製品版またはベータ版、プレビュー、nightly buildでも構わない。 非製品版の場合は、少なくとも1ヶ月間その機能を実装して安定性を示す必要がある。
  3. 実験的でない(テストスイート合格のためだけに設計されたバージョン、今後通常使用されないものは不可)。

仕様はCandidate Recommendationの状態を少なくとも6ヶ月間維持します。

索引

本仕様で定義される用語

参照によって定義される用語

参考文献

規範参照

[COMPOSITING-1]
Chris Harrelson. Compositing and Blending Level 1(合成とブレンド レベル1). 2024年3月21日. CR. URL: https://www.w3.org/TR/compositing-1/
[CSS-2022]
Tab Atkins Jr.; Elika Etemad; Florian Rivoal. CSS Snapshot 2022(CSS スナップショット2022). 2022年11月22日. 注記. URL: https://www.w3.org/TR/css-2022/
[CSS-ANIMATIONS-1]
David Baron; 他. CSS Animations Level 1(CSSアニメーション レベル1). 2023年3月2日. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3(CSS 背景と枠線モジュール レベル3). 2024年3月11日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4(CSSボックスモデルモジュール レベル4). 2022年11月3日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4(CSS分断モジュール レベル4). 2018年12月18日. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5(CSSカスケーディングと継承 レベル5). 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COLOR-4]
Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS Color Module Level 4(CSSカラー モジュール レベル4). 2024年2月13日. CR. URL: https://www.w3.org/TR/css-color-4/
[CSS-COLOR-ADJUST-1]
Elika Etemad; 他. CSS Color Adjustment Module Level 1(CSSカラー調整モジュール レベル1). 2022年6月14日. CR. URL: https://www.w3.org/TR/css-color-adjust-1/
[CSS-CONTAIN-2]
Tab Atkins Jr.; Florian Rivoal; Vladimir Levin. CSS Containment Module Level 2(CSS包含モジュール レベル2). 2022年9月17日. WD. URL: https://www.w3.org/TR/css-contain-2/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3(CSSディスプレイモジュール レベル3). 2023年3月30日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3(CSS画像モジュール レベル3). 2023年12月18日. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS-IMAGES-4]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 4(CSS画像モジュール レベル4). 2023年2月17日. WD. URL: https://www.w3.org/TR/css-images-4/
[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS Masking Module Level 1(CSSマスキングモジュール レベル1). 2021年8月5日. CR. URL: https://www.w3.org/TR/css-masking-1/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3(CSSオーバーフローモジュール レベル3). 2023年3月29日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3(CSS位置レイアウトモジュール レベル3). 2023年4月3日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-POSITION-4]
CSS Positioned Layout Module Level 4(CSS位置レイアウトモジュール レベル4). 編集者ドラフト. URL: https://drafts.csswg.org/css-position-4/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4(CSS疑似要素モジュール レベル4). 2022年12月30日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1(CSSスコーピングモジュール レベル1). 2014年4月3日. WD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-TRANSFORMS-1]
Simon Fraser; 他. CSS Transforms Module Level 1(CSS変形モジュール レベル1). 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-TRANSFORMS-2]
Tab Atkins Jr.; 他. CSS Transforms Module Level 2(CSS変形モジュール レベル2). 2021年11月9日. WD. URL: https://www.w3.org/TR/css-transforms-2/
[CSS-UI-4]
Florian Rivoal. CSS Basic User Interface Module Level 4(CSS基本UIモジュール レベル4). 2021年3月16日. WD. URL: https://www.w3.org/TR/css-ui-4/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4(CSS値と単位モジュール レベル4). 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VIEWPORT-1]
Florian Rivoal; Emilio Cobos Álvarez. CSS Viewport Module Level 1(CSSビューポートモジュール レベル1). 2024年1月25日. WD. URL: https://www.w3.org/TR/css-viewport-1/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3(CSS書字方向モード レベル3). 2019年12月10日. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4(CSS書字方向モード レベル4). 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification(カスケーディングスタイルシート レベル2改訂1(CSS2.1)仕様). 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification(カスケーディングスタイルシート レベル2改訂2(CSS2.2)仕様). 2016年4月12日. WD. URL: https://www.w3.org/TR/CSS22/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM)(CSSオブジェクトモデル). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM View Module(CSSOMビュー モジュール). 2016年3月17日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM標準. Living Standard. URL: https://dom.spec.whatwg.org/
[FILTER-EFFECTS-1]
Dirk Schulze; Dean Jackson. Filter Effects Module Level 1(フィルター効果モジュール レベル1). 2018年12月18日. WD. URL: https://www.w3.org/TR/filter-effects-1/
[FILTER-EFFECTS-2]
Filter Effects Module Level 2(フィルター効果モジュール レベル2). 編集者ドラフト. URL: https://drafts.fxtf.org/filter-effects-2/
[GEOMETRY-1]
Simon Pieters; Chris Harrelson. Geometry Interfaces Module Level 1(ジオメトリインターフェースモジュール レベル1). 2018年12月4日. CR. URL: https://www.w3.org/TR/geometry-1/
[HR-TIME-3]
Yoav Weiss. High Resolution Time(高精度時間). 2023年7月19日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; 他. HTML標準. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra標準. Living Standard. URL: https://infra.spec.whatwg.org/
[INTERSECTION-OBSERVER]
Stefan Zager; Emilio Cobos Álvarez; Traian Captan. Intersection Observer(インターセクションオブザーバー). 2023年10月18日. WD. URL: https://www.w3.org/TR/intersection-observer/
[RFC2119]
S. Bradner. RFCにおける要求レベルを示すための重要語. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-3]
Tantek Çelik; 他. Selectors Level 3(セレクタ レベル3). 2018年11月6日. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4(セレクタ レベル4). 2022年11月11日. WD. URL: https://www.w3.org/TR/selectors-4/
[WEB-ANIMATIONS-1]
Brian Birtles; 他. Web Animations(ウェブアニメーション). 2023年6月5日. WD. URL: https://www.w3.org/TR/web-animations-1/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL標準. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報

[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3(CSSボックスサイズモジュール レベル3). 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[POINTEREVENTS3]
Patrick Lauke; Robert Flack. Pointer Events(ポインターイベント). 2024年3月18日. WD. URL: https://www.w3.org/TR/pointerevents3/
[SCROLL-ANIMATIONS-1]
Brian Birtles; 他. Scroll-driven Animations(スクロールドリブンアニメーション). 2023年6月6日. WD. URL: https://www.w3.org/TR/scroll-animations-1/

プロパティ索引

名前 初期値 適用対象 継承 %指定 アニメーションタイプ 正規順序 算出値
view-transition-name none | <custom-ident> none すべての要素 いいえ 該当なし 離散(discrete) 文法による 指定通り

IDL索引

partial interface Document {
  ViewTransition startViewTransition(optional UpdateCallback updateCallback);
};

callback UpdateCallback = Promise<any> ();

[Exposed=Window]
interface ViewTransition {
  readonly attribute Promise<undefined> updateCallbackDone;
  readonly attribute Promise<undefined> ready;
  readonly attribute Promise<undefined> finished;
  undefined skipTransition();
};