2つのビュー間での共通要素トランジション

同じ要素をステート変更を跨いでモーフィングする「カード→詳細」トランジション。一致する view-transition-name 値で実現される定番パターン。

Shared Elements

詳細な説明

共通要素モーフの仕組み

変更前後のスナップショットで 異なる DOM 要素 が同じ view-transition-name を共有していると、ブラウザが位置・サイズ・コンテンツを自動で補間します。これが View Transitions API のキラー機能です。

<!-- リストビュー -->
<a href="#detail" class="card" style="view-transition-name: hero">
  <img src="thumb.jpg" />
</a>

<!-- 詳細ビュー -->
<div class="hero" style="view-transition-name: hero">
  <img src="full.jpg" />
</div>

document.startViewTransition(() => switchToDetailView()) を呼ぶと、ブラウザは hero が両スナップショットに存在することを認識し、両方のバウンディングボックスをキャプチャしてその間をアニメーションします。<img> のソース URL が異なる場合はコンテンツのクロスフェードも含まれます。

アイテムごとに固有の名前を生成

リストでは全アイテムに view-transition-name: card を再利用できません。スナップショット内で名前は一意でなければならないからです。動的に生成します:

.card {
  view-transition-name: var(--card-name);
}
<div class="card" style="--card-name: card-42">...</div>

レイヤートランジション:hero + コンテナ

共通要素モーフと周辺のクロスフェードを組み合わせられます。hero に名前を付け、ページの残りをルートグループ経由でクロスフェードさせれば、ブラウザが両方を1回の協調トランジションで指揮します。

パフォーマンス予算

各 named 要素はスナップショットグループを作り、メモリと別個のコンポジターレイヤーを消費します。中位機種のモバイルでもスムーズに動かすには、トランジションあたりの named 要素を 20個未満 に抑えてください。

ユースケース

Pinterest 風のグリッド→詳細ナビゲーション、ライトボックスへ展開する写真ギャラリー、商品詳細ページへ拡大する EC のカード、Now Playing ビューへアニメーションするプレイリストトラックなど。

試してみるView Transitions API ジェネレーター

フルツールを開く