1. はじめに
このセクションは規範的ではありません。
この仕様は、DOM APIおよび関連するCSS機能を導入し、 開発者がアニメーション付きのビジュアル遷移 (ビュー遷移) を異なるドキュメントの状態間で作成できるようにします。
1.1. ビジュアル遷移とDOM更新の分離
従来、2つのドキュメント状態間でビジュアル遷移を作成するには、 両方の状態が同時にDOM内に存在する期間が必要でした。 実際には、両方の状態を表現できる特定のDOM構造を作成することが多く、 例えば、ある要素がコンテナ間を「移動」する場合、 遷移期間中はその要素がどちらのコンテナにも属さない状態にする必要があり、 どちらのコンテナや祖先要素によるクリッピングを避けるためです。
このような中間状態は、純粋にビジュアル効果のためにDOM構造を損なうため、 UXやアクセシビリティの問題を引き起こすことがよくありました。
ビュー遷移は、この中間状態を回避し、 DOMを即座に状態切り替えした後、別レイヤーでカスタマイズ可能なビジュアル遷移を行います。 旧状態の静的キャプチャと新状態のライブキャプチャを用いて、 これらのキャプチャは疑似要素のツリー(§ 3.2 ビュー遷移疑似要素で詳細)として表現され、 旧ビジュアル状態と新状態が共存することで、 サイズや位置のアニメーション中にクロスフェードなどの効果を実現できます。
1.2. ビュー遷移のカスタマイズ
デフォルトでは、
document.
は、2つのDOM状態間でページ全体のクロスフェードを行う
ビュー遷移
を作成します。
開発者は、view-transition-name CSSプロパティを使い、
どの要素を個別にキャプチャするか選択でき、
ページ全体とは独立してアニメーションさせることができます。
遷移状態(旧・新のビジュアルキャプチャが共存する状態)は疑似要素で表現されるため、
開発者はCSSアニメーションやWebアニメーションなどの使い慣れた機能で
それぞれの遷移をカスタマイズできます。
startViewTransition()
1.3. ビュー遷移のライフサイクル
正常なビュー遷移は、次の段階を経て進行します:
-
開発者が
document.
を呼び出すと、startViewTransition
(updateCallback
)ViewTransition
型のviewTransitionが返されます。 -
現在の状態が「旧」状態としてキャプチャされる。
-
レンダリングが一時停止される。
-
開発者の
updateCallback
関数(指定されていれば)が呼び出され、 ドキュメントの状態が更新される。 -
viewTransition.
が完了する。updateCallbackDone
-
現在の状態が「新」状態としてキャプチャされる。
-
遷移疑似要素が生成される。 この構造の概要は§ 3.2 ビュー遷移疑似要素を参照。
-
レンダリングが再開され、遷移疑似要素が表示される。
-
viewTransition.
が完了する。ready
-
疑似要素がアニメーションし、終了まで続く。
-
遷移疑似要素が削除される。
-
viewTransition.
が完了する。finished
1.4. 拡張機能としての遷移
View Transition API設計の重要な点は、
アニメーション付きの遷移が基盤となるドキュメント状態変化への視覚的拡張であることです。
つまり、設定ミスやデバイス制約などによりビジュアル遷移の生成に失敗しても、
UpdateCallback
の呼び出しは妨げられません。
遷移アニメーションが事前にできないと分かっていても、状態変更のためのコールバックは必ず呼ばれます。
例えば、開発者がビュー遷移のライフサイクルの開始時に
skipTransition()
を呼び出すと、
アニメーション遷移に関する手順(ビュー遷移ツリーの生成など)は実行されません。
しかし、UpdateCallback
は必ず呼ばれます。
スキップされるのはビジュアル遷移のみで、基盤となる状態変更は必ず行われます。
注: DOMの変更自体もスキップしたい場合は、
それには別の機能が必要です。
はそのために利用できる機能例です。
navigateEvent
.signal
View Transition APIは、UpdateCallback
によりDOM変更を非同期化できますが、
API自体はDOM変更のキューイングやスケジューリングの責任は持ちません(遷移自体に必要なスケジューリング以外は)。
非同期DOM変更が同時並行で発生する場合(例:独立したコンポーネント内)もあれば、
キューイングや以前の変更の中止が必要な場合もあります。
これらはアプリケーション全体をより包括的に見渡せるフレームワークや機能に委ねるのが最適です。
1.5. レンダリングモデル
ビュー遷移は、UAが生成する疑似要素を使って、要素のレンダリング状態を複製することで動作します。 要素自身やその子孫に適用されるレンダリングの側面、例えば filter や opacity のような視覚効果、 あるいは overflow や clip-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 : 5 s ; }
これにより、よりゆっくりとした遷移になります:
@keyframes fade-in{ from{ opacity : 0 ; } } @keyframes fade-out{ to{ opacity : 0 ; } } @keyframes slide-from-right{ from{ transform : translateX ( 30 px ); } } @keyframes slide-to-left{ to{ transform : translateX ( -30 px ); } } ::view-transition-old ( root) { animation : 90 ms cubic-bezier ( 0.4 , 0 , 1 , 1 ) both fade-out, 300 ms cubic-bezier ( 0.4 , 0 , 0.2 , 1 ) both slide-to-left; } ::view-transition-new ( root) { animation : 210 ms cubic-bezier ( 0 , 0 , 0.2 , 1 ) 90 ms both fade-in, 300 ms cubic-bezier ( 0.4 , 0 , 0.2 , 1 ) both slide-from-right; }
結果は以下の通りです:
.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 ( 30 px ); } } /* 登場遷移 */ ::view-transition-new ( sidebar) :only-child{ animation : 300 ms cubic-bezier ( 0 , 0 , 0.2 , 1 ) both fade-in, 300 ms cubic-bezier ( 0.4 , 0 , 0.2 , 1 ) both slide-from-right; } /* 退場遷移 */ ::view-transition-old ( sidebar) :only-child{ animation : 150 ms cubic-bezier ( 0.4 , 0 , 1 , 1 ) both fade-out, 300 ms cubic-bezier ( 0.4 , 0 , 0.2 , 1 ) both slide-to-right; }
サイドバーが「古い」状態と「新しい」状態の両方に存在する場合は、デフォルトのアニメーションが適切です。
まず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 ├─ ::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()疑似要素 (この順)を含みます。
3.2.5. ビュー遷移旧状態画像: ::view-transition-old() 疑似要素
::view-transition-old() 疑似要素は、 「旧」状態のビジュアルスナップショットを 置換要素として表現する 空の名前付きビュー遷移疑似要素です。 表現すべき「旧」状態がない場合は省略されます。 各 ::view-transition-old() 疑似要素は、 対応する ::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の場合、スナップショット包含ブロックは 初期包含ブロックに対応します。
スナップショット包含ブロック原点は、 スナップショット包含ブロックの左上隅を指します。
スナップショット包含ブロックサイズは、 スナップショット包含ブロックの幅・高さを 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.25 s ; 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スタイルシートは以下のことを行います:-
::view-transition を スナップショット包含ブロック全体にレイアウトし、 各 :view-transition-group() 子要素がそれに相対してレイアウトできるようにします。
-
ルート要素にデフォルトの view-transition-name を設定し、 独立して選択できるようにします。
-
::view-transition-image-pair() 疑似要素によるレイアウト干渉を減らし、 著者が ::view-transition-old() や ::view-transition-new() をほとんどの場合 ::view-transition-group() の直接の子として扱えるようにします。
-
アニメーションのタイミングをツリー全体で継承させることで、デフォルトでは ::view-transition-group() 上に設定されたアニメーションタイミングが すべての子孫に影響します。
-
::view-transition-old() や ::view-transition-new() のキャプチャ要素を ::view-transition-group() の サイズ・位置に(アスペクト比を崩さない範囲で)合わせてスタイルし、補間時にその間を遷移できるようにします。 これら要素のサイズ指定は論理座標と物理座標のマッピングに依存するため、 動的ビュー遷移スタイルシートがDOM要素から関連スタイルをコピーします。
-
各 ::view-transition-group() に デフォルトで0.25秒のクロスフェードアニメーションを設定します。
追加のスタイルは、ユーザーエージェント起源に ビュー遷移時に 動的ビュー遷移スタイルシート経由で動的に追加されます。
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)
の
メソッド手順は以下の通りです:
-
transition を this の 関連Realm内で新しい
ViewTransition
オブジェクトとして生成する。 -
updateCallback が指定されていれば、transition の update callback を updateCallback に設定する。
-
document を this の 関連グローバルオブジェクトの 関連付けられたドキュメントとする。
-
document の visibility state が "
hidden
" なら、 skip transition ("InvalidStateError
"DOMException
付き)で終了し、transition を返す。 -
document の アクティブなビュー遷移 が null でない場合、 そのビュー遷移をスキップ ("
AbortError
"DOMException
を this の 関連Realmで発生させる)。注: これにより2つの非同期な update callback が同時実行される可能性があり (順序が入れ替わる場合もある): 1つは document の現在の アクティブなビュー遷移用、 もう1つは今回の transition 用。 この機能の設計に従い、開発者が別の機能やフレームワークでこれらDOM変更の正しいスケジューリングを行うことを想定しています。
-
document の アクティブなビュー遷移 を transition に設定する。
注: ビュー遷移の処理は ビュー遷移のセットアップ内で 保留遷移操作の実行を通じて継続します。
-
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
":-
"
pending-capture
" -
"
update-callback-called
" -
"
animating
" -
"
done
"
注: このAPIを使う開発者は通常、各フェーズを意識する必要はありません。フェーズは自動的に進行します。 ただし、各フェーズで何が行われるか(スナップショットの取得、疑似要素DOMの生成など)は重要です。 以下のフェーズ説明は、実装者が仕様準拠の実装を作るために曖昧さのない手順を提供することを目指しています。
-
- update callback
-
UpdateCallback
または null。初期値は null。 - ready promise
-
Promise
。 初期値は 新しいpromise(this の 関連Realm内)。 - update callback done promise
-
Promise
。 初期値は 新しいpromise(this の 関連Realm内)。注: ready promise と update callback done promise は即座に生成されるため、 rejectされると
unhandledrejection
が発生します (getter(updateCallbackDone
など)がアクセスされていなくても)、 handledされない限りです。 - finished promise
-
Promise
。 初期値は 新しいpromise(this の 関連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 されます。この挙動の議論。
finished
のgetter手順は、
this の finished promise を返すこと。
ready
のgetter手順は、
this の ready
promise を返すこと。
updateCallbackDone
のgetter手順は、
this の update callback done promise を返すこと。
6.2.1.
skipTransition()
メソッド手順
skipTransition()
の
メソッド手順は以下の通り:
-
this の phase が "
done
" でなければ、 skip the view transition を this で "AbortError
"DOMException
で行うこと。
7. アルゴリズム
7.1. データ構造
7.1.1. Document
への追加
Document
にはさらに以下が含まれる:
- active view transition
-
ViewTransition
または null。初期値は null。 - rendering suppression for view transitions
-
boolean型。初期値は false。
Document
の rendering suppression for view transitions が true の場合、 すべてのポインターヒットテストは document element をターゲットとし、 他の 要素は無視される。注: これは pointer capture されているポインターには影響しません。
- dynamic view transition style sheet
-
スタイルシート。 初期値は新しい スタイルシートで、 ユーザーエージェント起源に属し、 グローバルビュー遷移ユーザーエージェントスタイルシートの後に順序付けされる。
注: これは遷移に関連する動的スタイルを保持するために使用されます。
- show view transition tree
-
boolean型。初期値は false。
これが true の場合、this の active view transition の transition root pseudo-element が this の document element の子としてレンダリングされ、 this の document element が その originating element となる。
注: transition root pseudo-element の document 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。
注: これらは document の dynamic view transition style sheet から スタイルを更新・削除するために使われます。
7.2. 保留中の遷移操作の実行
保留中の遷移操作の実行は、Document
document に対して以下の手順を実行する:
-
document の active view transition が null でない場合:
-
document の active view transition の phase が "
pending-capture
" なら、 ビュー遷移のセットアップを document の active view transition に対して実行する。 -
それ以外の場合、document の active view transition の phase が "
animating
" なら、 遷移フレームの処理を document の active view transition に対して実行する。
-
7.3. ビュー遷移のセットアップ
ViewTransition
transition に対して行う手順は以下の通り:
注: このアルゴリズムはドキュメントの現在の状態をキャプチャし、
遷移の UpdateCallback
を呼び出し、
その後ドキュメントの新しい状態をキャプチャします。
-
document を transition の 関連グローバルオブジェクト の 関連付けられたドキュメントとする。
-
旧状態のキャプチャ を transition に対して行う。
失敗が返された場合、ビュー遷移のスキップ を transition に対し "
InvalidStateError
"DOMException
を transition の 関連Realm で行い、return。 -
document の ビュー遷移用レンダリング抑制 を true にする。
-
グローバルタスクをキューに追加する。 DOM操作タスクソースで、 transition の 関連グローバルオブジェクト を指定し、以下の手順を実行:
注: 画像のキャプチャ のテクスチャの読み出しは非同期となる場合があるため、ここでタスクをキューしていますが、HTML仕様のレンダーステップでは同期的に扱われます。
ViewTransition
transition に対して行う手順は以下の通り:
-
transition の phase が "
done
" の場合、return。注: これは transition がこの時点で スキップ された場合に発生します。
-
ビュー遷移用レンダリング抑制 を false にする。
-
transition の 初期スナップショット包含ブロックサイズ が スナップショット包含ブロックサイズ と等しくない場合、 ビュー遷移のスキップ を transition に対して行い、return。
-
新状態のキャプチャ を transition に対して行う。
失敗が返された場合、ビュー遷移のスキップ を transition に対し "
InvalidStateError
"DOMException
を transition の 関連Realm で行い、return。 -
resolve transition の update callback done promise を undefined で解決する。
-
各 capturedElement を transition の named elements の 値でイテレート:
-
capturedElement の new element が null でなければ、 capturedElement の new element の ビュー遷移でキャプチャされた を true に設定。
-
-
遷移疑似要素のセットアップ を transition に対して行う。
-
疑似要素スタイルの更新 を transition に対して行う。
失敗が返された場合、ビュー遷移のスキップ を transition に対し "
InvalidStateError
"DOMException
を transition の 関連Realm で行い、return。注: 上記の手順では、スタイル・レイアウト中に計算される情報を得るために、ドキュメントのライフサイクルフェーズの実行が必要となります。
-
transition の phase を "
animating
" に設定。 -
resolve transition の ready promise を解決する。
7.3.1. 旧状態のキャプチャ
ViewTransition
transition に対して行う手順:
-
document を transition の 関連グローバルオブジェクト の 関連付けられたドキュメントとする。
-
namedElements を transition の named elementsとする。
-
usedTransitionNames を新しい セット(string型)とする。
-
captureElements を新しい リスト(要素型)とする。
-
document を transition の 関連グローバルオブジェクト の 関連付けられたドキュメントとする。
-
スナップショット包含ブロックサイズ が 実装依存の最大値を超える場合、失敗を返す。
-
transition の 初期スナップショット包含ブロックサイズ を スナップショット包含ブロックサイズ に設定する。
-
各 element を、要素で connected かつ ノードドキュメントが document であるものを、 描画順でイテレート:
描画順でイテレートすることで、この順序が namedElements にキャッシュされます。 これによりペイントスタックの一番下の要素が ::view-transition の最初の疑似子要素を生成するなど、 ::view-transition-group 疑似要素のDOM順が定義されます。-
element が複数の box fragment を持つ場合、continue。
注: 将来のバージョンでは分断要素の遷移も有効化するかもしれません。 #8900を参照。
注: ここでの box fragment は、 インラインボックスが ラインボックスをまたぐ分断とは異なります。 そのようなインラインも遷移に参加できます。
-
transitionName を element の 算出値(view-transition-name)とする。
-
usedTransitionNames が transitionNameを含む場合、失敗を返す。
-
transitionNameを追加 (usedTransitionNamesに)。
-
element の ビュー遷移でキャプチャされた を true に設定。
-
elementを追加 (captureElementsに)。
このアルゴリズムは別のループで続行され、 ビュー遷移でキャプチャされた が すべての参加要素に設定された後、後続ステップで読まれるためです。 -
各 element を captureElements でイテレート:
-
capture を新しい キャプチャされた要素構造体とする。
-
originalRect を element が document element なら スナップショット包含ブロック、それ以外なら border box とする。
-
capture の old height を originalRect の
height
で設定。 -
capture の old transform を <transform-function> で設定(element の border box を スナップショット包含ブロック原点 から現在の視覚位置までマッピングするもの)。
-
capture の old writing-mode を 算出値(writing-mode)で設定。
-
capture の old direction を 算出値(direction)で設定。
-
capture の old text-orientation を 算出値(text-orientation)で設定。
-
capture の old mix-blend-mode を 算出値(mix-blend-mode)で設定。
-
capture の old backdrop-filter を 算出値(backdrop-filter)で設定。
-
capture の old color-scheme を 算出値(color-scheme)で設定。
-
transitionName を element の 算出値(view-transition-name)とする。
-
namedElements[transitionName] に capture を設定。
-
-
各 element を captureElements でイテレート:
-
element の ビュー遷移でキャプチャされた を false に設定。
-
7.3.2. 新状態のキャプチャ
ViewTransition
transition に対して行う手順:
-
document を transition の 関連グローバルオブジェクト の 関連付けられたドキュメントとする。
-
namedElements を transition の named elementsとする。
-
usedTransitionNames を新しい セット(string型)とする。
-
各 element を、要素で connected かつ ノードドキュメントが document であるものを、 描画順でイテレート:
-
transitionName を element の 算出値(view-transition-name)とする。
-
usedTransitionNames が transitionNameを含む場合、失敗を返す。
-
transitionNameを追加 (usedTransitionNamesに)。
-
namedElements[transitionName] が 存在しない場合、 namedElements[transitionName] に新しい キャプチャされた要素構造体を設定。
注: この構造体は意図的にこの順序付きmapの末尾に追加されます。 新DOMにのみ存在する名前(エントリーアニメーション)は旧DOMのみの名前(退場アニメーション)や両DOMに存在する名前(ペアアニメーション)より上に描画されます。 このレイヤリングがすべての場合に正しいとは限りません。issue 8941参照。
-
namedElements[transitionName] の new element に element を設定。
7.3.3. 遷移疑似要素のセットアップ
ViewTransition
transition に対して行う手順:
注: このアルゴリズムは遷移用疑似要素ツリーを構築し、 初期スタイルを生成します。 疑似ツリーの構造は § 3.2 ビュー遷移疑似要素で説明されています。
-
document を this の 関連グローバルオブジェクト の 関連付けられたドキュメントとする。
-
document の show view transition tree を true に設定。
-
各 transitionName → capturedElement を transition の named elements でイテレート:
-
group を新しい ::view-transition-group() とし、 ビュー遷移名を transitionName に設定。
-
group を transition の transition root pseudo-element に追加。
-
imagePair を新しい ::view-transition-image-pair() とし、 ビュー遷移名を transitionName に設定。
-
imagePair を group に追加。
-
capturedElement の old image が null でなければ:
-
old を新しい ::view-transition-old() とし、 ビュー遷移名を transitionName に設定、 capturedElement の old image を 置換内容として表示。
-
old を imagePair に追加。
-
-
capturedElement の new element が null でなければ:
-
new を新しい ::view-transition-new() とし、 ビュー遷移名を transitionName に設定。
注: この疑似要素のスタイリングは 疑似要素スタイルの更新で扱います。
-
new を imagePair に追加。
-
-
capturedElement の old image が null の場合:
-
Assert: capturedElement の new element は null ではない。
-
capturedElement の image animation name rule を新しい
CSSStyleRule
(以下のCSSを表現)とし、 document の dynamic view transition style sheet に追加::root:
:view-transition-new ( transitionName) { animation-name : -ua-view-transition-fade-in; } 注: 上記コード例は変数を置換する必要があります。
-
-
capturedElement の new element が null の場合:
-
capturedElement の image animation name rule を新しい
CSSStyleRule
(以下のCSSを表現)とし、 document の dynamic view transition style sheet に追加::root:
:view-transition-old ( transitionName) { animation-name : -ua-view-transition-fade-out; } 注: 上記コード例は変数を置換する必要があります。
-
capturedElement の old image と new element が両方 null でない場合:
-
transform を capturedElement の old transform とする。
-
width を capturedElement の old width とする。
-
height を capturedElement の old height とする。
-
backdropFilter を capturedElement の old backdrop-filter とする。
-
capturedElement の group keyframes を新しい
CSSKeyframesRule
(以下のCSSを表現)とし、 document の dynamic view transition style sheet に追加:@keyframes -ua-view-transition-group-anim-transitionName{ from{ transform : transform; width : width; height : height; backdrop-filter : backdropFilter; } } 注: 上記コード例は変数を置換する必要があります。
-
capturedElement の group animation name rule を新しい
CSSStyleRule
(以下のCSSを表現)とし、 document の dynamic view transition style sheet に追加::root:
:view-transition-group ( transitionName) { animation-name : -ua-view-transition-group-anim-transitionName; } 注: 上記コード例は変数を置換する必要があります。
-
capturedElement の image pair isolation rule を新しい
CSSStyleRule
(以下のCSSを表現)とし、 document の dynamic view transition style sheet に追加::root:
:view-transition-image-pair ( transitionName) { isolation : isolate; } 注: 上記コード例は変数を置換する必要があります。
-
capturedElement の image animation name rule を新しい
CSSStyleRule
(以下のCSSを表現)とし、 document の dynamic 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 の呼び出し
ViewTransition
transition に対して行う手順:
注: これはすべての ViewTransition
に対し必ず発生します。遷移が skip された場合も同様です。
この理由は § 1.4 拡張機能としての遷移で説明されています。
-
Assert: transition の phase が "
done
" または "update-callback-called
" 前であること。 -
callbackPromise を null とする。
-
transition の update callback が null なら、 callbackPromise を undefinedで解決されたpromise(transition の 関連Realm内)に設定。
-
それ以外の場合、callbackPromise を update callbackの呼び出しの結果に設定。
-
transition の phase が "
done
" でなければ、phase を "update-callback-called
" に設定。 -
fulfillSteps を以下の手順とする:
-
activate view transition を transition に対して行う。
-
resolve transition の update callback done promise を undefined で解決。
注: 前手順で既にpromiseを解決している場合はno-opです。
-
-
rejectSteps を reasonを引数に以下の手順とする:
-
reject transition の update callback done promise を reason でreject。
-
transition の phase が "
done
" なら return。注: これは transition がこの時点で skip された場合に発生します。
-
handledとしてマーク transition の ready promise。
注: transition の update callback done promise が
unhandledrejection
を提供します。この手順は重複を避けるものです。 -
skip the view transition を transition に reason で行う。
-
-
callbackPromiseをsettle時に fulfillSteps と rejectSteps を実行。
-
ユーザーエージェントがタイムアウト後に遷移をスキップする場合、以下の手順を 並列で実行する:
-
実装依存の duration だけ待つ。
-
グローバルタスクをキュー(DOM操作タスクソースで)、transition の 関連グローバルオブジェクト指定、以下の手順実行:
-
transition の phase が "
done
" なら return。注: これは transition がこの時点で skip された場合に発生します。
-
skip transition を "
TimeoutError
"DOMException
で行う。
-
-
7.5. ビュー遷移をスキップする
ViewTransition
transition に対して reason を用いて行う手順:
-
document を transition の 関連グローバルオブジェクト の 関連付けられたドキュメントとする。
-
transition の phase が "
update-callback-called
"より前なら、 グローバルタスクをキューする(DOM操作タスクソースで、 transition の 関連グローバルオブジェクト指定)し、 update callback の呼び出しを transition に対して行う。 -
ビュー遷移用レンダリング抑制 を false に設定。
-
document の active view transition が transition なら、 ビュー遷移のクリア を transition に対して行う。
-
transition の phase を "
done
" に設定。 -
reject transition の ready promise を reason でreject。
注: ready promise は、 この時点で既に解決済みである場合もある(
skipTransition()
がアニメーション開始後に呼ばれた場合)。 その場合、このステップは no-op です。 -
resolve transition の finished promise を、 update callback done promise の settle時に反応した結果で解決:
-
promiseがfulfilledなら undefined を返す。
注: transition の update callback done promise のrejectは明示的にここで処理されないため、 transition の update callback done promise がrejectされた場合、 transition の finished promise も同じ理由でrejectされる。
-
7.6. ビュー遷移のページ可視性変更手順
Document
document に対して次の通り:
-
document の visibility state が "
hidden
" なら:-
document の active view transition が null でなければ、 skip document の active view transition を "
InvalidStateError
"DOMException
でスキップする。
-
-
それ以外の場合、assert: active view transition は null であること。
注: これはHTML仕様から呼ばれます。
7.7. 画像のキャプチャ
-
element が document element なら:
-
ドキュメント領域 (canvas background や トップレイヤーの内容を含む) が スナップショット包含ブロックと交差する部分を、 スナップショット包含ブロックと同じサイズの透明なキャンバス上にレンダリングする。 キャプチャレンダリング特性および以下の特性に従う:
-
element の スクロールボックス の外側領域は、 レイアウトビューポートを移動・サイズ変更せずに、スクロールされたかのようにレンダリングされるべき。 これはスクロールやリサイズ関連のイベント(
IntersectionObserver
など)を発火してはならない。ユーザーが見ているものとキャプチャスナップショットの例。 この例ではルートだけがtransition nameを持つと仮定。 -
スクロール不可能な領域(スクロール範囲外)は canvas background をレンダリングするべき。
ユーザーが見ているものとキャプチャスナップショットの例。 この例ではルートだけがtransition nameを持つと仮定。
-
-
このキャンバスを画像として返す。 画像の自然サイズは スナップショット包含ブロックと同じ。
-
-
それ以外の場合:
-
element およびその 子孫 を、 ノードドキュメントで表示されるのと同じサイズで、 無限透明キャンバス上にレンダリングする。 キャプチャレンダリング特性に従う。
-
このキャンバスのうち、element の ink overflow rectangle を含む部分を画像として返す。 この画像の自然寸法は、その principal border boxと同じで、 原点もその border box の原点に対応する。 画像はこの border box の内容と、キャプチャされた ink overflow がその外側に表現される。
注: この画像を 置換要素として自然サイズでレンダリングすると、 要素の principal box のサイズと内容が表示され、 キャプチャされた ink overflow は content boxの外に溢れる。
-
7.7.1. キャプチャレンダリング特性
-
参照要素またはその祖先にtransformが適用されている場合、そのtransformは無視する。
注: このtransformは、関連する ::view-transition-group 疑似要素の
transform
プロパティでスナップショットに適用される。 -
要素およびその子孫に適用された opacity や filter などの効果はキャプチャに適用される。 祖先から要素に適用された効果は無視される。
-
ink overflow rectangle が 実装依存の最大値を超える場合、実装は描画内容をクリップしてもよい。 ただし、キャプチャ画像には少なくとも element の スナップショット包含ブロックと交差する内容は含めるべき。 実装は、ink overflow area が大きくviewにtransformされる要素について、ラスタ品質を調整してもよい。
-
各 descendant を shadow-including descendant
Element
および 疑似要素(elementの)について、 descendant が ビュー遷移でキャプチャされたなら、その描画をスキップする。注: この理由は、子孫自身が独立してスナップショットを生成し、個別にアニメーションされるため。
7.8. 遷移フレームの処理
ViewTransition
transition に対して行う手順:
-
document を transition の 関連グローバルオブジェクト の 関連付けられたドキュメントとする。
-
hasActiveAnimations を boolean型(初期値 false)とする。
-
各 element を transition の transition root pseudo-element の inclusive descendants でイテレート:
-
各 animation(timeline が document timelineで documentに関連し、 少なくとも1つ associated effect の effect target が elementであるもの)について、 以下いずれかがtrueなら hasActiveAnimations を true にする:
-
animation の play state が paused または running。
-
document の pending animation event queue に animation に関連するイベントがある。
-
-
-
hasActiveAnimations が false の場合:
-
transition の phase を "
done
" に設定。 -
ビュー遷移のクリア を transition に対して実行。
-
resolve transition の finished promise。
-
return。
-
-
transition の 初期スナップショット包含ブロックサイズ が スナップショット包含ブロックサイズと等しくない場合、 ビュー遷移のスキップ を transition に対して実行し、return。
-
疑似要素スタイルの更新 を transition に対して実行。
失敗が返された場合、ビュー遷移のスキップ を transition に対し "
InvalidStateError
"DOMException
を transition の 関連Realm で行い、return。注: 上記は、要素のサイズや位置が変化した場合に新しいキーフレームが生成されることを意味します。 このため、視覚的なジャンプが発生する場合があります。 より滑らかなリターゲットも可能ですが、複雑さに見合うユースケースがまだありません。 詳細は issue 7813 を参照。
7.9. 疑似要素スタイルの更新
ViewTransition
transition に対して行う手順:
-
各 transitionName → capturedElement を transition の named elements でイテレート:
-
width, height, transform, writingMode, direction, textOrientation, mixBlendMode, backdropFilter, colorScheme を null で初期化。
-
capturedElement の new element が null の場合:
-
width を capturedElement の old width で設定。
-
height を capturedElement の old height で設定。
-
transform を capturedElement の old transform で設定。
-
writingMode を capturedElement の old writing-mode で設定。
-
direction を capturedElement の old direction で設定。
-
textOrientation を capturedElement の old text-orientation で設定。
-
mixBlendMode を capturedElement の old mix-blend-mode で設定。
-
backdropFilter を capturedElement の old backdrop-filter で設定。
-
colorScheme を capturedElement の old color-scheme で設定。
-
-
それ以外の場合:
-
以下いずれかがtrueなら失敗を返す:
-
capturedElement の new element の flat tree の祖先が 内容をスキップしている。
-
capturedElement の new element が 非レンダリング。
-
capturedElement が複数の box fragment を持つ。
注: その他のレンダリング制約は capturedElement の new element が ビュー遷移でキャプチャされたであることで強制される。
-
-
width を capturedElement の new element の border box の現時点の幅で設定。
-
height を capturedElement の new element の border box の現時点の高さで設定。
-
transform を capturedElement の new element の border box を スナップショット包含ブロック原点 から現在の視覚位置にマッピングするtransformで設定。
-
writingMode を 算出値(writing-mode、capturedElement の new element)で設定。
-
direction を 算出値(direction、capturedElement の new element)で設定。
-
textOrientation を 算出値(text-orientation、capturedElement の new element)で設定。
-
mixBlendMode を 算出値(mix-blend-mode、capturedElement の new element)で設定。
-
backdropFilter を 算出値(backdrop-filter、capturedElement の new element)で設定。
-
colorScheme を 算出値(color-scheme、capturedElement の new element)で設定。
-
-
capturedElement の group 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; } 注: 上記コード例は変数を置換する必要があります。
-
capturedElement の new element が null でなければ:
-
new を ::view-transition-new()(ビュー遷移名は transitionName)とする。
-
new の 置換要素内容に、画像のキャプチャ(capturedElement の new element)の結果を設定。
-
-
このアルゴリズムは、Web APIからその効果が観測できる場合、ユーザーエージェント起源でスタイルを更新するために必ず実行されなければならない。
注:
例えば、window.getComputedStyle(document.documentElement, "::view-transition")
のようなWeb APIが該当する。
7.10. ビュー遷移のクリア
ViewTransition
transition に対して行う手順:
-
document を transition の 関連グローバルオブジェクト の 関連付けられたドキュメントとする。
-
Assert: document の active view transition が transition であること。
-
各 capturedElement を transition の named elements の 値でイテレート:
-
capturedElement の new element が null でない場合、 new element の ビュー遷移でキャプチャされた を false に設定。
-
各 style を capturedElement の スタイル定義でイテレート:
-
style が null でなく、かつ style が document の dynamic view transition style sheet に含まれている場合、 style を document の dynamic view transition style sheet から削除する。
-
-
-
document の show view transition tree を false に設定。
-
document の active view transition を null に設定。
プライバシーに関する考慮事項
この仕様は新たなプライバシー考慮事項を導入しません。
セキュリティに関する考慮事項
画像のキャプチャアルゴリズムによって生成される画像は(ドキュメントがクロスオリジンリソースを埋め込んでいる場合)クロスオリジンデータや閲覧履歴等の機密情報を含む可能性があります。 実装はこのデータがドキュメントからアクセスできないように保証しなければなりません。 このデータへのアクセスは、通常のドキュメント描画でも既に防止されているはずなので、対応は容易です。
付録A. 変更点
この付録は参考情報です。
2022-05-30 ワーキングドラフトからの変更
-
クロスフェード時にplus-lighterブレンドを追加するためキーフレームを使用。issue 8924参照。
-
mix-blend-modeプロパティを::view-transition-groupにコピーするプロパティ一覧に追加。issue 8962参照。
-
text-orientationプロパティを::view-transition-groupにコピーするプロパティ一覧に追加。issue 8230参照。
-
古いキャプチャアルゴリズムをリファクタし、値を読み取る前にビュー遷移でキャプチャされたを正しく設定するように。
-
startViewTransition()
パラメータをnull不可に変更。issue 9460参照。 -
ビュー遷移に参加する要素をアクセシビリティツリーに公開。issue 9365参照。
-
ビュー遷移ツリーをアクセシビリティツリーに公開しない。issue 9365参照。
-
back-drop filterプロパティのアニメーションをtransform/size同様に追加。issue 9358参照。
-
DOM要素から::view-transition-group()にcolor-schemeをコピー。issue 9276参照。
-
ドキュメントが非表示状態になる場合にアウトバウンドクロスドキュメント遷移とプログラム的ビュー遷移を順序付きで扱えるよう、自動スキップビュー遷移を公開。issue 9512参照。
-
view-transition-nameをアニメーション可能にすべき理由を説明するノートを追加。
-
view-transition-name: auto
を無効値とするべき。issue 9639参照。 -
エントリーアニメーションのペイント順説明用ノート追加。issue 9672参照。
-
named elements のクリーンアップ方法説明用ノート追加。issue 9669参照。
-
アルゴリズムをリファクタし、特に`updateCallbackDone`のタイミングを明確化。issue 9762参照。
-
(::view-transition)-image-pair, -old, -new用UAスタイルシートルールにanimation-delay inheritを追加。issue 9817参照。
-
ドキュメントが非表示状態のときにアニメーションを自動スキップ。issue 9543参照。
-
クロスドキュメントビュー遷移への参照を削除し、L1仕様をシンプル化。Issue 9886参照。
-
ページ非表示時にアクティブな遷移をスキップするアルゴリズムを公開。issue 9543参照。
2022-05-25 ワーキングドラフトからの変更
-
::view-transition-newユーザーエージェントスタイルシートのタイポ修正。PR参照。
2022-11-24 ワーキングドラフトからの変更
-
レンダリング抑制時にpointer eventsがdocumentElementに解決されるように。issue 7797参照。
-
ビュー遷移参加要素のレンダリング制約追加。issue 8139とissue 7882参照。
-
SVG Document上でもViewTransitionsをサポートするためUAスタイルシートからhtml固有記述を削除。
-
updateDOMCallbackを
UpdateCallback
にリネーム。issue 8144参照。 -
snapshot viewportをスナップショット包含ブロックにリネーム。
-
ビューポートサイズが変化した場合に遷移をスキップ。issue 8045参照。
-
:only-childサポート追加。issue 8057参照。
-
pseudo-element rootの下に疑似要素ツリーの概念追加。issue 8113参照。
-
遷移スキップ時、
UpdateCallback
を同期ではなく自身のタスクで呼び出すように。issue 7904参照。 -
画像キャプチャ時は少なくともビューポート内の画像部分をキャプチャすべき。必要に応じてダウンスケール。issue 8561参照。
-
キャプチャ画像へのink overflowの適用は実装定義とし、画像の自然サイズには影響しない。issue 8597参照。
-
分断要素はビュー遷移に参加しない。issue 8339参照。
-
"snapshot root"を"snapshot containing block"にリネームし、子孫のための絶対位置付け包含ブロックおよび固定位置付け包含ブロックとする。issue 8505参照。
2022-10-25 ワーキングドラフト (FPWD)からの変更
-
dynamic view transition style sheetコンセプト追加。ドキュメントごとに動的生成されるUAスタイルを管理。
-
snapshot viewportコンセプト追加。issue 7859参照。
-
遷移スキップ時のpromise解決/拒否タイミング明確化。issue 7956参照。
-
content-visibility:auto要素で内容をスキップする場合、その下の要素は無視。issue 7874参照。
-
UAスタイルと著者DOMの同期を保ち、開発者APIから観測可能に。issue 7812参照。
-
updateCallback中のレンダリング抑制追加。issue 7784参照。
-
新ドキュメント内要素のサイズ・位置変更時に新しいUAアニメーションキーフレーム生成。issue 7813参照。
-
キーフレームを-UA-プレフィックス付きでUAスタイルシートに限定。issue 7560参照。
-
疑似要素名をview-transition*に更新。issue 7960参照。
-
疑似要素のセレクタ構文を更新。issue 7788参照。
-
セキュリティ・プライバシー考慮事項のセクション追加。