OSSANS Project since 2020

「もし四十のおっさんがプログラミングを始めたらどう人生変わるのか」
このブログのメインテーマです
肩肘張らずにユルく、ときたま厳しくやっていきます
※プログラミング以外のことも書きます

JavaScript

【ユーザー離脱阻止!】画面遷移アニメーション実装時の注意点

アイキャッチ画像
JavaScript

画面遷移アニメーションって楽しいけど、長くてイラっとする時ない?

こんな疑問に答えていきます。

本記事の内容

  • 画面遷移アニメーション実装時の注意点

本記事を対象とする方

  • フロントエンドエンジニアを目指す方
  • Webデザイナーを目指す方

この記事を書いている僕はプログラミング歴2年6ヶ月です。webエンジニアとして”社内転職”しました。

ページロード遅延でユーザー離脱?

デザインに凝りすぎるとユーザー離脱の原因になります。

画面遷移アニメーションは、ユーザーを楽しませるデザイン手法であり、Webサイトの好感度に繋がります。一方で、手の込んだデザインを組み込みすぎてページ表示速度が遅くなる要因にもなり、ユーザーをイライラさせて離脱させてしまう要因にもなり得ます。ユーザーは目的を持ってページを閲覧している時でも、何となくWebページを見ている時でも遅延に敏感だからです。

イライラ
※イラッとした経験ありませんか?

コンピューター分野では有名な「Response Times: The 3 Important Limits」という研究があります。この研究では人間がコンピューターとやり取りする際の応答基準が設けられています。それによると、人間はコンピューターを操作する際、一連のナビゲーションが間断なく進んでいると感じられる限界がたったの「1秒」と言われています。間断なく進むということは、遅延がなく動くという意味ですが、たとえばWebページであれば、そのページを見るためにクリックして表示される時間が「1秒」以上だと待つことが出来ないということになります。たったの1秒です。※ちなみにUI操作は0.1秒が限界値とされている。

いくら魅力的なデザインを用意しても「1秒」以上時間がかかるとユーザーが離れてしまう割合が高くなっていきます。本末転倒でもったいない話ですね。「Response Times: The 3 Important Limits」に関して、英語版となりますが、下記リンクから確認できます。

以上のことから、画面遷移アニメーションはページロード速度を意識した実装が好ましいでしょう。

ブラウザバックの対処

次にブラウザバックについて説明します。

ブラウザバックとはWebページの閲覧中に、一つ前に閲覧していたページに戻ることを指します。通常、ブラウザの左上に矢印ボタンがあると思いますが、それをクリックすることで前のページに戻ることができます。また、マウス操作やスマホのスワイプでも同様のことが可能ですよね。

ブラウザバック
※頻繁に使用するUI操作ですね

画面遷移アニメーションは、ページロードイベントを利用して実装することが多いですが、ブラウザバックではページロードイベント自体が発生しません。なのでブラウザバックされた時の処理を予め設定しておきましょうということなんです。といっても特に難しいことではなく、以下のコードで実現できます。

  1. window.addEventListner('pageshow', e => {
  2.   if (e.persisted) {
  3.       window.location.reload();
  4.     }
  5. });

pageshowイベントは、ブラウザがHTML文書を表示した時に起こるイベントです。例えば、最初にページを読み込んだ時、ブラウザの進む、戻るボタンを押した時などです。e.persistedは、webページをキャッシュから読み込んだか、直接読み込んだかを返すプロパティです。戻り値はBoolean値となります。window.location.reload();は、強制的に文書の再読み込みを行います。つまり、webページがキャッシュから読み込まれたら、強制リロードを行うという処理になります。

ブラウザバック時に、画面遷移アニーメーションが必要かどうかは開発側で検討する余地がありますが、抜かりなく実装している印象を与えるならば必須となるでしょう。

実例【コードあり】

実際にアニメーションを実装してみました。

上記で説明したページロード速度、ブラウザバックに注意しながら画面遷移アニメーションを実装してみました。下記サンプルページへのリンクと実装コードになります。

【CSS】

  1. body {
  2.   transition: all 0.2s;
  3. }
  4. body.hidden {
  5.   background-color: #ffffff;
  6.   opacity: 0;
  7. }
  8. .screenani {
  9.   height: 100vh;
  10.   position: absolute;
  11.   left: 0;
  12.   top: 0;
  13.   width: 100vw;
  14.   -webkit-animation: screenani 0.5s 0s;
  15.           animation: screenani 0.5s 0s;
  16. }
  17. @-webkit-keyframes screenani {
  18.   0% {
  19.     background-color: #000000;
  20.     transform: scale(1, 1);
  21.   }
  22.   50% {
  23.     transform: scale(1, 0.01);
  24.   }
  25.   100% {
  26.     transform: scale(1, 0);
  27.   }
  28. }
  29. @keyframes screenani {
  30.   0% {
  31.     background-color: #000000;
  32.     transform: scale(1, 1);
  33.   }
  34.   50% {
  35.     transform: scale(1, 0.01);
  36.   }
  37.   100% {
  38.     transform: scale(1, 0);
  39.   }
  40. }
  41. .screenani.hidden {
  42.   display: none;
  43. }

