JavaScriptを使うとローディング画面を実装することができます。
これまでに動画を使って簡単にかっこいいローディング画面を実装する方法や、初回セッションのみローディングのアニメーションを動かす方法を紹介しました。
ここでは、CSSのアニメーションを使った動きのあるローディング画面を紹介します。
完成形
以下のようなCSSローディングアニメーションです。(右下のRerunをクリックすると再ロードします)
See the Pen CSSローディング画面v2 by pro gurashi (@pro-gurashi) on CodePen.
全体の流れは以下になります。
以下でコードの解説をします。
HTML
<!-- ローディング -->
<div class="my-custom-loader" id="my-custom-loader">
<div class="fulfilling-square-spinner">
<div class="spinner-inner"></div>
</div>
<p class="txt">PROGRASHI</p>
</div>
<!-- 本体 -->
<div class="my-first-view"></div>
HTMLはとてもシンプルです。
ローディング画面の要素として、①くるくる回転して満たされるアイコン、②テキストの2つの要素を設置しています。
CSS
全体像
/* ローディング画面終了後のファーストビュー */
.my-first-view{
height: 100vh;
background-image: url(https://prograshi.com/wp-content/uploads/2024/06/image-125.jpg);
background-size: cover;
background-repeat: no-repeat;
}
/* ローディング画面 */
.my-custom-loader{
position: fixed;
width: 100%;
height: 100%;
background-color: #fff;
z-index: 400;
top: 0;
left: 0;
display: flex;
justify-content: center;
align-items: center;
}
.my-custom-loader .txt {
font-size: 45px;
font-weight: bold;
color: #1D3B56;
display: none;
}
.my-custom-loader .fulfilling-square-spinner{
display: none;
}
/* スピンするアイコンのCSS*/
.fulfilling-square-spinner , .fulfilling-square-spinner * {
box-sizing: border-box;
}
.fulfilling-square-spinner {
height: 50px;
width: 50px;
position: relative;
border: 4px solid #1D3B56;
animation: fulfilling-square-spinner-animation 4s infinite ease;
}
.fulfilling-square-spinner .spinner-inner {
vertical-align: top;
display: inline-block;
background-color: #1D3B56;
width: 100%;
opacity: 1;
animation: fulfilling-square-spinner-inner-animation 4s infinite ease-in;
}
@keyframes fulfilling-square-spinner-animation {
0% {
transform: rotate(0deg);
}
25% {
transform: rotate(180deg);
}
50% {
transform: rotate(180deg);
}
75% {
transform: rotate(360deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes fulfilling-square-spinner-inner-animation {
0% {
height: 0%;
}
25% {
height: 0%;
}
50% {
height: 100%;
}
75% {
height: 100%;
}
100% {
height: 0%;
}
}
ローディングの核となるCSS
CSSは長いですが、長いのはクルクル回るアイコンの部分です。
ローディング画面の核となるCSSは割とシンプルです。
/* ローディング画面終了後のファーストビュー */
.my-first-view{
height: 100vh;
background-image: url(https://prograshi.com/wp-content/uploads/2024/06/image-125.jpg);
background-size: cover;
background-repeat: no-repeat;
}
/* ローディング画面 */
.my-custom-loader{
position: fixed;
width: 100%;
height: 100%;
background-color: #fff;
z-index: 400;
top: 0;
left: 0;
display: flex;
justify-content: center;
align-items: center;
}
.my-custom-loader .txt {
font-size: 45px;
font-weight: bold;
color: #1D3B56;
display: none;
}
.my-custom-loader .fulfilling-square-spinner{
display: none;
}
ローディング画面はwidthとheight100%で白色(#fff)の背景にしています。
要素を真ん中に表示したいためflexで上下左右中央寄せにしています。
また、もともとあるWEBサイトの要素の下側に回らないようにz-indexを大きな数値にしておきます。z-index: 400;
また、クルクル回るアイコンとテキストの表示はJavaScriptでコントロールするため、デフォルトは非表示にしておきます(display: none;
)
クルクル回るオシャレなCSSアニメーション
ここで使用しているクルクル回るオシャレなCSSアニメーションは、Epic Spinnersというサイトで無料で公開されているものです。
使いたいアイコンをクリックするとコードが表示されます。
CSSで色など基本的な部分を変更すればオリジナルのアニメーションになります。
JavaScript
コード全体像
document.addEventListener('DOMContentLoaded', function() {
// CSSアニメーションアイコンの表示
function show_load() {
const spinner = document.querySelector('#my-custom-loader .fulfilling-square-spinner');
spinner.style.display = 'block';
spinner.style.transition = 'opacity 0.4s';
spinner.style.opacity = '1';
}
// CSSアニメーションアイコンを非表示
function hide_load() {
const spinner = document.querySelector('#my-custom-loader .fulfilling-square-spinner');
spinner.style.transition = 'opacity 0.4s';
spinner.style.opacity = '0';
setTimeout(function() {
spinner.style.display = 'none';
}, 400);
}
// テキストを表示
function show_txt() {
const txt = document.querySelector('#my-custom-loader .txt');
txt.style.display = 'block';
txt.style.transition = 'opacity 0.4s';
txt.style.opacity = '1';
}
// ローディング画面を非表示
function end_loader() {
document.getElementById('my-custom-loader').style.transition = 'opacity 0.8s';
document.getElementById('my-custom-loader').style.opacity = '0';
setTimeout(function() {
document.getElementById('my-custom-loader').style.display = 'none';
}, 800);
}
window.addEventListener('load', function() {
// CSSアニメーションを開始
setTimeout(function() {
show_load();
}, 800);
// CSSアニメーションを終了
setTimeout(function() {
hide_load();
}, 3500);
// テキストアニメーションを開始
setTimeout(function() {
show_txt();
}, 4000);
// ローディング画面を非表示
setTimeout(function() {
end_loader();
}, 5000);
});
});
ローディングの肝となるJavaScriptによる処理です。やりたい動きにあわせて次の4つの関数を用意しています。
DOMContentLoaded
まずは、画面をロードしたときにロード画面を読み込む処理を実行したいので、addEventListenerメソッドの「DOMContentLoaded」を使います。
「DOMContentLoaded」を指定すると、DOMコンテンツが読み込まれたとき、つまり、HTML要素がすべて読み込まれ、解析された後に実行します。
この基本構文は次のようになっています。
document.addEventListener("DOMContentLoaded", (event) => {});
CSSアニメーションアイコンの表示: show_load
CSSアニメーションアイコンの表示する関数として「show_load」を定義しています。
// CSSアニメーションアイコンの表示
function show_load() {
const spinner = document.querySelector('#my-custom-loader .fulfilling-square-spinner');
spinner.style.display = 'block';
spinner.style.transition = 'opacity 0.4s';
spinner.style.opacity = '1';
}
デフォルトではdispalyがnoneになっているので「block」にして表示します。
呼び出されると、0.4秒かけてopacityを1にします。
CSSアニメーションアイコンを非表示:hide_load
CSSアニメーションアイコンがくるりと回ったら、非表示にする関数を「hide_load」として定義しています。
// CSSアニメーションアイコンを非表示
function hide_load() {
const spinner = document.querySelector('#my-custom-loader .fulfilling-square-spinner');
spinner.style.transition = 'opacity 0.4s';
spinner.style.opacity = '0';
setTimeout(function() {
spinner.style.display = 'none';
}, 400);
}
0.4秒かけてopacityを0にします。
opacityが0になったのと同時にdisplay:noneで完全に非表示にします。
テキストを表示: show_txt
デフォルト非表示になっているテキストを表示する処理を「show_txt」で定義しています。
// テキストを表示
function show_txt() {
const txt = document.querySelector('#my-custom-loader .txt');
txt.style.display = 'block';
txt.style.transition = 'opacity 0.4s';
txt.style.opacity = '1';
}
デフォルトではdispalyがnoneになっているので「block」にして表示します。
呼び出されると、0.4秒かけてopacityを1にします。
ローディング画面を非表示: end_loader
最後にローディング画面自体を非表示にする処理を「end_loader」で定義します。
// ローディング画面を非表示
function end_loader() {
document.getElementById('my-custom-loader').style.transition = 'opacity 0.8s';
document.getElementById('my-custom-loader').style.opacity = '0';
setTimeout(function() {
document.getElementById('my-custom-loader').style.display = 'none';
}, 800);
}
0.8秒かけてopacityを0にし、0になったと同時にdisplayをnoneにします。
setTimeoutで実行タイミングを指定する
関数の定義ができたら、setTimeoutを使って実際にその関数を順番に動かす処理を記述します。
window.addEventListener('load', function() {
// CSSアニメーションを開始
setTimeout(function() {
show_load();
}, 800);
// CSSアニメーションを終了
setTimeout(function() {
hide_load();
}, 3500);
// テキストアニメーションを開始
setTimeout(function() {
show_txt();
}, 4000);
// ローディング画面を非表示
setTimeout(function() {
end_loader();
}, 5000);
});
addEventListenerの「load」はDOMだけでなく、CSSや画像などの外部リソースなどすべての要素を読み込んだあとに実行するイベントリスナーです。
// CSSアニメーションを開始
setTimeout(function() {
show_load();
}, 800);
ページのロードが終わったら、0.8秒後に「show_load」関数を実行します。show_loadで0.4秒かけてアイコンのアニメーションを表示します。
// CSSアニメーションを終了
setTimeout(function() {
hide_load();
}, 3500);
CSSのアニメーションがくるりと一周回って、四角が埋まるタイミングに合わせて「hide_load」を実行します。
ここではページロード後3.5秒してから実行しています。(※アニメーションの動きに合わせて適宜調整します)
// テキストアニメーションを開始
setTimeout(function() {
show_txt();
}, 4000);
ページロード後4秒後にテキストを表示する「show_txt」を実行します。
// ローディング画面を非表示
setTimeout(function() {
end_loader();
}, 5000);
ページロード後5秒後にローディング画面自体を非表示にする「end_loader」関数を実行します。
「end_loader」は0.8秒かけて非表示になるため、ローディングのアニメーションは全体で5.8秒間となります。