👆

Angular 17 の View Transitions API 対応で遊んでみた

2023/12/05に公開

この記事は Angular Advent Calender 2023 の5日目の記事です。

前から View Transitions API が気になっていたのですが、先日リリースされた Angular 17 に実験的対応が入ったと聞いて、いい機会だと思って遊んでみたという話です。

View Transitions API について

View Transitions API は、画面遷移をなめらかにできる API です。Chrome では今年(2023年)の5月にリリースされたバージョン 111 から対応しています。Firefox や Safari は現時点で非対応です。

疑似要素や Promise など深い話もあるのですが、ざっくり説明すると、画面遷移前と遷移後で CSS プロパティ view-transition-name が同じ値を持った要素があれば、それらがなめらかにアニメーションするという API です。詳しくは MDN の ビュートランジション API を見てください。

Angular での対応については Introducing Angular v17 の下の方にちょこっと出てくる "Experimental view transitions support" で触れられています。

デモ

写真の一覧ページと詳細ページの間でアニメーションするシンプルなデモを作りました。

このように、一覧ページと詳細ページを行き来するときに、写真とフッターをいい感じにアニメーションさせることができます。

ソースコードは StackBlitz と GitHub に置いてあります。StackBlitz はここで見ると狭くて見づらいですが、左下の「Edit on ⚡StackBlitz」から見ると見やすいです。

https://github.com/rch850/angular-sandbox-2/tree/main/angular-17-view-transition

Angular で View Transitions API を有効化する

Angular で View Transitions API を有効化する方法はとても簡単です。

冒頭で紹介した公式ブログにもある通り、 provideRouterwithViewTransitions() を追加するだけです。

export const appConfig: ApplicationConfig = {
  providers: [provideRouter(routes, withViewTransitions())],
};

これだけで、画面間の遷移でクロスフェードするようになります。これは View Transitions API のデフォルトの挙動です。

デモでは、よりなめらかに見せるために少し工夫をしています。それについて次の項目で説明します。

view-transition-name の付け方

最初に書いたとおり、画面遷移の前後の画面で CSS プロパティ view-transition-name の値が同じなら、アニメーションの対象となります。このデモでは一覧ページと詳細ページで次のように view-transition-name の値を設定しています。

フッターにつけている view-transition-name: footer は、とてもシンプルなものです。これをつけることで、画面遷移したときにスッと移動してくれます。

photo-id-*

各写真の img 要素につけている view-transition-name: photo-id-* は、要素ごとに異なる値としています。なぜ異なる値にしているかというと、値が重複しているとブラウザで "Unexpected duplicate view-transition-name" というエラーが出てしまい、うまくアニメーションしてくれないためです。

それを回避するために、写真の ID を使って view-transition-name の値がユニークになるようにしています。ハマりがちなポイントなので注意しましょう。

うまく設定できると、画面遷移中に要素が移動するだけでなく、拡縮までしてくれます。

まとめ

Angular 17 で、とても簡単に View Transitions API で遊ぶことができました!うまく使ってユーザー体験を向上させたいなと思います。

明日は @kozy4324 さんです。よろしくお願いします!

Discussion