1. HOME
  2. JavaScript
  3. Web Storageを活用し、初回アクセス時のみローディング画面を表示する方法
JavaScript - 2022-01-11

Web Storageを活用し、初回アクセス時のみローディング画面を表示する方法

Webサイトを訪れたユーザーに良い第一印象を与えるため、洗練されたローディングアニメーションは非常に効果的です。しかし、ページを移動するたびに同じアニメーションが表示されると、かえって煩わしく感じさせてしまう可能性があります。

この記事では、ブラウザのWeb Storage APIを利用して、「セッション中の初回アクセス時」にだけローディング画面を表示させる方法を、具体的なコードと詳しい解説付きで紹介します。

なぜWeb Storageを使うのか?

この実装の目的は、「ユーザーがサイトを訪れた最初の1回だけ」という状態を記憶し、2回目以降はローディング画面をスキップすることです。この「状態の記憶」に最適なのが、ブラウザに標準で搭載されているWeb Storage機能です。

sessionStorageとlocalStorageの違い

Web Storageには、主に2つの種類があります。

種類データが保持される期間用途の例
sessionStorageタブまたはブラウザを閉じるまで今回のように、サイト訪問中(セッション中)の初回アクセス判定に使います。
localStorageユーザーが手動で削除するまで永続「次回からこのメッセージを表示しない」といった、永続的な設定の保存に使います。

今回は「サイトを訪れている間(セッション中)の最初のアクセス」を判定したいため、sessionStorage を使用するのが最も適切です。

実践的なコード例

それでは、実際にHTML, CSS, JavaScriptを組み合わせた実装を見ていきましょう。

1. HTMLの構造

まず、ローディング画面本体と、Webサイトのコンテンツ部分を用意します。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>初回ローディングデモ</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>

  <!-- ローディング画面 -->
  <div class="loading js-loading is-active">
    <div class="loading__spinner"></div>
  </div>

  <!-- メインコンテンツ -->
  <main class="main-content">
    <h1>ようこそ!</h1>
    <p>このページは、セッションの初回アクセス時にのみローディング画面が表示されます。</p>
    <p>ページをリロードしても、ローディング画面は表示されません。</p>
  </main>

  <script src="script.js"></script>
</body>
</html>

ポイント:

  • ローディング画面のdiv.js-loading)に、デフォルトで表示状態を示すis-activeクラスを付与しておきます。

2. CSSで見た目を整える

次に、ローディング画面のスタイルと、簡単なスピナーアニメーションを定義します。

/* 基本スタイル */
body {
  font-family: sans-serif;
}

/* ローディング画面のコンテナ */
.loading {
  /* 最初は非表示にしておく */
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #fff;
  z-index: 9999;

  /* フェードアウトのためのトランジション */
  opacity: 1;
  transition: opacity 0.8s ease;
}

/* is-activeクラスが付与されたら表示 */
.loading.is-active {
  display: flex;
  justify-content: center;
  align-items: center;
}

/* スピナーのアニメーション */
@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

.loading__spinner {
  width: 50px;
  height: 50px;
  border: 4px solid #f3f3f3;
  border-top: 4px solid #3498db;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

/* コンテンツ部分 */
.main-content {
  padding: 2rem;
}

ポイント:

  • .loading自体はdisplay: none;で隠しておき、.is-activeクラスが付いたときにdisplay: flex;で表示されるように制御します。
  • transitionプロパティを設定しておくことで、後からopacityを変更した際に滑らかなフェードアウト効果が生まれます。

3. JavaScriptで表示を制御する

最後に、sessionStorageを使って表示を制御するJavaScriptです。ここでは、よりモダンで汎用的なVanilla JS(素のJavaScript)で記述します。

document.addEventListener('DOMContentLoaded', function() {
  const loadingElement = document.querySelector('.js-loading');

  // 1. sessionStorageに 'visited' キーがあるか確認
  if (sessionStorage.getItem('visited')) {
    // 2. あった場合 (2回目以降のアクセス)
    // is-activeクラスを削除して、ローディング画面を非表示にする
    loadingElement.classList.remove('is-active');
  } else {
    // 3. なかった場合 (初回アクセス)
    // 'visited' キーをsessionStorageにセット
    sessionStorage.setItem('visited', 'true');

    // 4. 少し遅延させてからフェードアウト処理を開始
    setTimeout(() => {
      loadingElement.style.opacity = '0';
      // 5. フェードアウト完了後に要素を非表示にする
      setTimeout(() => {
        loadingElement.classList.remove('is-active');
      }, 800); // CSSのtransition時間と合わせる
    }, 1200); // 1.2秒間ローディング画面を表示
  }
});

jQueryを使用する場合のコード例

もしプロジェクトでjQueryを使用している場合は、以下のように書くこともできます。

$(function() {
  var $loading = $('.js-loading');

  if (sessionStorage.getItem('visited')) {
    $loading.removeClass('is-active');
  } else {
    sessionStorage.setItem('visited', 'true');
    setTimeout(function() {
      $loading.fadeOut(800, function() {
        $(this).removeClass('is-active');
      });
    }, 1200);
  }
});

コードの詳しい解説

  1. sessionStorage.getItem('visited')
    • sessionStorageからvisitedというキーで保存された値を取得します。
    • 値がなければnullが返り、初回アクセスと判断できます。
    • 値があれば(2回目以降)、ifブロックの中の処理が実行されます。
  2. loadingElement.classList.remove('is-active')
    • 2回目以降のアクセス時には、即座にis-activeクラスを取り除き、ローディング画面が表示されないようにします。
  3. sessionStorage.setItem('visited', 'true')
    • 初回アクセス時に、visitedというキーで'true'という値をsessionStorageに保存します。
    • これにより、ユーザーがタブを閉じるまでの間、このキーが保持され、次回以降のアクセスは「2回目以降」と判定されるようになります。
  4. setTimeoutによる遅延処理
    • 初回アクセス時は、すぐにローディング画面を消すのではなく、一定時間(ここでは1.2秒)表示させます。
    • その後、opacity0にすることで、CSSのtransitionが適用され、滑らかにフェードアウトします。
    • opacity0になった後、display: none;を適用するためにis-activeクラスを削除します。これにより、非表示になったローディング画面がクリックなどを妨げることがなくなります。

まとめ

sessionStorageを活用することで、ユーザー体験を損なうことなく、サイトの第一印象を効果的に演出できます。このテクニックは、ポートフォリオサイトやキャンペーンサイトのオープニングアニメーションなど、様々な場面で応用可能です。