左右スライドのページトランジション

デフォルトのクロスフェードを水平スライドに置き換え、新しいビューが右から入り、古いビューが左へ抜ける。前進ナビゲーションに最適。

Basics

詳細な説明

スライドトランジションの構造

スライドトランジションは、スナップショット擬似要素に対する2つの協調アニメーションです。old スナップショットが外へ移動し、new スナップショットが反対側から入ってきます。

.page {
  view-transition-name: page;
}
@keyframes slide-out-left {
  to { transform: translateX(-30%); opacity: 0; }
}
@keyframes slide-in-right {
  from { transform: translateX(30%); opacity: 0; }
}
::view-transition-old(page) {
  animation: 400ms ease-out both slide-out-left;
}
::view-transition-new(page) {
  animation: 400ms ease-out both slide-in-right;
}

なぜ 100% ではなく 30% に動かすのか

完全に画面外(100%)まで動かすと、iOS/Android のネイティブナビゲーションと競合する硬い「カード差し替え」感が出ます。±30% までの部分的な translate に opacity フェードを組み合わせることで、より柔らかいトランジションになり、Vercel ダッシュボードや Linear のイシューナビゲーションのようなモダンWebアプリに近い手触りになります。

戻るナビゲーションでの方向反転

戻るボタンでは反対方向にスライドさせたいでしょう。ルーター側のナビゲーション方向をトラッキングし、条件に応じて別アニメーションを適用します:

const direction = back ? 'back' : 'forward';
document.documentElement.dataset.navDirection = direction;
[data-nav-direction="back"] ::view-transition-old(page) {
  animation-name: slide-out-right;
}

このパターンは CSS を宣言的に保ち、ロジック(方向)はデータ属性1つに集約します。

ユースケース

マルチステップフォームウィザード、ページネーションコンテンツ、画像カルーセル、forward/back のセマンティクスが明確な SPA ルートトランジション。History API と組み合わせてナビゲーション方向を導出すると特に強力。

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

フルツールを開く