【JS&CSS】タスクの進捗状況を示すプログレスバーの実装方法
本記事では、以下のようなプログレスバーを作る方法を紹介します。
不定型プログレスバー(indeterminate)
- 不定型プログレスバー(indeterminate)
-
バーが進んでいるように見えるが、具体的な進捗は示さないタイプ。
主にローディングアイコンとして使われ、ユーザーに何かが進行中であることを視覚的に伝えられます。
- 決定型プログレスバー(determinate)
-
進行状況が視覚的に分かるタイプ。
上の例では、タスクの完了数(チェックの数)に応じてバーの進み具合が変わります。
目次
プログレスバーの実装コード(HTML / CSS / JavaScript)
本実装では、不定型はHTMLとCSSのみを使用し、決定型はHTMLとCSSに加えてJavaScriptも使用します。
不定型プログレスバー(indeterminate)
@keyframes
で指定したアニメーション(プログレスバーが左側から中央に移動し、右側へ流れる)を繰り返します。バーの位置はposition
プロパティで外枠内に収まるようにし、外枠からはみ出た部分はoverflow: hidden;
で見えないようにします。
<div class="indeterminate-bar-container">
<div class="indeterminate-bar"></div>
</div>
/* 不定型プログレスバーの外枠(コンテナ)のスタイル */
.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; /* 2秒ごとに繰り返すアニメーション(下記)を適用 */
}
/* アニメーションの定義 */
@keyframes indeterminate {
0% {
left: -50%; /* アニメーション開始時、バーの左端がコンテナの外側(-50%)に */
width: 50%;
}
50% {
left: 25%; /* アニメーションの途中でバーが中央付近に移動 */
width: 50%;
}
100% {
left: 100%; /* 最後にバーがコンテナの右端の外側に移動 */
width: 50%;
}
}
決定型プログレスバー(determinate)
チェックボックスをクリックしたとき、チェックされている数に応じてプログレスバーの幅サイズを変化させます。また、CSSでtransition
プロパティを設定しておくことで幅の変化が緩やかになり、プログレスバーが滑らかに動いているように見せられます。
<div class="progress-bar-container">
<div class="progress-bar" id="progress-bar"></div>
</div>
<div class="progress-options">
<label>
<input type="checkbox" class="progress-check"> Task 1
</label>
<label>
<input type="checkbox" class="progress-check"> Task 2
</label>
<label>
<input type="checkbox" class="progress-check"> Task 3
</label>
</div>
/* プログレスバーの外枠(コンテナ)のスタイル */
.progress-bar-container {
width: 100%;
height: 20px;
background-color: #f3f3f3;
overflow: hidden;
border-radius: 5px;
margin-bottom: 20px;
}
/* プログレスバー自体のスタイル */
.progress-bar {
width: 0%;
height: 100%;
background-color: #4caf50;
transition: width 0.3s ease;
}
/* チェックボックス(タスク)のスタイル */
.progress-options {
display: flex;
justify-content: center;
gap: 20px;
}
const checkboxes = document.querySelectorAll('.progress-check');
// チェックボックスがクリックされたときの進捗バー更新処理
checkboxes.forEach(function(checkbox) {
checkbox.addEventListener('change', updateProgress);
});
function updateProgress() {
const totalCheckboxes = document.querySelectorAll('.progress-check').length; // 全チェックボックスの数
const checkedCount = document.querySelectorAll('.progress-check:checked').length; // チェックされている数
const progressBar = document.querySelector('#progress-bar');
// 全チェックボックスに対してチェックされている割合を計算
const progress = (checkedCount / totalCheckboxes) * 100;
// プログレスバーの幅を更新
progressBar.style.width = progress + '%';
}
updateProgress関数
- すべてのチェックボックスの数と、チェックされているチェックボックスの数を計算します。
- その割合に基づいて、プログレスバーの幅を
style.width
で変更します。
(チェックボックスが3つ中2つ選択されていれば、幅は (2/3) * 100 = 66.67% になります。)
この実装ではチェックボックスは3つですが、チェックボックスの数に応じて動作するため、数が増減しても動作します。
当サイトで公開しているWebデザインやUIの実装例は、一覧として以下記事に纏めています。
あわせて読みたい
Webデザイン・UIコンポーネント集(HTML/CSS/JS)
Webサイトやアプリで使われている『Webデザイン』や『UI』の実装例を纏めました。(随時更新中)実装方法などは別記事にコードや実装ポイントを公開していますので、自…