読み込み中...

JavaScriptとCSSでローディング画面を実装する方法10例

JavaScriptでローディング画面を実装する JS
この記事は約36分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●ローディング画面とは?

ウェブサイトを訪れた時、ページの読み込みが完了するまでの間、ユーザーに何らかの視覚的なフィードバックを与えるための画面がローディング画面です。

ローディング画面は、ユーザーにページが読み込み中であることを伝え、待ち時間を心理的に短く感じさせる効果があります。

○ローディングの意味と目的

ローディングとは、コンピュータがプログラムやデータを読み込んでいる状態を指します。

ウェブサイトの場合、サーバーから必要なリソースを取得し、ブラウザ上で表示するまでの一連の処理がローディングに当たります。

ローディング画面を表示する主な目的は、次の3点です。

  1. ユーザーに読み込み中であることを伝える
  2. 待ち時間を心理的に短く感じさせる
  3. ブランディングの機会として活用する

適切なローディング画面を実装することで、ユーザーの待ち時間に対するストレスを軽減し、ウェブサイトの印象を向上させることができるでしょう。

○ローディングアニメーションの秒数の目安

ローディングアニメーションの表示時間は、ページの読み込み速度によって異なりますが、一般的には2〜3秒程度が適切だと言われています。

あまりに長い時間ローディングアニメーションを表示し続けると、ユーザーはページの読み込みに失敗したのではないかと不安になってしまうかもしれません。

一方で、ローディングアニメーションが一瞬で消えてしまうと、アニメーションを表示する意味がなくなってしまいます。

ウェブサイトのパフォーマンスを改善しつつ、適度な時間ローディングアニメーションを表示することが大切です。

○JavaScriptのプリローダーの役割

JavaScriptのプリローダーは、ウェブページが完全に読み込まれる前に、必要なリソースを事前に読み込むための仕組みです。

プリローダーを使うことで、次のようなメリットがあります。

  1. ページの表示速度を向上させる
  2. リソースの読み込み順序を制御できる
  3. ローディング画面を柔軟にカスタマイズできる

プリローダーは、ローディング画面を表示しながら、バックグラウンドでリソースを読み込む役割を担います。

JavaScriptを使ってプリローダーを実装することで、ローディング画面をよりインタラクティブで魅力的なものにできるでしょう。

●シンプルなローディング画面の実装

ここからは、実際にJavaScriptとCSSを使ってシンプルなローディング画面を実装していきましょう。

ローディング画面の実装方法はたくさんありますが、まずは基本的な方法から始めるのがおすすめです。

シンプルなローディング画面を作ることで、JavaScriptとCSSの仕組みを理解し、徐々に応用レベルの実装にチャレンジしていくことができるでしょう。

○サンプルコード1:基本的なローディング画面

最初に、HTMLとCSSだけを使った基本的なローディング画面の作り方を見ていきます。

ローディング画面を表示するには、次のようなHTMLを用意します。

<div id="loading">
  <div class="spinner"></div>
  <p>Loading...</p>
</div>

ここでは、id="loading"<div>要素の中に、ローディングアニメーションを表現するclass="spinner"<div>要素と、”Loading…”というテキストを含む<p>要素を配置しています。

次に、CSSを使ってローディング画面のスタイルを定義します。

#loading {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(255, 255, 255, 0.8);
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

.spinner {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  border: 5px solid #ccc;
  border-top-color: #333;
  animation: spin 1s linear infinite;
}

@keyframes spin {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}

#loadingセレクタでは、ローディング画面全体のスタイルを指定しています。

position: fixed;z-index: 9999;によって、ローディング画面を常に画面の最前面に表示するようにしています。

また、display: flex;を使って、要素を中央に配置しています。

.spinnerセレクタでは、ローディングアニメーションのスタイルを定義しています。

borderプロパティを使って、円形の枠線を表現し、border-top-colorで上部の色を変更することで、回転しているように見せています。

@keyframesルールを使って、animationプロパティでアニメーションを適用しています。

このHTMLとCSSを組み合わせることで、シンプルなローディング画面が完成します。

ページの読み込みが完了したら、JavaScriptを使ってローディング画面を非表示にする必要がありますが、その方法は後ほど解説します。

○サンプルコード2:パーセンテージ表示つきローディング

次に、ローディング画面にパーセンテージ表示を追加してみましょう。

パーセンテージ表示は、ページの読み込み進捗状況をユーザーに伝えることができるので、待ち時間を心理的に短く感じさせる効果が期待できます。

