ユーザーにとって価値ある情報を繰り返し発信していく「まるログ」

プログレスバーでページのスクロール進捗状況を可視化

プログレスバーとは

プログレスバーは、長時間かかるタスクの進捗状況がどの程度完了したのかを視覚的・直感的に表示するバーのことです。ファイルの転送時やアプリケーションのインストール時などによく見かけますね。%表記でどこまで完了したかを数値で表示するものもありますが、今回はページのスクロール進捗状況をアニメーションで分かりやすく表示する方法をご紹介します。

HTMLタグ<progress>

プログレスバー自体をイチから作ってもよいのですが、実はHTMLのタグに<progress>というものが用意されていますので、今回はこれを利用します。アニメーションしないプログレスバーであればHTMLだけで実装が可能で、ある程度CSSで見た目の調整もできます。

<!-- _HTML -->

<progress value="50" min=”0” max="100">50%</progress>


・value:バーの進捗状況を表す数値
・min:バーの最小値
・max:バーの最大値

タグの中のテキストは通常は表示されません(古いブラウザでタグ対応していない場合に表示されます)
Google Chromeのデフォルトではこのように表示されます。

ページのスクロール量に応じてアニメーションをつける

ページのスクロール量に応じてバーをアニメーションさせます。

<!-- _HTML -->

<progress id="progress-bar" value="" min="0" max="100"></progress>


進捗状況を0~100とする場合、minを0、maxを100に設定します。(アニメーションをよりなめらかにしたい場合は、目盛りを細かくするためmaxの数値を増やします)
実際の進捗状況であるvalueはJavaScriptで操作するので空にしておきます。

/* _CSS */

/* スタイルをリセット */
progress{ -webkit-appearance: none; }

/* バーの背景色 */
progress::-webkit-progress-bar { background-color: #ffffff; }

/* バーの色 */
progress::-webkit-progress-value { background-color: #00aa8c; } 
progress::-moz-progress-bar { background-color: #00aa8c; }
progress::-ms-fill { background-color: #00aa8c; }


CSSで幅、高さ、バーの色、背景色、ボーダーなどを指定することができます。ベンダープレフィックスが必要なので併せて設定しましょう。

//_JavaScript

<script src="//ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js">
</script>

<script>
//#progress-barを取得
const progress = document.getElementById("progress-bar");

//ページ読み込み時、スクロール時に発火
$(window).on("load scroll ", function () {

//スクロール量(px)
let scrollvaluepx = document.documentElement.scrollTop;

//まだスクロールされていない部分の高さを取得
let hiddenHeight =
document.documentElement.scrollHeight – 
document.documentElement.clientHeight;

//スクロール量(%)乗算の値は<progress>のmax値に合わせる
let scrollValue = Math.round((scrollValuepx/ hiddenHeight) * 100);

//<progress>のvalueにスクロール値を代入
progress.value = scrollValue;

});
</script>


jQueryを読み込み、ページのスクロールした際にプログレスバーをアニメーションさせるJavaScriptを記述します。

デモページ

上記を調整したデモページがこちらになります。上部に常にプログレスバーを表示するようにしてみました。スクロールして確認してみてください。

プログレスバーはユーザーにページのコンテンツ量をひと目で知らせたり、段階を踏んで情報を入力してもらうページでのタスク量を視覚的に知らせたり、といった活用法があります。
組み込み方次第でユーザビリティの向上が期待できますので、利用してみてください。

WEBプログラマー / O.K