ローディングアイコン 実装解説|Loading Icon CSS & JS Guide

ローディングアイコン デザイン見本

CSS の @keyframes アニメーションで作る3種類のローディングアイコンと、JavaScript でページ読み込み完了まで表示する制御方法をまとめた実装デモです。コピーしてすぐに使えるHTML・CSS・JSのコードを掲載しています。

① 回転する円 — border で一部だけ色を付けて回転

アニメーション: spin 1s linear infinite

HTML
<div class="container">
  <div class="spinner"></div>
</div>
CSS
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: white;
  z-index: 9999;
}

.spinner {
  width: 60px;
  height: 60px;
  border: 6px solid rgba(0, 0, 0, 0.2);
  border-top: 6px solid #333;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

@keyframes spin {
  0%   { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
border の一部だけを濃い色にして回転させる

border: 6px solid rgba(0,0,0,0.2) で薄いリング全体を作り、border-top だけを濃い色で上書きします。これを @keyframes spin で 0deg → 360deg に回転させることで、「一部が強調されたリングがぐるぐる回る」ローディングアイコンが完成します。ボタンで速度を切り替えるとコードも連動して更新されます。

② 複数のドットが拡大縮小 — animation-delay でリズムを作る

HTML
<div class="container">
  <div class="spinner-2">
    <div class="dot"></div>
    <div class="dot"></div>
    <div class="dot"></div>
  </div>
</div>
CSS
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: white;
  z-index: 9999;
}

.spinner-2 {
  display: flex;
  gap: 20px;
}

.dot {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background-color: #333;
  animation: bounce 1.2s infinite ease-in-out;
}

.dot:nth-child(1) { animation-delay: -0.24s; }
.dot:nth-child(2) { animation-delay: -0.12s; }
.dot:nth-child(3) { animation-delay: 0; }

@keyframes bounce {
  0%, 100% { transform: scale(1); }
  50%       { transform: scale(1.5); }
}
animation-delay の負の値でズレを作り「連動した動き」に見せる

同じ @keyframes bounce を3つのドットに適用し、animation-delay-0.24s / -0.12s / 0s とずらすことで、波打つようなリズミカルな動きになります。負の値を使うとアニメーションが途中から始まるため、ページ表示直後から動きが見え、「止まっている」印象を与えません。

③ 不定形プログレスバー — position + overflow で端をはみ出させる

HTML
<div class="indeterminate-bar-container">
  <div class="indeterminate-bar"></div>
</div>
CSS
.indeterminate-bar-container {
  width: 100%;
  height: 20px;
  background-color: #f3f3f3;
  overflow: hidden;
  border-radius: 5px;
  position: relative;
}

.indeterminate-bar {
  width: 100%;
  height: 100%;
  background-color: #4caf50;
  position: absolute;
  animation: indeterminate 2s infinite;
}

@keyframes indeterminate {
  0%   { left: -50%; width: 50%; }
  50%  { left: 25%;  width: 50%; }
  100% { left: 100%; width: 50%; }
}
position: absolute + overflow: hidden でバーをコンテナ内に収める

外枠に position: relative; overflow: hidden を設定し、バー要素を position: absolute にします。@keyframes indeterminate でバーを左端の外側(left: -50%)から右端の外側(left: 100%)へ移動させます。外枠からはみ出た部分は overflow: hidden で隠れるため、終わりのない不定型なプログレスバーが完成します。

④ ページ読み込み完了まで表示する — window ‘load’ イベントで制御

ページコンテンツ

2 秒間のローディングが表示されます

HTML
<div class="container">
  <div class="spinner"></div>
</div>

<main>
  <!-- ページ本体のコンテンツ -->
</main>
CSS
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: white;
  z-index: 9999;
}

body.loaded .container {
  display: none;
}

.spinner {
  width: 60px;
  height: 60px;
  border: 6px solid rgba(0, 0, 0, 0.2);
  border-top: 6px solid #333;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

@keyframes spin {
  0%   { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
JS
window.addEventListener('load', function() {
  document.body.classList.add('loaded');
});
window ‘load’ イベントで body に ‘loaded’ クラスを付与して非表示にする

window.addEventListener('load', ...) は画像・動画を含むすべてのリソースの読み込みが完了したタイミングで発火します。このタイミングで bodyloaded クラスを付与し、CSSの body.loaded .container { display: none; } でローディングアイコンを隠します。ページが表示可能になった瞬間に自動で切り替わるため、処理の遅いページでの待機中のUXを改善できます。


当サイトで公開しているWebデザインやUIの実装例は、一覧として以下記事に纏めています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次