【JavaScript】

  1. function screenAnimation() {
  2.   const body = document.querySelector('body');
  3.   body.classList.add('hidden');
  4.   window.addEventListener('DOMContentLoaded', () => {
  5.     const screen = document.createElement('div');
  6.     screen.classList.add('screenani');
  7.     html.appendChild(screen);
  8.     screen.addEventListener('animationend', () => {
  9.       body.classList.remove('hidden');
  10.       html.removeChild(screen);
  11.     });
  12.   });
  13. }
  14. function pageReload() {
  15.   window.addEventListener('pageshow', e =>{
  16.     if(e.persisted) {
  17.       window.location.reload();
  18.     }
  19.   });
  20. }
  21. if (url_path === '/screenanimation/') {
  22.   pageReload();
  23.   screenAnimation();
  24. }

簡単に説明すると、サンプルページが読み込まれたら、htmlの最後の子要素としてdivを追加して、CSSでスタイリングするという内容になっています。ポイントはanimation-durationを0.5秒に設定している点です。ページロードの時間は1秒が理想的です。コンテンツ量にもよって当然異なりますが、ページロードにかかる時間を0.5秒だとしたら、使える時間は残り0.5秒です。よってアニメーションの時間は0.5秒になります。

今回のアニメーション自体は全く面白みのないデザインです。もちろん時間を増やせばその分色んなデザイン表現が可能になります。時間がかかっても良いからリッチなデザインなのか、それともページロードのスピードを重視するのか、これはブランディングに関わる考え方の違いかと思います。

コアなファンならば時間がかかっても待ってくれるかもしれません。そうでない場合はスピード重視じゃないと離れてしまうかもしれない。もちろん両方を実現できればそれに越したことはありませんが、どこかで限界は訪れます。個人的にはスピード重視派ですね。シンプルでわかりやすいほうが好きですし、リッチなデザインなら別の場所で表現できるからです。

今回のまとめ

今回は画面遷移アニメーションの注意点について紹介しました。最後まで読んで頂きありがとうございました。

ユーザーがイライラしないようにアニメーションの時間を考慮する

ブラウザバックした時はリロードするように仕込んでおく

関連記事

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.03.04(更新)

    【実例コードあり】覚えておきたいパララックスデザインの3つの基本

  • JavaScript
    ブログアイキャッチ画像
    JavaScript

    【図解あり】JavaScript / 要素の高さや位置の取得まとめ

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2022.11.19(更新)

    「一瞬でトップへ戻るボタン」を実装する方法【jQuery不要】

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.02.02(更新)

    【CSSとJavaScriptのみ】ページ内リンクでスムーススクロールさせる方法

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.02.21(更新)

    【お手軽だった!】画像クリックで拡大画像をポップアップ表示する方法

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2022.11.25(更新)

    【5分で完了!】webデザインにおけるスマホファーストビュー高さ設定方法

CATEGORY カテゴリー別最新記事

  • CSS
    アイキャッチ画像
    CSS

    【CSS】margin?position?要素の中央寄せで使うプロパティとは?

  • Docker
    アイキャッチ画像
    Docker
    2022.10.03(更新)

    【簡単設定!】DockerでWordPressをローカル開発する方法

  • HTML
    アイキャッチ画像
    HTML
    2023.02.18(更新)

    【図解あり】aタグの入れ子ルールとHTMLの入れ子ルールを覚える方法

  • JavaScript
    アイキャッチ画像
    JavaScript
    2023.03.04(更新)

    【実例コードあり】覚えておきたいパララックスデザインの3つの基本

  • Python
    アイキャッチ画像
    Python
    2023.02.09(更新)

    【やらなきゃ損!】2日でできるPythonのExcelコピペ自動化!

  • Study
    アイキャッチ画像
    Study
    2023.02.16(更新)

    稼ぐために始めたプログラミングのこれまでの振り返り。勉強方法や役立った本も紹介。

  • web site
    アイキャッチ画像
    web site
    2022.11.26(更新)

    ページ表示速度アップ!npmでソースファイルを軽量化する方法【サクッと簡単!】

  • WordPress
    アイキャッチ画像
    WordPress
    2022.10.26(更新)

    【コピペ可】WordPressサイトをPWA化するためにService Workerを実装してみた。