JS 特效 词条目录
前端Wiki/JS 特效/滚动与组件/滚动特效

滚动进度条

滚动进度条:页面顶部一条随滚动位置增长的彩条(本文读了 35%)。实现:监听 scroll,进度 = scrollTop /(总高 - 视口高),把比例写进进度条 scaleX 或 width。

性能要点:scroll 事件高频触发,回调里只改 transform(不触重排),并用 rAF 或节流控制频率;进度条元素 fixed 固定在顶部。

  • 进度 = scrollTop /(scrollHeight - clientHeight)
  • 只改 transform: scaleX,别改 width(避免重排)
  • scroll 回调套 rAF:每帧最多算一次
HTML
<style>
#progbar { position: sticky; top: 0; height: 4px; background: #f0e6ff; z-index: 10; }
#progbar i { display: block; height: 100%; width: 100%;
  background: linear-gradient(90deg,#a371f7,#f778ba);
  transform-origin: left; transform: scaleX(0); }
#pbdemo { height: 160px; overflow: auto; }
#pbdemo .inner { height: 900px; padding: 16px; color: #888; }
</style>
<div id="progbar"><i></i></div>
<div id="pbdemo"><div class="inner">滚动试试顶部进度条 —— 只改 transform 不卡</div></div>
<script>
var box = document.getElementById('pbdemo');
var bar = document.querySelector('#progbar i');
var ticking = false;
box.addEventListener('scroll', function () {
  if (ticking) return;
  ticking = true;
  requestAnimationFrame(function () {
    var max = box.scrollHeight - box.clientHeight;
    var p = max > 0 ? box.scrollTop / max : 0;
    bar.style.transform = 'scaleX(' + p.toFixed(4) + ')';
    ticking = false;
  });
});
</script>
本节要点进度条 = scrollTop/(总高-视口高);只写 scaleX,scroll 回调套 rAF。