View Transition APIを使用してSPIRALのフォームでスムーズなページ遷移をする方法をご紹介します。
View Transition APIとは
View Transition APIはLPのような単一ページアプリケーションにおけるDOM状態変化やSPIRALのような複数ページアプリケーションにおける画面遷移時のアニメーションを実装することができるAPIです。
従来のページ内に記述するkeyframeアニメーションとは異なり遷移前と遷移後の2つのDOMのスナップショットを撮りその間を滑らかにアニメーションさせるため、ページ間の視覚的な連続性を生み出すことが可能です。
以下にデモサイトを用意いたしましたので入力ページから確認ボタン押下→確認ページから戻る、という動作をしてアニメーションを確認してみてください。
デモサイト
この動作はJavaScriptを記述することなくCSSのみで実現することが可能です。
注意点
View Transition
APIはChromeやEdge、Safariといったモダンなブラウザではほぼサポートされているものの一部のブラウザやスマートフォン等ではサポートされておらず理想通りの挙動をしない可能性があります。
ご承知おきください。
基本の実装
デモサイトのようにページ遷移時に遷移元のページがなだらかに消えて遷移先のページが下から出てくるようなアニメーションをする場合、記述すべきCSSは数行で済みます。
今回は設定デザインに適用する方法をご紹介します。
手順1:設定デザインのダウンロード
styleタグの一番上に当たる下記記述の上にCSSを追加していきます。
#SMP_STYLE .body {
margin: 0;
padding: 0;
background: #F4F4F4;
font-size: 13px;
*font-size: small;
*font: x-small;
font-family: "メイリオ", "Meiryo", "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "MS Pゴシック", "MS PGothic", Sans-Serif;
}
#SMP_STYLE .body_tbl {
width: 900px;
margin: 0 auto;
padding-bottom: 30px;
border: 1px solid #999999;
background: #FFFFFF;
}
手順2:View Transition APIを使用するための記述
このコードは同一オリジン内でのページ遷移が発生した際に自動的にView Transitionを開始するために必須の記述です。
<meta name="view-transition" content="same-origin">
このコードも必須の記述です。
@view-transition {
navigation:auto;
}
#SMP_STYLE .body {
margin: 0;
padding: 0;
background: #F4F4F4;
font-size: 13px;
*font-size: small;
*font: x-small;
font-family: "メイリオ", "Meiryo", "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "MS Pゴシック", "MS PGothic", Sans-Serif;
}
#SMP_STYLE .body_tbl {
width: 900px;
margin: 0 auto;
padding-bottom: 30px;
border: 1px solid #999999;
background: #FFFFFF;
}
手順3:アニメーションの定義
擬似要素
::view-transition-old()は遷移元のページのスクリーンショットであり、
::view-transition-old(root)と宣言することでデフォルトでUAスタイルシートに指定されている
:root{view-transition-name:root;}に対してアニメーションを指定することができます。後述しますが他のセレクタやクラスに対してアニメーションを指定したい場合は自身でview-transition-nameプロパティを指定する必要があります。
@view-transition {
navigation:auto;
}
@keyframes scroll-out-up {
from {
transform: translateY(0);
opacity: 1;
}
to {
transform: translateY(-50%);
opacity: 0;
transform: scale(0.98);
}
}
@keyframes scroll-in-from-bottom {
from {
transform: translateY(30%);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
::view-transition-old(root) {
z-index: 10;
animation: scroll-out-up 500ms cubic-bezier(0.65, 0, 0.35, 1) both;
}
::view-transition-new(root) {
animation: scroll-in-from-bottom 600ms cubic-bezier(0.22, 1, 0.36, 1) both;
animation-delay: 50ms;
}
#SMP_STYLE .body {
margin: 0;
padding: 0;
background: #F4F4F4;
font-size: 13px;
*font-size: small;
*font: x-small;
font-family: "メイリオ", "Meiryo", "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "MS Pゴシック", "MS PGothic", Sans-Serif;
}
これにてデモサイトの動作は完成です。ご自身のSPIRAL環境に貼り付けてページ遷移を試してみてください。
アニメーションを変更する
フォーム上のページ遷移で使えそうなアニメーションを2つご紹介します。
1:ズームイン/アウト
アットルールと擬似要素の記述を以下に変更してみてください。
/* --- 1:ズームイン/アウト --- */
/* 古いページがスケールダウンしながらフェードアウトする */
@keyframes scale-out {
to {
transform: scale(0.9);
opacity: 0;
}
}
/* 新しいページがスケールアップしながらフェードインする */
@keyframes scale-in {
from {
transform: scale(1.1);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
/* ページ全体にアニメーションを適用 */
::view-transition-old(root) {
animation: scale-out 400ms cubic-bezier(0.4, 0, 0.2, 1) both;
}
::view-transition-new(root) {
animation: scale-in 400ms cubic-bezier(0.4, 0, 0.2, 1) both;
}
2:3Dカードフリップ
アットルールと擬似要素の記述を以下に変更してみてください。
/* --- 2:3Dカードフリップ --- */
/*
3D回転を有効にするため、コンテナに perspective を設定します。
::view-transition は遷移中の要素を重ねるためのコンテナです。
*/
::view-transition {
perspective: 1200px;
}
/* 古いページが奥側へ90度回転する */
@keyframes flip-out {
from {
transform: rotateY(0deg);
opacity: 1;
}
to {
transform: rotateY(-90deg);
opacity: 0;
}
}
/* 新しいページが手前側へ90度回転しながら現れる */
@keyframes flip-in {
from {
transform: rotateY(90deg);
opacity: 0;
}
to {
transform: rotateY(0deg);
opacity: 1;
}
}
/* ページ全体にアニメーションを適用 */
/* backface-visibility は回転中に裏面が見えないようにするためのおまじないです */
::view-transition-old(root) {
animation: flip-out 1000ms ease-in both;
backface-visibility: hidden;
}
::view-transition-new(root) {
animation: flip-in 1000ms ease-out both;
backface-visibility: hidden;
}
発展編:特定のDOMを遷移させる
以上解説したようにView Transition APIはページ遷移時の滑らかなアニメーションを実現できますが、
真価はページ間で異なるDOM要素に対してアニメーションを加えることができる点です。
以下のデモサイトをご覧ください。
デモサイト
入力ページの「確認」ボタンを押下するとそのボタンが画面遷移に伴って確認ページの最上部に移動するようなアニメーションです。 入力ページの
#SMP_STYLE input.submitから確認ページの
#SMP_STYLE h1という異なるDOM要素へのアニメーションをCSSのみで行なっています。
前述のページ単位のアニメーションよりも視線が直接的に誘導されるため文脈がシームレスに維持され、フォームを触るユーザーにとって認知負荷の軽減に繋がります。
手順1:アニメーションしたい要素にview-transition-nameを記述する。
入力ページは以下のように該当のCSSを変更してください。
#SMP_STYLE input.submit {
width: 270px;
height: 42px;
margin: 40px 0 40px 0;
border: hidden;
border-radius: 3px 3px 3px 3px;
/* other browser */
background: #303030;
/* for old webkit */
background: -webkit-gradient(
linear, left top, left bottom,
color-stop(0.00, #606060),
color-stop(1.00, #303030)
);
/* for modern browser */
background: linear-gradient(
to bottom,
#606060 0%,
#303030 100%
);
box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.4);
color: #FFFFFF;
font-size: 153.9%;
font-weight: normal;
text-align: center;
cursor: pointer;
view-transition-name: button-transition; /* この1行を追加 */
}
#SMP_STYLE h1 {
margin: 0;
padding: 10px 10px 10px 10px;
background: #333333;
color: #FFFFFF;
font-size: 153.9%;
font-weight:bold;
text-align:center;
view-transition-name: button-transition; /* この1行を追加 */
}
手順2:アニメーションの定義
この記述は入力ページへの記述のみで動作することを確認していますが、カスタムモジュールに記載してどちらのページでも読み込むことをオススメします。
@keyframes fade-in {
from {
opacity: 0;
}
}
@keyframes fade-out {
to {
opacity: 0;
}
}
::view-transition-old(button-transition),
::view-transition-new(button-transition) {
animation: none;
mix-blend-mode: normal;
}
::view-transition-old(button-transition) {
animation: 90ms cubic-bezier(0.4, 0, 1, 1) both fade-out;
}
::view-transition-new(button-transition) {
animation: 210ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in;
}
これにて発展編の実装も完了です。ご自身のSPIRAL環境に貼り付けてページ遷移をためしてみてください。
今回はフォーム上の入力ページと確認ページへ実装を行いましたが、マイエリアに実装することでモダンでユーザビリティの高い会員ページを作成することも可能です。