View Transitions API による基本のクロスフェード
DOM 操作を document.startViewTransition() でラップするだけで、ブラウザが変更前後の状態を自動でクロスフェード。@keyframes は不要。
Basics
詳細な説明
デフォルトのエフェクト:クロスフェード
document.startViewTransition(callback) を呼んでカスタムアニメーションを指定しない場合、ブラウザは取得した変更前と変更後のスナップショット間で 300ms のクロスフェード を実行します。これは最も低コストかつ汎用的なエフェクトで、view-transition-name で個別要素をオプトインしなくてもどんな DOM 変更でも動作します。
function update() {
document.body.classList.toggle('dark');
}
if (document.startViewTransition) {
document.startViewTransition(update);
} else {
update();
}
タイミングの調整
デフォルトの 300ms を上書きするには、ブラウザが自動生成する2つの擬似要素をターゲットにします:
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 500ms;
animation-timing-function: ease-in-out;
}
root 引数は、ブラウザが暗黙的に作る ルートスナップショットグループ を指します。view-transition-name を持たないすべての要素はこのグループに入り、ドキュメントレベルでクロスフェードします。
opacity トランジションより優れている理由
素朴な transition: opacity 300ms は要素を1つずつしかアニメーションできず、レイアウトに影響する変更(ノード追加、幅変更、テンプレート差し替え)では破綻します。View Transitions API は 可視ビューポート全体 をラスタースナップショットとして取得するため、リフローが激しい変更でもレイアウトエンジンを酷使せずにスムーズにアニメーションします。
ユースケース
テーマ切替、コンテンツ差し替え、検索結果の再描画など、要素ごとのオプトインなしで洗練されたクロスフェードを得たいステート変更全般。事前にどのノードが変わるか分からない動的コンテンツに特に有効。