HTMLは次のように修正します。

<div id="loading">
  <div class="spinner"></div>
  <p><span id="loading-percentage">0</span>% Loading...</p>
</div>

<span id="loading-percentage">を追加して、パーセンテージ表示用の要素を用意しました。

次に、JavaScriptを使ってパーセンテージ表示を更新していきます。

window.addEventListener('load', function() {
  var percentage = document.getElementById('loading-percentage');
  var progress = 0;
  var interval = setInterval(function() {
    progress += 10;
    percentage.textContent = progress;
    if (progress >= 100) {
      clearInterval(interval);
      document.getElementById('loading').style.display = 'none';
    }
  }, 200);
});

window.addEventListener('load', ...)で、ページの読み込みが完了したタイミングでローディング画面を非表示にするようにしています。

progress変数を使って、パーセンテージを10ずつ増やしていき、loading-percentage要素のテキストを更新しています。

progressが100以上になったら、clearInterval()setInterval()をクリアし、ローディング画面を非表示にしています。

実行結果は次のようになります。

0% Loading...
10% Loading...
20% Loading...
...
100% Loading...
(ローディング画面が非表示になる)

パーセンテージ表示を追加することで、ユーザーにページの読み込み状況を視覚的にフィードバックできます。

ただし、実際のページの読み込み進捗とは異なる場合があるので、あくまでも演出の一部として考えることが大切ですね。

○サンプルコード3:ローディングアイコンを使ったサンプル

最後に、ローディングアイコンを使ったサンプルを見ていきましょう。

ローディングアイコンを使うことで、よりわかりやすく読み込み中であることを表現できます。

HTMLは次のように修正します。

<div id="loading">
  <img src="loading-icon.gif" alt="Loading...">
  <p>Loading...</p>
</div>

<img>要素を使って、ローディングアイコンの画像を表示しています。

src属性には、使用するアイコン画像のパスを指定します。

CSSは特に変更する必要はありませんが、アイコン画像のサイズに合わせて、widthheightを調整すると良いでしょう。

JavaScriptは、サンプルコード2と同じように、ページの読み込みが完了したタイミングでローディング画面を非表示にします。

window.addEventListener('load', function() {
  document.getElementById('loading').style.display = 'none';
});

実行結果は、アイコン画像が表示されるローディング画面になります。

ローディングアイコンを使う場合は、アイコン画像の選択が重要です。

サイトのデザインや雰囲気に合ったアイコンを使うことで、ユーザーに良い印象を与えることができるでしょう。

また、アイコンのサイズやアニメーションにも気を配り、読み込み中であることをわかりやすく伝えることが大切です。

●アニメーションを使ったローディング画面

シンプルなローディング画面の実装方法がわかったところで、今度はアニメーションを使ってよりオシャレなローディング画面を作ってみましょう。

CSSやSVGアニメーションを活用することで、ユーザーの印象に残るユニークなローディング画面を実現できます。

アニメーションを取り入れることで、ローディング中の待ち時間を楽しいものにし、ユーザー体験を向上させることができるでしょう。

○サンプルコード4:CSSアニメーションでおしゃれに

CSSアニメーションを使えば、HTMLとCSSだけで様々なアニメーションを作ることができます。

ローディング画面にCSSアニメーションを取り入れて、よりオシャレな表現を目指してみましょう。

次のようなHTMLとCSSを用意します。

<div id="loading">
  <div class="circle"></div>
  <div class="circle"></div>
  <div class="circle"></div>
</div>
#loading {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

.circle {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  margin: 0 10px;
  background-color: #333;
  animation: bounce 1.5s infinite ease-in-out;
}

.circle:nth-child(2) {
  animation-delay: -0.3s;
}

.circle:nth-child(3) {
  animation-delay: -0.15s;
}

@keyframes bounce {
  0%, 80%, 100% {
    transform: scale(0);
  }
  40% {
    transform: scale(1);
  }
}

このサンプルコードでは、3つの<div>要素を用意し、それぞれに.circleクラスを付けています。

CSSでは、.circleに対してアニメーションを設定し、ボールがバウンドするような動きを表現しています。

@keyframesルールを使って、bounceアニメーションを定義しています。

scale()関数を使って、要素のサイズを変化させることでバウンドの動きを表現しています。

また、.circle:nth-child()セレクタを使って、それぞれの要素にアニメーションの開始タイミングをずらしています。

