【javascript】既読量をパーセンテージで表示する方法

やりたいこと
以下のように、 要素がスタートラインに入ったら、 スクロール量を計算 & 既読量をパーセンテージで表示し、 要素のbottomがエンドラインに来たら、既読量が100%になるようにする 方法を紹介します。
要素のtopがスタートラインに来た時
以下の画像が、要素がスタートラインに来た時です。
ぴったり0にはなりませんでしたが、 スタートラインに来た時、スクロール量が156px、 contentのbottomとスタートラインの距離が1793px
スタートラインからのスクロール量/1973*100 でパーセンテージが得られます。

スタートラインからのスクロール量
スタートラインが画面上端から100pxなので、- 100とする。
スクロールの途中でも、一定の値を取得するため、+ window.scrollYとする。
const contentStartValue =
content.getBoundingClientRect().top - 100 + window.scrollY;

全体のスクロール量からcontentStartValue(ここでは156px)を引くことにより、 スタートラインからのスクロール量 が得られる。
window.scrollY - contentStartValue // スタートラインからのスクロール量
参考

contentのbottomとエンドラインとの距離
以下のように、要素がスタートラインに来た時から、 要素のbottomがエンドラインに来た時までの距離を計算します。
const contentToBottomlineValue =
content.getBoundingClientRect().bottom -
window.innerHeight + // 画面の高さを引く
100 - // エンドライン100pxを加える
contentStartValue + // スタートラインまでの156pxを引く
window.scrollY; // スクロール量を加える
スクロールイベントによりパーセンテージを計算
以上の変数を利用し、既読量を計算します。
const percent = () => {
percentage = Math.floor( // 小数点以下を切捨て
((window.scrollY - contentStartValue) / contentToBottomlineValue) * 100
);
if (percentage >= 0) { // パーセンテージが0より大きいの場合
per.textContent = `${percentage}%`;
}
if (percentage > 100) { // パーセンテージが100より大きい時は100%と表示
per.textContent = "100%";
}
if (window.scrollY == 0) { // スクロール量が0以上の場合
per.textContent = "0%";
}
};
document.addEventListener("scroll", percent);
参考

まとめ
- スタートラインを決め、そこからのスクロール量を計算する。
- 要素のbottomとエンドラインとの距離を計算する。
- (スクロール量 - 要素とスタートラインまでの距離) / (要素のbottomとエンドラインまでの距離) * 100
こんな記事も読まれています。
-
【HTML】【CSS】【javascript】電卓の作り方
電卓のソースコードを2つ紹介します。javascriptはわずか数行で書けます。
-
【JacvaScript】【CSS】たった4行のJavaScriptでできるハンバーガーメニューの作り方
たった4行のJavaScriptで作るハンバーガーメニューの作り方について紹介します。✖をつくるには、transform-originがポイントです。
- リンク
-
波紋エフェクトを表現するjqueryのripples-min.jsの使い方
jqueryのripples-min.jsを使うと簡単に水面の波紋を表現できます。波紋の広がりの速度、波紋の大きさ、波紋のブレの値を変えていろいろ表現させると面白いです。
-
【Javascript】querySelectorAllで要素を取得し、クリックしたら、クラスを追加したり、削除したりする方法。
JavascriptのquerySelectorAllで要素を取得し、クリックしたら、クラスを追加したり、削除したりする方法について解説します。querySelectorと同じように書いてしまうとエラーがでます。forEachを使うとすべてに適用できます。
- リンク
-
要素の高さを取得する方法。getBoundingClientRectとは?window.innerHeightとは?window.pageYOffsetとは?
要素の高さを取得する方法について解説します。getBoundingClientRect、window.innerHeight、window.pageYOffsetについて理解し、要素がいつ画面に現れるかを把握できるようにしましょう。
-
Javascriptを使ったページネーションの実装
トップページの記事が増えてきたので、何とかページネーションで最新の記事だけを表示できないかと思っていたら、いい記事を発見しました。カスタマイズして実装することができました。
- リンク
-
【Javascript】マウスの指す(X, Y)座標とドラッグ & ドロップを理解する
マウスの指す(X, Y)座標とドラッグ & ドロップについて解説します。mousedown, mouseover, mousemove, mouseupを使います。
-
【javascript】連想配列をテーブルできれいに表示する方法
javascript(Object.entries)を使って、連想配列の中身をテーブルできれいに表示する方法について紹介します。
- リンク