ローディング表示
いろいろなシステムにおいて、ユーザがアクションを起こしたのに画面が何も変わらなかったら、ユーザは不安になってしまいます。
そのため、Webシステムなどであればページの読み込みやサーバ問い合わせ中にローディングを表示したりします。
よく利用する機能ですので、フレームワークなどで用意してくれてたらなと思うのですが、システムや開発者によって実装方法が異なるためか、決まった形式のものが存在しません。
今回は私がよく利用するローディング表示を Bootstrap5 を利用して示したいと思います。 Bootstrap5 では Bootstrap4 にはなかった細かな設定が含まれましたので、それを利用することで必要な CSS を最小限にすることができます。(2021年9月現在 Bootstrap5 はまだベータ版であるため、正式版がリリースされたときに実装が異なる可能性があります。)
ローディング表示実装
CSS
必要な追加のスタイルはこれだけです。ローディング表示背景の色は黒を 50% 透過させていたます。また最前面に表示する必要があるため、z-index に大きな値を設定しています。
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<style>
#loading {
background: rgba(0, 0, 0, .5);
z-index: 10000;
}
</style>
HTML
次は HTML を見てみましょう。ローディング中を示すために、 Bootstrap の spinner を利用しています。ID: loading のクラスや、その子要素のクラスを見ると、多数の Bootstrap で設定されているクラスが利用されています。その多くは Bootstrap5 から用意されたものが多いです。 Bootstrap5 は便利ですね。
<div id="loading" class="position-absolute top-0 start-0 w-100 h-100 d-none">
<div class="text-center position-absolute top-50 start-50 w-100 translate-middle">
<div class="spinner-border text-light" role="status">
<span class="sr-only"></span>
</div>
</div>
</div>
JavaScript
それではローディングを表示・非表示させましょう。実装方法は人によって異なりますが、私は Bootstrap5 の d-none クラスを利用します。 d-none クラスが追加されると要素が非表示、削除されると要素が表示されるので、それを利用して show_loading メソッドと hide_loading メソッドを用意しました。
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script>
$(function () {
//ローディング表示
show_loading();
//5秒後にローディング非表示
setTimeout(function () {
hide_loading();
}, 5000);
})
//ローディング表示
function show_loading() {
$('#loading').removeClass('d-none');
}
//ローディング非表示
function hide_loading() {
$('#loading').addClass('d-none');
}
function hello() {
console.log('Hello');
}
</script>
ソースコード全体
ソースコード全体を示します。今回はコンソールに「Hello」と表示するボタンも用意しています。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Loading</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<style>
#loading {
background: rgba(0, 0, 0, .5);
z-index: 10000;
}
</style>
</head>
<body>
<div id="loading" class="position-absolute top-0 start-0 w-100 h-100 d-none">
<div class="text-center position-absolute top-50 start-50 w-100 translate-middle">
<div class="spinner-border text-light" role="status">
<span class="sr-only"></span>
</div>
</div>
</div>
<div>
<button class="btn btn-primary" onclick="hello();">ハロー</button>
</div>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script>
$(function () {
//ローディング表示
show_loading();
//5秒後にローディング非表示
setTimeout(function () {
hide_loading();
}, 5000);
})
//ローディング表示
function show_loading() {
$('#loading').removeClass('d-none');
}
//ローディング非表示
function hide_loading() {
$('#loading').addClass('d-none');
}
function hello() {
console.log('Hello');
}
</script>
</body>
</html>
このソースコードを実行すると、画面表示と共にローディングが表示されます。そして 5 秒後にそのローディングが消えます。ローディング表示中にハローボタンを押下しても何も起きませんが、ローディングが消えた後はボタン押下によりコンソールに「Hello」と表示され、ローディング表示によりその背後にあるコントロールが操作できないことがわかります。
まとめ
Webシステムには必要不可欠なローディング表示を紹介しました。ローディング表示はシステムや開発者によって異なりますので、もしお気に召して頂けたら本ソースコードを自分なりに改造してご利用ください。