実行結果は次のようになります。

(3つの円がバウンドするアニメーション)

CSSアニメーションを使えば、比較的シンプルなコードでダイナミックなアニメーションを実現できます。

アニメーションの設定を変更することで、様々なバリエーションを作ることができるので、オリジナリティを発揮してみてください。

○サンプルコード5:SVGアニメーションの活用

SVG(Scalable Vector Graphics)は、ベクター形式のグラフィックスを表現するためのXML言語です。

SVGを使えば、高品質でスケーラブルなグラフィックスを作ることができます。

SVGアニメーションを活用して、ローディング画面をよりリッチにしてみましょう。

次のようなHTMLとCSSを用意します。

<div id="loading">
  <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
    <circle cx="50" cy="50" r="40" stroke="#333" stroke-width="4" fill="none" />
    <circle id="progress" cx="50" cy="50" r="40" stroke="#f00" stroke-width="4" fill="none" stroke-dasharray="251.2" stroke-dashoffset="251.2" transform="rotate(-90 50 50)" />
  </svg>
</div>
#loading {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

svg {
  animation: rotate 2s linear infinite;
}

#progress {
  animation: progress 2s linear infinite;
}

@keyframes rotate {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}

@keyframes progress {
  0% {
    stroke-dashoffset: 251.2;
  }
  100% {
    stroke-dashoffset: 0;
  }
}

このサンプルコードでは、SVGを使ってローディングアニメーションを表現しています。

<circle>要素を2つ用意し、1つは背景用の円、もう1つはアニメーション用の円として使用しています。

CSSでは、svg要素にrotateアニメーションを設定し、SVG全体を回転させています。

また、#progressprogressアニメーションを設定し、stroke-dashoffsetプロパティを変化させることで、円が徐々に描画されるような効果を表現しています。

実行結果は次のようになります。

(円形のローディングアニメーション)

SVGアニメーションを使えば、ベクター形式ならではの美しいグラフィックスと、スムーズなアニメーションを実現できます。

SVGは拡大縮小しても画質が劣化しないので、高解像度のディスプレイにも対応できるメリットがあります。

○サンプルコード6:ロゴアニメーションのローディング画面

企業やブランドのウェブサイトでは、ローディング画面にロゴアニメーションを取り入れることで、ブランディング効果を高めることができます。

SVGを使って、ロゴアニメーションを実装してみましょう。

次のようなHTMLとCSSを用意します。

<div id="loading">
  <svg xmlns="http://www.w3.org/2000/svg" width="200" height="100" viewBox="0 0 200 100">
    <path id="logo" fill="none" stroke="#333" stroke-width="4" d="M 20,50 C 50,20 130,20 160,50 C 130,80 50,80 20,50" />
  </svg>
</div>
#loading {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

#logo {
  stroke-dasharray: 280;
  stroke-dashoffset: 280;
  animation: draw 2s linear forwards;
}

@keyframes draw {
  to {
    stroke-dashoffset: 0;
  }
}

このサンプルコードでは、SVGの<path>要素を使ってロゴを描画しています。d属性には、パスデータを指定します。

ここでは、ベジェ曲線を使ってロゴの形状を表現しています。

CSSでは、#logodrawアニメーションを設定し、stroke-dashoffsetプロパティを変化させることで、ロゴが徐々に描画されるような効果を実現しています。

実行結果は次のようになります。

(ロゴが描画されるアニメーション)

ロゴアニメーションを使うことで、ブランドイメージを印象付けながら、ローディング画面を演出できます。

SVGを使えば、ロゴをベクター形式で高品質に表現できるので、大きなサイズで表示してもシャープな仕上がりになります。

●画像を使ったローディング画面

アニメーションを使ったローディング画面の実装方法を見てきましたが、画像を使うことでもオシャレなローディング画面を作ることができます。

写真や イラストを取り入れることで、サイトの雰囲気に合ったビジュアル的に魅力的なローディング画面を実現できるでしょう。

画像を使ったローディング画面の実装方法を、サンプルコードを交えて見ていきましょう。

○サンプルコード7:背景に画像を使う方法

ローディング画面の背景に画像を使うことで、視覚的なインパクトを与えることができます。

HTMLとCSSを使って、背景画像つきのローディング画面を実装してみましょう。

まず、HTMLを次のように記述します。

<div id="loading">
  <div class="spinner"></div>
  <p>Loading...</p>
