Javascriptで初回訪問時のみローディング画面を表示する方法

サイト制作でたまにローディング画面を設置することがあるかと思いますので、今回はローディング画面の設置方法を書いていきたいと思います。

今回のローディング画面の仕様は下記となります。

  • サイト表示時に初回のみローディング画面を表示する(サイト内リンクで移動時は表示しない)
  • ローディング画面は4秒間表示する
  • ローディング画面はフェードアウトで消えるようにする

まずはローディング画面の完成コードです

下記は上記条件で完成したコードとなります。

See the Pen Untitled by 殿村 真史 (@ryngytsw-the-encoder) on CodePen.

ローディング画面のHTML、CSSを解説します

<div id="loading" class="loading">
  <div class="loading__contents">
    <p class="loading__text">ローディング中...</p>
  </div>
</div>

html構造はいたってシンプルで、画面全体を覆うdivタグにloadingクラスを付加してます。

ローディング画面の挙動はidでloadingを設定して、idでJavascriptを設定しております。

.loading {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: #2ea181;
  display: flex;
  align-items: center;
  justify-content: center;
}

.loading__contents {
  text-align: center;
}

.loading__text {
  font-size: 32px;
  font-weight: 700;
  color: #ffeb02;
}

CSSもシンプルで、ポイントとしては.loadingクラスにposition: fixedをつけて、top: 0;left: 0;right: 0;bottom: 0;を指定することで、画面全体を覆うように設定しています。

そして、ローディング画面のコンテンツはdisplay: flex;align-items: center;justify-content: center;を使ってセンター配置にしております。

ローディング画面のJavascriptを解説します

//ローディング画面の処理
window.addEventListener('DOMContentLoaded', function() {
  const loadingElement = document.getElementById('loading');

  // ローディング画面を非表示にする関数
  function hideLoading() {
    loadingElement.style.transition = 'opacity .6s ease, visibility .6s ease';
    loadingElement.style.opacity = 0;
    loadingElement.style.visibility = 'hidden';
  }

  // ページが初回訪問かどうかをセッションストレージで確認
  if (!sessionStorage.getItem('firstVisit')) {
    // 初回訪問の場合、セッションストレージにフラグをセット
    sessionStorage.setItem('firstVisit', 'true');

    // ローディング画面を表示し、4秒後に非表示にする
    setTimeout(function() {
      hideLoading();
    }, 4000);

  } else {
    // 初回訪問ではない場合、ローディング画面を非表示にする
    loadingElement.style.display = 'none';
  }
});

2行目のイベントの設定をどうするか?ですが、loadイベントを使うか、DOMContentLoadedイベントを使うかという選択肢があるのですが、今回の仕様が4秒のローディング画面表示という設定なので、DOMContentLoadedイベントを使って、DOMContentLoadedイベントはHTMLツリーを全て読み込んだら発火というイベントなので、ページURLにアクセスしたらすぐに発火する仕様としました。

loadイベントを使用する場合は、loadイベントは全ての要素を読み込んだら発火(CSS、画像なども)というイベントなので、完全にページを表示する状態になったら発火するイベントになります。なのでページ読み込み時のみにローディング画面を見せたいという仕様でしたら、loadイベントが向いています。

6行目のhideLoading()関数はローディング画面を非表示にする関数を事前に用意しております。非表示の関数で、opacity: 0; visibility: hidden; transition: opacity .6s ease, visibility .6s ease;を付加することで、非表示時のフェードアウトアニメーションを設置しております。

13行目のif文がローディング画面の初回訪問のみ表示するという仕様のキモで、ブラウザのセッションストレージというデータの格納場所を利用しております。セッションストレージはブラウザのタブを開いている時にデータを保存する仕組みで、タブを閉じるとデータが消える仕様となっております。

下記添付のようにローディング画面を表示させてからブラウザのデベロッパーツールを開いて、アプリケーションタブを開くと、セッションストレージにキーにfirstVisit、値にtrueが入っているのが確認できると思います。

if文でセッションストレージにfirstVisitのtrueが入っているかを確認して、入ってなければ初回訪問時と判断して、セッションストレージに値を入れます(15行目)。タブ移動無しでページ移動した場合はセッションストレージに値が入ったままなので、初回訪問ではないと判断してローディング画面は表示しない(24行目)という条件分岐としています。

初回訪問時のローディング画面の表示設定は、18行目でsetTimeoutを使って、4秒後に先ほど作ったローディング画面を非表示にする関数を発火させます。

なので、初回訪問時は初期状態でローディング画面が表示されている状態から、setTimeoutで4秒後にローディング画面を非表示に設定しております。

今回は、サイトの初回訪問時にローディング画面を4秒間表示するという実装の解説をさせていただきました。
また疑問点やおかしな箇所などありましたら、記事のコメント欄やフォームなどからメッセージをいただけますとありがたいです。

この記事を書いた人

アバター

トノムラマサシ

masashi
Webサイト屋兼ブロガー|過去に企業常駐などを経て現在はフリーランスでディレクションとコーダーとして活動しております。JS大好きなのでJSの仕事依頼お待ちしております。京都在中で5人家族。