
Webサイトを訪れた際、第一印象を左右する大きな要素のひとつが「読み込み時の体験」です。
今回は、訪問者に好印象を与えるローディングアニメーションの実装方法をご紹介します。
完成デモの紹介
まずはデモをご覧ください。
See the Pen ローディングアニメーション by はなはな氏 (@wxftomuu-the-selector) on CodePen.
ソースコードについて
HTML
今回のサンプルでは、ダルマの画像に加え「LOADING」という文字とドットアニメーションを表示しています。
画像は必須ではなく、テキストのみで構成するシンプルなローディング表現に置き換えることも可能です。
<h3>ローディングアニメーション</h3>
<!-- jQueryを読み込む(CDN) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<!-- メインコンテンツ(例) -->
<div class="container">
<div class="item">
<!-- ここに表示されるメッセージは、初回読み込み後に表示される通常のページ内容です -->
<p>ブラウザを閉じない限りローディング画面が<br/>
再度表示されることはありません。</p>
</div>
</div>
<!-- ローディングオーバーレイ -->
<!-- 初回アクセス時のみ表示したいローディング用の要素 -->
<div id="site_loader_overlay">
<div id="site_loader_logo">
<div id="site_loader_logo_inner">
<!-- ロゴ画像 -->
<div class="logo_image">
<img src="https://mrhanahana.com/cms/wp-content/uploads/2025/08/img_loading.png" alt="ロード中" class="use_logo_animation" />
</div>
<!-- ローディング中のテキスト -->
<div class="message">
<div class="message_inner">
<div class="text">LOADING</div>
<!-- ドットがアニメーションしながら表示される領域 -->
<div class="dot_animation_wrap">
<div class="dot_animation"> <i></i><i></i><i></i> </div>
</div>
</div>
</div>
</div>
</div>
</div>
CSS
画像を画面中央に配置し、フェードイン・上下の揺れ、ドットアニメーションを組み合わせることで、シンプルながら動きのあるローディング画面を実現しています。
また、レスポンシブ対応もしているため、PC・タブレット・スマホなどあらゆるデバイスで最適な表示が行われるようになっています。
/* ----------------------------------------
コンテンツスタイル(任意で変更可能)
---------------------------------------- */
/*
この部分は、ローディングアニメーションを適用するための
サンプルレイアウト(見た目)のスタイルです。
実際のサイトに合わせて、自由にカスタマイズしてください。
*/
body {
background: #1a8093;
}
h3 {
text-align: center;
color: #fff;
}
.container {
text-align: center;
color: #ccc;
}
/* -----------------------------------------
ローディング画面全体
--------------------------------------------*/
#site_loader_overlay {
display: block; /* 表示状態にしておく(初期表示) */
background: #fff;
opacity: 1;
position: fixed;
top: 0px; left: 0px;
width: 100vw;
height: 100vh;
z-index: 100;
}
/* ロゴ全体を中央に配置するためのラッパー */
#site_loader_logo {
position: relative;
width: 100%;
height: 100%;
}
/* ロゴ&メッセージの中央表示 */
#site_loader_logo_inner {
position: absolute;
text-align: center;
width: 100%;
top: 50%;
transform: translateY(-50%);
}
/* ロゴ画像エリア */
#site_loader_logo_inner .logo_image {
position: relative;
display: inline-block;
width: fit-content;
margin: 0 auto;
opacity: 0; /* 最初は非表示 → アニメーションで表示 */
}
/* 画像の下に入れる楕円状の影 */
#site_loader_logo_inner .logo_image::after {
content: "";
position: absolute;
left: 50%;
bottom: -15px;
width: 80%;
height: 15px;
background: rgba(0, 0, 0, 0.4);
transform: translateX(-50%);
border-radius: 50%;
filter: blur(4px);
}
/* ロゴ画像のフェードインアニメーション */
#site_loader_logo.active .logo_image {
animation: opacityAnimation 1.4s ease forwards 0.5s;
}
/* 画像サイズ */
#site_loader_logo_inner .logo_image img {
width: 10vw;
}
/* ロゴ画像に上下に揺れるアニメーションを付与 */
#site_loader_logo img.use_logo_animation {
position: relative;
animation: slideUpDown 1.5s ease-in infinite;
}
/* LOADING テキスト全体 */
#site_loader_logo_inner .message {
text-align: center;
margin: 30px auto 0;
display: table;
font-size: 16px;
color: #333;
opacity: 0; /* 最初は非表示 → 後でフェードイン */
animation: opacityAnimation 1.4s ease forwards 1.5s;
}
/* “LOADING” 本体 */
#site_loader_logo_inner .text {
display: inline;
}
/* ドットアニメーションを横に並べるためのラッパー */
#site_loader_logo_inner .dot_animation_wrap {
display: inline;
margin-left: 4px;
position: absolute;
}
/* 各ドット共通のスタイル */
#site_loader_logo_inner i {
width: 2px;
height: 2px;
margin-right: 4px;
border-radius: 100%;
display: inline-block;
background: #333;
animation: loading-dots-middle-dots 0.5s linear infinite;
}
/* 1つ目のドット用(透明→表示されながら右に動く)*/
#site_loader_logo_inner i:first-child {
opacity: 0;
animation: loading-dots-first-dot 0.5s linear infinite;
transform: translate(-4px);
}
/* 3つ目のドット用(右に動きながら透明になる)*/
#site_loader_logo_inner i:last-child {
animation: loading-dots-last-dot 0.5s linear infinite;
}
/* -----------------------------------------
レスポンシブ
--------------------------------------------*/
@media only screen and (max-width:1023px) {
/* タブレットサイズ:ロゴ少し大きめ */
#site_loader_logo_inner .logo_image img {
width: 20vw;
}
}
@media only screen and (max-width:425px) {
/* スマホサイズ:ロゴさらに大きめ */
#site_loader_logo_inner .logo_image img {
width: 30vw;
}
}
/* -----------------------------------------
アニメーション定義
--------------------------------------------*/
@keyframes opacityAnimation {
0% { opacity: 0; }
100% { opacity: 1; }
}
/* ロゴ画像が上下に揺れる動き */
@keyframes slideUpDown {
0% { bottom: 10px; }
50% { bottom: 0; }
100% { bottom: 10px; }
}
/* ドット1つ目 */
@keyframes loading-dots-first-dot {
100% { transform: translate(6px); opacity: 1; }
}
/* ドット2つ目 */
@keyframes loading-dots-middle-dots {
100% { transform: translate(6px); }
}
/* ドット3つ目 */
@keyframes loading-dots-last-dot {
100% { transform: translate(6px); opacity: 0; }
}
JS
sessionStorage を利用して一度表示したかどうかを判定し、2回目以降のアクセスではローディング画面をスキップするようになっています。
// ローディングアニメーション
// ----------------------------------
$(document).ready(function () {
var $overlay = $('#site_loader_overlay'); // オーバーレイ要素
var isFirstVisit = !sessionStorage.getItem('site_loader_shown'); // 初回アクセスかどうか判定
// すでに表示済みであればローディングを表示せず終了
if (!isFirstVisit) {
$overlay.remove(); // 2回目以降はローディング自体を使わないため要素ごと削除
return;
}
// 初回アクセスであることを保存
sessionStorage.setItem('site_loader_shown', 'true');
// オーバーレイを表示(高さもウィンドウサイズに合わせる)
$overlay.css({
display: 'block',
height: $(window).innerHeight()
});
// ロゴにアニメーション用のクラスを付与(CSSアニメーション開始)
$('#site_loader_logo').addClass('active');
// ローディング終了時にオーバーレイをフェードアウトさせる関数
function after_load() {
$overlay.delay(600).fadeOut(900);
}
// 3秒後にまだ表示されているならフェードアウトを実行
// ローディング画面に閉じ込められないようにする保険
setTimeout(function () {
if ($overlay.is(':visible')) {
after_load();
}
}, 3000);
});
まとめ
今回紹介したローディング画面を取り入れることで、訪問者に第一印象で好感を与えることができるシンプルなアニメーションを実装することができます。
実装自体はシンプルですので、ぜひご自身のサイトでも気軽に試してみてください。
なお、弊社では「サイトの更新まで手が回らない…」という方向けに、更新作業の代行や技術的なサポートも承っております。「同じように実装したけれどうまく動かない」などお困りの際は、お気軽にご相談ください。
少しでもこの記事がお役に立てれば幸いです。最後までお読みいただき、ありがとうございました。