</div>

id="loading"<div>要素の中に、ローディングアニメーションを表現するclass="spinner"<div>要素と、”Loading…”というテキストを含む<p>要素を配置しています。

次に、CSSを次のように記述します。

#loading {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-image: url('background.jpg');
  background-size: cover;
  background-position: center;
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

.spinner {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  border: 5px solid #fff;
  border-top-color: #333;
  animation: spin 1s linear infinite;
}

@keyframes spin {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}

#loadingセレクタでは、background-imageプロパティを使って背景画像を指定しています。

background-size: cover;background-position: center;で、画像を要素いっぱいに表示し、中央に配置するように設定しています。

.spinnerセレクタでは、ローディングアニメーションのスタイルを定義しています。

背景が画像になったので、border-colorを白色(#fff)に変更し、border-top-colorを濃い色(#333)に設定して、コントラストをつけています。

実行結果は次のようになります。

(背景画像の上にローディングアニメーションが表示される)

背景画像を使うことで、ローディング画面に奥行きと雰囲気を与えることができます。

画像の選択には気を配り、サイトの印象を損なわないようなものを選ぶことが大切ですね。

画像のファイルサイズにも注意し、ローディング時間が長くなりすぎないように配慮しましょう。

○サンプルコード8:スライドショー風ローディング

ローディング中に複数の画像をスライドショーのように切り替えて表示することで、ユーザーの退屈を和らげることができます。

JavaScriptを使って、スライドショー風のローディング画面を実装してみましょう。

HTMLを次のように記述します。

<div id="loading">
  <div id="slideshow">
    <img src="image1.jpg" alt="Image 1">
    <img src="image2.jpg" alt="Image 2">
    <img src="image3.jpg" alt="Image 3">
  </div>
  <p>Loading...</p>
</div>

id="slideshow"<div>要素の中に、表示したい画像を<img>要素で並べています。

CSSを次のように記述します。

#loading {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #fff;
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

#slideshow {
  position: relative;
  width: 400px;
  height: 300px;
}

#slideshow img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity 1s ease-in-out;
}

#slideshow img.active {
  opacity: 1;
}

#slideshowセレクタでは、スライドショーの表示エリアのサイズを指定しています。

#slideshow imgセレクタでは、画像を絶対配置し、object-fit: cover;で画像をトリミングして表示エリアにフィットさせています。

opacity: 0;で初期状態では画像を非表示にし、transitionプロパティでフェードイン・フェードアウトのアニメーションを設定しています。

.activeクラスが付与された画像は、opacity: 1;になり、表示されるようになります。

JavaScriptを次のように記述します。

window.addEventListener('load', function() {
  var slideshow = document.getElementById('slideshow');
  var images = slideshow.getElementsByTagName('img');
  var currentIndex = 0;

  function showNextImage() {
    images[currentIndex].classList.remove('active');
    currentIndex = (currentIndex + 1) % images.length;
    images[currentIndex].classList.add('active');
  }

  var interval = setInterval(showNextImage, 3000);

  // ページの読み込みが完了したらローディング画面を非表示にする
  document.getElementById('loading').style.display = 'none';
  clearInterval(interval);
});

window.addEventListener('load', ...)で、ページの読み込みが完了したタイミングでローディング画面を非表示にするようにしています。

showNextImage()関数では、現在表示されている画像からクラスを削除し、次の画像にクラスを追加することで、画像を切り替えています。

setInterval()を使って、一定時間ごとにshowNextImage()関数を呼び出し、スライドショーを実現しています。

実行結果は次のようになります。

(画像がスライドショーのように切り替わる)
(ページの読み込みが完了したらローディング画面が非表示になる)

スライドショー風のローディング画面を実装することで、ユーザーを飽きさせずに待ち時間を過ごしてもらうことができます。

画像の選択や切り替えのタイミングなど、細部にこだわることで、より洗練されたローディング画面になるでしょう。

●その他のローディング画面サンプル

ここまで、シンプルなローディング画面、アニメーションを使ったローディング画面、画像を使ったローディング画面の実装方法を見てきました。

しかし、ローディング画面のアイデアはまだまだたくさんあります。

ここでは、テキストアニメーションを使ったサンプルと、インタラクティブなローディング画面のサンプルを紹介します。

ユニークなアイデアを取り入れることで、ユーザーの印象に残るローディング画面を作ることができるでしょう。

○サンプルコード9:テキストアニメーション

