↓ この枠内をスクロール
読み進めた量が上部のバーにリアルタイムで反映されます。ブログや長文記事の「読了率」表示の定番パーツです。
あとどれくらいで読み終わるかがひと目で分かるため、離脱防止にも効果があると言われています。
バーの色は --c1、太さは --h で自由に変更できます。
— 完 —
<!-- bodyの直下などに1つ設置(data-target="#box" で特定ボックス連動も可) --> <div class="bnto-sprog" data-bnto-sprog> <i class="bar"></i> </div>
.bnto-sprog { --c1: hsl(345 80% 55%); /* バーの色 */ --h: 5px; /* バーの太さ */ position: fixed; top: 0; left: 0; right: 0; height: var(--h); z-index: 9999; background: rgba(0,0,0,.08); pointer-events: none; } .bnto-sprog .bar { display: block; width: 0; height: 100%; border-radius: 0 99px 99px 0; background: var(--c1); }
// 読了プログレスバー:スクロール量に応じてバー幅を更新 // data-target="#id" を付けるとその要素内のスクロールに連動(省略時はページ全体) (function () { document.querySelectorAll('[data-bnto-sprog]').forEach(function (el) { if (el.dataset.bntoInit) return; el.dataset.bntoInit = '1'; var sc = el.dataset.target ? document.querySelector(el.dataset.target) : null; var bar = el.querySelector('.bar'); var ticking = false; function update() { ticking = false; var box = sc || document.documentElement; var max = box.scrollHeight - box.clientHeight; var y = sc ? sc.scrollTop : window.scrollY; bar.style.width = (max > 0 ? Math.min(100, y / max * 100) : 0) + '%'; } (sc || window).addEventListener('scroll', function () { if (!ticking) { ticking = true; requestAnimationFrame(update); } }, { passive: true }); update(); }); })();
使い方のコツ
固定ヘッダーがあるサイトでは top: 0 をヘッダーの高さに変えると重なりを防げます。pointer-events: none を付けているので、バーの下の要素のクリックを邪魔しません。