ネイティブアプリでは当たり前の「滑らかなページ遷移」。これまでWebでは、SPAフレームワークや複雑なJavaScriptが必要でした。
しかし View Transitions API の登場により、CSSベースのエレガントなページ遷移がネイティブでサポートされるようになりました。
View Transitions APIとは
ページ間(または同一ページ内のDOM変更時)に、ブラウザが自動的に「古い状態」と「新しい状態」のスナップショットを撮り、その間をアニメーションで補間する仕組みです。
基本:同一ページ内の遷移
まずは同一ページ内でのDOM変更にフェードイン/フェードアウトを適用する基本パターン。下のデモでリスト項目をクリックすると、詳細ページにフェード遷移します。
Demo App
🎨 デザイン制作
💻 Web開発
📊 運用・改善
HTML
<div class="vt-wrap">
<div class="vt-header">
<span>Demo App</span>
<button class="vt-back" id="vt-back" onclick="vtBack()">← 戻る</button>
</div>
<div class="vt-page" id="vt-list">
<div class="vt-list-item" onclick="vtNavigate('🎨 デザイン制作','ブランドの世界観を形にする、オリジナルのWebデザインを制作します。')">🎨 デザイン制作</div>
<div class="vt-list-item" onclick="vtNavigate('💻 Web開発','モダンな技術でパフォーマンスの高いサイトを構築します。')">💻 Web開発</div>
<div class="vt-list-item" onclick="vtNavigate('📊 運用・改善','公開後のデータ分析と継続的な改善をサポートします。')">📊 運用・改善</div>
</div>
<div class="vt-detail" id="vt-detail">
<p class="vt-detail__title" id="vt-detail-title"></p>
<p class="vt-detail__text" id="vt-detail-text"></p>
</div>
</div>
JavaScript
// View Transitions APIを使ったDOM切り替え
function navigate(newContent) {
if (!document.startViewTransition) {
// 非対応ブラウザ:即座に切り替え
updateDOM(newContent);
return;
}
// 対応ブラウザ:フェード遷移付きで切り替え
document.startViewTransition(() => {
updateDOM(newContent);
});
}
CSSでアニメーションをカスタマイズ
デフォルトのフェードでは物足りない場合、CSSで遷移アニメーションを自由にカスタマイズできます。
CSS
/* ===== ベースのレイアウト(デザインに合わせて調整してください) ===== */
.vt-detail__text {
/* 本体のスタイル */
}
.vt-header {
/* 本体のスタイル */
}
.vt-detail {
/* 本体のスタイル */
}
.vt-list-item {
/* 本体のスタイル */
}
.vt-page {
/* 本体のスタイル */
}
.vt-back {
/* 本体のスタイル */
}
.vt-wrap {
/* 本体のスタイル */
}
.vt-detail__title {
/* 本体のスタイル */
}
/* ===== 動作のアニメーション ===== */
/* デフォルトのフェード遷移をカスタマイズ */
::view-transition-old(root) {
animation: fade-out 0.3s ease;
}
::view-transition-new(root) {
animation: fade-in 0.3s ease;
}
@keyframes fade-out {
from { opacity: 1; transform: scale(1); }
to { opacity: 0; transform: scale(0.95); }
}
@keyframes fade-in {
from { opacity: 0; transform: scale(1.05); }
to { opacity: 1; transform: scale(1); }
}
MPA(マルチページアプリ)での使い方
Chrome 126+では、通常のページ遷移(リンククリック)にもView Transitionsを適用できます。CSSとmeta要素を追加するだけです。
HTML
<!-- head内に追加するだけ --> <meta name="view-transition" content="same-origin">
CSS
/* スライド遷移 */
@view-transition {
navigation: auto;
}
::view-transition-old(root) {
animation: slide-out 0.3s ease;
}
::view-transition-new(root) {
animation: slide-in 0.3s ease;
}
@keyframes slide-out {
to { transform: translateX(-100%); opacity: 0; }
}
@keyframes slide-in {
from { transform: translateX(100%); opacity: 0; }
}
💡 ポイント:特定の要素だけをアニメーションさせたい場合は、その要素に
view-transition-name をつけます。例えば、ヘッダーは固定のまま、コンテンツ部分だけスライドさせることができます。
まとめ
- document.startViewTransition() → SPA内のDOM変更にフェード遷移
- ::view-transition-old / new → CSSでアニメーションをカスタマイズ
- meta要素 → MPAでもページ遷移アニメーション
- view-transition-name → 要素ごとの個別アニメーション
💡 ツタワルの制作では:View Transitions APIなどの最新Web標準を積極的に活用し、ネイティブアプリに匹敵するユーザー体験をWebで実現しています。