ローディング画面にテキストアニメーションを取り入れることで、ユーザーを楽しませながら待ち時間を過ごしてもらうことができます。

CSSアニメーションを使って、テキストが typing されるようなアニメーションを実装してみましょう。

HTMLを次のように記述します。

<div id="loading">
  <p class="typing"></p>
</div>

class="typing"<p>要素を用意し、ここにテキストアニメーションを適用します。

CSSを次のように記述します。

#loading {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #fff;
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
}

.typing {
  width: 22ch;
  animation: typing 2s steps(22), blink .5s step-end infinite alternate;
  white-space: nowrap;
  overflow: hidden;
  border-right: 3px solid;
  font-family: monospace;
  font-size: 2em;
}

@keyframes typing {
  from {
    width: 0;
  }
}

@keyframes blink {
  50% {
    border-color: transparent;
  }
}

.typingセレクタでは、widthプロパティを使ってテキストの表示幅を指定しています。

chはテキストの文字数を表す単位で、ここでは22文字分の幅を指定しています。

animationプロパティで、typingアニメーションとblinkアニメーションを設定しています。

@keyframes typingルールでは、テキストの表示幅を0から指定した文字数まで広げるアニメーションを定義しています。

steps()関数を使うことで、テキストが1文字ずつ表示されるようなステップアニメーションを実現しています。

@keyframes blinkルールでは、テキストの右側にある縦線(カーソル)を点滅させるアニメーションを定義しています。

実行結果は次のようになります。

(テキストが typing されるアニメーション)

テキストアニメーションを使えば、まるでユーザーに語りかけているかのような演出ができます。

表示するテキストの内容を工夫することで、ユーザーの気持ちを掴むことができるでしょう。

○サンプルコード10:インタラクティブなローディング画面

最後に、ユーザーの操作に反応するインタラクティブなローディング画面を実装してみましょう。

ユーザーがクリックやホバーした際にアニメーションが変化するなど、インタラクティブ性を取り入れることで、ユーザーの没入感を高めることができます。

HTMLを次のように記述します。

<div id="loading">
  <div class="circle"></div>
  <div class="circle"></div>
  <div class="circle"></div>
  <div class="circle"></div>
  <div class="circle"></div>
</div>

5つのclass="circle"<div>要素を用意します。

CSSを次のように記述します。

#loading {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #000;
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
}

.circle {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  margin: 0 10px;
  background-color: #fff;
  animation: jump 1s infinite ease-in-out;
  cursor: pointer;
}

.circle:hover {
  animation-play-state: paused;
}

@keyframes jump {
  0%, 100% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-30px);
  }
}

.circleセレクタでは、丸い要素のスタイルを定義し、jumpアニメーションを設定しています。

また、cursor: pointer;でマウスカーソルを手のひらアイコンに変更し、クリック可能であることを示唆しています。

.circle:hoverセレクタでは、要素にホバーした際にanimation-play-state: paused;でアニメーションを一時停止するように設定しています。

@keyframes jumpルールでは、上下にジャンプするアニメーションを定義しています。

JavaScriptを次のように記述します。

window.addEventListener('load', function() {
  var circles = document.getElementsByClassName('circle');

  function stopAnimation() {
    for (var i = 0; i < circles.length; i++) {
      circles[i].style.animationPlayState = 'paused';
    }
  }

  function startAnimation() {
    for (var i = 0; i < circles.length; i++) {
      circles[i].style.animationPlayState = 'running';
    }
  }

  for (var i = 0; i < circles.length; i++) {
    circles[i].addEventListener('mouseover', stopAnimation);
    circles[i].addEventListener('mouseout', startAnimation);
  }

  // ページの読み込みが完了したらローディング画面を非表示にする
  document.getElementById('loading').style.display = 'none';
});

stopAnimation()関数では、すべての要素のアニメーションを一時停止し、startAnimation()関数では、すべての要素のアニメーションを再開するようにしています。

forループを使って、各要素にmouseovermouseoutのイベントリスナーを追加しています。

要素にマウスが乗った際にアニメーションを停止し、マウスが離れた際にアニメーションを再開するようにしています。

実行結果は次のようになります。

(丸い要素が上下にジャンプするアニメーション)
(要素にホバーするとアニメーションが一時停止する)

インタラクティブ性を取り入れることで、ユーザーをローディング画面に引き込むことができます。

