cookieを使って初回と一定期間経過後に読み込まれるローディング画面をjavascriptで実装してみる(備忘録)

今回はjavascriptを用いて、cookieを使って初回と一定期間経過後に読み込まれるローディング画面をjavascriptで実装してみる。

今回は一定期間の時間は30秒に設定している。30秒経過してからページを読み込んだときにcookieの値が削除され、再度ローディング画面が読み込まれる仕様となっている。

それでは解説に入っていく。

htmlの記述について

<!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="../reset.css">
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div id="js_loading" class="bl_loading">
    <div class="bl_loadingCircle"></div>
    <div class="bl_loadingText">loading...</div>
  </div>
  <main>
    <section>
      <div class="ly_inner" id="menu1">
        <h2>menu1</h2>
        <div class="md_textblock">
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
        </div>
      </div>
    </section>
    <section>
      <div class="ly_inner" id="menu2">
        <h2>menu2</h2>
        <div class="md_textblock">
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
        </div>
      </div>
    </section>
    <section>
      <div class="ly_inner" id="menu3">
        <h2>menu3</h2>
        <div class="md_textblock">
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
        </div>
      </div>
    </section>
    <section>
      <div class="ly_inner" id="menu4">
        <h2>menu4</h2>
        <div class="md_textblock">
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
        </div>
      </div>
    </section>
    <section>
      <div class="ly_inner" id="menu5">
        <h2>menu5</h2>
        <div class="md_textblock">
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
          <p>テキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
        </div>
      </div>
    </section>
  </main>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
  <script src="style.js"></script>
</body>
</html>

今回はhtmlのソースは下記の記事と同様である。

該当の記事はこちら

cssの記述について

@charset "utf-8";

/* ==========================
  初期設定
========================== */
*,
*::before,
*::after {
  box-sizing: border-box;
}
img {
  width: 100%;
}

/* ==========================
  ローディング画面
========================== */
.bl_loading {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #444;
  color: #fff;
  font-size: 12px;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  opacity: 1;
  visibility: visible;
  transition: 0.3s;
}
.bl_loading.loaded {
  opacity: 0;
  visibility: hidden;
}
@keyframes loading {
  0% {
    transform: rotate(0);
  }
  100% {
    transform: rotate(360deg);
  }
}
.bl_loadingCircle {
  animation: 3s linear loading infinite;
  height: 30px;
  width: 30px;
  border: 1px solid #fff;
  border-top: 1px solid #aaa;
  border-radius: 50%;
  content: "";
  margin-bottom: 10px;
}

/* ==========================
  コンテンツの中身
========================== */
.ly_inner {
  width: 100%;
  max-width: 1080px;
  margin: 100px auto;
  padding: 20px;
  background-color: #ccc;
}
.ly_inner h2 {
  font-size: 150%;
  font-weight: bold;
  margin-bottom: 30px;
}
.md_textblock > * + * {
  margin-top: 10px;
}

CSSの記述も、htmlで紹介した記事と同様である。

javascriptの記述について

'use strict';

// ローディング画面
function loadedPage() {
  const loadingID = document.getElementById("js_loading");
  loadingID.classList.add("loaded");
}

if (document.cookie.indexOf('visited=first') === -1) {
  document.cookie = 'visited=first path=/' + ';max-age=30';
  window.addEventListener('load', function () {
    setTimeout(loadedPage, 2000);
  });
  setTimeout(loadedPage, 5000);
} else {
  loadedPage();
}

document.cookieについて

cookieにはkeyとvalueという文字情報が保存されており、javascriptでcookieに任意のkeyとvalueを指定して保存ができる。

document.cookieを指定すると、現在のページ上で指定されている全てのcookieの情報が、keyとvalueがペアになった状態で読み込むことができる。

今回は、keyをvisited、valueをfirstに指定しているだけで、他にcookieは指定はしていないが、もし別のcookieも指定している場合は、特定のcookieを取り出す対応も必要になることがある。今回は使わないので解説はしない。

indexOfについて

indexOfは、stringオブジェクトの中で使うndexOfを指している。stringは文字の並びのことだと思っていただいて良い。よくnumberと区別するのに用いられたりする。

indexOfを使うと、指定された文字の一番最初を0と数えて順番に検索していくようになっている。値が見つからない場合は-1を返すようになっている。

このことを利用して、if文に下記の条件を指定した。

document.cookie.indexOf('visited=first') === -1

最初にページを読み込んだ時点では、cookieの値が入っていないので、indexOfは-1を返す。

あとは、この中に最初に読み込んだ時の条件を書いていけばよい。

document.cookieでkeyとvalue、該当URL、秒数の指定

if (document.cookie.indexOf('visited=first') === -1) {
  document.cookie = 'visited=first path=/' + ';max-age=30';
  window.addEventListener('load', function () {
    setTimeout(loadedPage, 2000);
  });
  setTimeout(loadedPage, 5000);
}

visited=first path=/は、下記のような解釈になる。

  • visited ⇨keyの値
  • first ⇨valueの値
  • path=/ ⇨このページURL全体に対して

pathは/の後に、任意のURLを記載できる。例えば、Aというページ(URLにaaaと入っているページ)だけにcookieを読み込ませたいときは、path=/aaaとすればよい。

最後に、max-ageの数字部分に秒数を指定する。30と指定すれば30秒後にcookieが削除される。ポイントは秒数で指定するので、1時間や1日単位などで指定したい場合は、秒数に計算して直した上で指定すること。

その他の部分については、下記ページと同じ考え方なので解説は省略したい。

前回のページはこちら

これで実装完了だ。