アニメーションの動きやインタラクションの仕様を工夫し、ユーザーが楽しんで待ち時間を過ごせるような演出を考えてみてください。

●よくあるエラーと対処法

ローディング画面の実装は、JavaScriptとCSSを組み合わせることで実現できますが、時にはうまく動作しないこともあります。

初心者のうちは、エラーに遭遇することも多いでしょう。

でも、落ち着いて原因を探れば、必ず解決方法が見つかります。

ここでは、ローディング画面の実装でよく発生するエラーとその対処法を見ていきましょう。

エラーに立ち向かう勇気を持って、ステップアップを目指しましょう。

○画面が消えないときの対処法

ローディング画面を実装したのに、ページが完全に読み込まれた後もローディング画面が消えないことがあります。

このエラーは、JavaScriptでローディング画面を非表示にする処理が正しく動作していないことが原因です。

次のようなJavaScriptのコードを確認してみましょう。

window.addEventListener('load', function() {
  document.getElementById('loading').style.display = 'none';
});

このコードでは、window.addEventListener('load', ...)でページの読み込みが完了したタイミングでローディング画面を非表示にするように設定しています。

しかし、'loading'というidを持つ要素が存在しない場合、エラーが発生します。

HTMLとJavaScriptのコードを確認し、次の点をチェックしてみてください。

  • HTMLにid="loading"の要素が存在するか
  • JavaScriptで指定しているid名が正しいか
  • JavaScriptのコードが正しい位置に記述されているか

これらを確認し、修正することで、ローディング画面が正しく非表示になるはずです。

実行結果として、次のようになるはずです。

(ページが完全に読み込まれた後、ローディング画面が非表示になる)

○画像が表示されないエラーへの対応

ローディング画面に画像を使用している場合、画像のパスが正しくないとエラーが発生し、画像が表示されないことがあります。

次のようなHTMLのコードを確認してみましょう。

<div id="loading">
  <img src="loading-image.jpg" alt="Loading...">
</div>

<img>要素のsrc属性に指定している画像のパスが正しいか確認してください。

画像ファイルが存在しない場合や、パスが間違っている場合は、画像が表示されません。

また、CSSでbackground-imageプロパティを使用している場合も、同様に画像のパスを確認してください。

#loading {
  background-image: url('loading-background.jpg');
}

画像ファイルが存在し、パスが正しいことを確認したら、画像が表示されるはずです。

実行結果として、次のようになるはずです。

(ローディング画面に画像が表示される)

○ローディング画面が一瞬だけ表示される問題

ローディング画面を実装したのに、ほんの一瞬だけ表示されてすぐに消えてしまうことがあります。

この問題は、ページの読み込みが非常に速い場合に発生します。

次のようなJavaScriptのコードを確認してみましょう。

window.addEventListener('load', function() {
  document.getElementById('loading').style.display = 'none';
});

このコードでは、ページの読み込みが完了したらすぐにローディング画面を非表示にしています。

しかし、読み込みが非常に速い場合、ローディング画面がほとんど表示されない状態になってしまいます。

この問題を解決するには、ローディング画面を一定時間表示するようにします。

次のようにコードを修正してみましょう。

window.addEventListener('load', function() {
  setTimeout(function() {
    document.getElementById('loading').style.display = 'none';
  }, 1000);
});

setTimeout()を使用して、ページの読み込みが完了してから1秒(1000ミリ秒)後にローディング画面を非表示にするようにしています。

この時間を調整することで、ローディング画面の表示時間を制御できます。

実行結果として、次のようになるはずです。

(ページの読み込みが完了しても、1秒間はローディング画面が表示される)

エラーに遭遇したときは、焦らずにコードを確認し、原因を特定することが大切です。

エラーメッセージを読み、関連する部分のコードを注意深く見直してみましょう。

また、コンソールやデバッグツールを活用することで、エラーの原因を突き止めやすくなります。

●ローディング画面のベストプラクティス

ローディング画面の実装方法やエラー対処法について解説してきましたが、より良いユーザー体験を提供するには、ベストプラクティスを意識することが大切です。

ローディング時間を最適化し、ユーザーを飽きさせない工夫を凝らすことで、サイトの印象を向上させることができるでしょう。

ここでは、ローディング画面のベストプラクティスについて、具体的なコツやポイントを解説していきます。

○ローディング時間を最適化するコツ

ローディング画面を表示している間も、ユーザーにストレスを感じさせないよう、ローディング時間をできるだけ短くすることが重要です。

次のようなコツを意識することで、ローディング時間を最適化できます。

まず、不要なリソースを削減することです。

大きなサイズの画像や、使用していないライブラリなどを取り除くことで、読み込むデータ量を減らすことができます。

画像は適切なサイズにリサイズし、圧縮することも忘れずに。

また、JavaScriptやCSSのファイルを最小化することも効果的です。

コメントや空白を削除し、変数名を短くするなどの最適化を行うことで、ファイルサイズを縮小できます。

さらに、キャッシュを活用することで、2回目以降のアクセス時のローディング時間を短縮できます。

Cache-Controlヘッダを設定し、リソースをキャッシュするように指定しましょう。

ここでは、Cache-Controlヘッダを設定する例を見てみましょう。

<meta http-equiv="Cache-Control" content="max-age=3600">

この例では、リソースのキャッシュ期間を3600秒(1時間)に設定しています。

適切なキャッシュ期間を設定することで、不必要なリソースの再読み込みを防ぐことができます。

実行結果として、次のようになります。

(2回目以降のアクセス時、キャッシュされたリソースが使用され、ローディング時間が短縮される)

○ユーザー体験を考慮したデザイン

ローディング画面のデザインは、ユーザー体験に大きな影響を与えます。

ユーザーを飽きさせず、ストレスを感じさせないデザインを心がけましょう。

まず、シンプルで見やすいデザインを心がけることが大切です。

複雑な要素を詰め込みすぎず、必要最低限の情報だけを表示するようにしましょう。

ローディングアニメーションは、サイトのイメージに合ったものを選び、シンプルで洗練されたものを使用するのがおすすめです。

また、ローディング中の待ち時間を有効に活用することも重要です。

ローディング画面に、サイトの簡単な説明やヒントを表示することで、ユーザーの関心を引き付けることができます。

ゲーム要素を取り入れたり、ユーモアのある表現を使ったりするのも良いアイデアです。

ここでは、ローディング画面にメッセージを表示する例を紹介します。

<div id="loading">
  <div class="spinner"></div>
  <p>ようこそ!サイトの準備ができるまで、もう少々お待ちください。</p>
  <p>楽しいコンテンツをお届けしますので、お楽しみに!</p>
</div>

この例では、ローディングアニメーションと一緒に、ユーザーへのメッセージを表示しています。

サイトへの期待感を高めるような内容にすることで、待ち時間を有効に活用できます。

実行結果として、次のようになります。

(ローディングアニメーションとメッセージが表示される)

○ローディング画面の表示タイミングの調整方法

ローディング画面の表示タイミングも、ユーザー体験に影響を与える要素の1つです。

適切なタイミングでローディング画面を表示し、非表示にすることが大切です。

一般的には、ページの読み込みが始まった時点でローディング画面を表示し、読み込みが完了したらすぐに非表示にするのが良いでしょう。

ただし、読み込みが非常に速い場合は、ローディング画面がちらつくだけになってしまうことがあります。

そのような場合は、ローディング画面を一定時間表示するようにするのがおすすめです。

次のように、setTimeout()を使って、一定時間後にローディング画面を非表示にすることができます。

window.addEventListener('load', function() {
  setTimeout(function() {
    document.getElementById('loading').style.display = 'none';
  }, 1000);
});

この例では、ページの読み込みが完了してから1秒(1000ミリ秒)後に、ローディング画面を非表示にしています。

適切な表示時間を設定することで、ユーザーにローディング画面が見える時間を確保できます。

実行結果として、次のようになります。

(ページの読み込みが完了しても、1秒間はローディング画面が表示される)

ローディング画面のベストプラクティスを意識することで、ユーザーにとって快適な体験を提供できます。

ローディング時間の最適化、ユーザー体験を考慮したデザイン、適切な表示タイミングの調整など、細部にこだわることが大切です。

まとめ

JavaScriptとCSSを使ったローディング画面の実装方法を、様々なサンプルコードを交えて解説してきました。

基本的なものからアニメーションや画像を使った高度なものまで、実装のコツやベストプラクティスを学ぶことができたのではないでしょうか。

ローディング画面は、サイトの第一印象を決める重要な要素です。

ユーザー体験を考慮し、ローディング時間の最適化やエラー対処に気を配りながら、魅力的なローディング画面を実装していきましょう。

JavaScriptとCSSの知識を活かして、オリジナリティあふれるローディング画面を作ってみてください。