Javascript 基于滚动更改进度条值

Javascript 基于滚动更改进度条值,javascript,jquery,scroll,progress-bar,scrollbar,Javascript,Jquery,Scroll,Progress Bar,Scrollbar,我希望能够使我的进度条增加,根据我有多少滚动和多少是剩下的 我试过这样做:但它似乎不起作用,我的脚本基于某人的脚本,该脚本基于scroll%使块水平移动 我的代码: <progress id="progressbar" value="0" max="100"></progress> <br /> <br /> <br /> Lorem<br /> Ipsum<br /> Dolor<br /> . .

我希望能够使我的进度条增加,根据我有多少滚动和多少是剩下的

我试过这样做:但它似乎不起作用,我的脚本基于某人的脚本,该脚本基于scroll%使块水平移动

我的代码:

<progress id="progressbar" value="0" max="100"></progress>
<br />
<br />
<br />
Lorem<br />
Ipsum<br />
Dolor<br />
.
.
.
.
逻辑是这样的

totalValue  = (documentHeight - windowHeight);
currntValue = scrolledValue;
percentage =  (currntValue/ totalValue  ) * 100

工作 试试这个

$(window).scroll(function () {
  var s = $(window).scrollTop(),
        d = $(document).height(),
        c = $(window).height();
        scrollPercent = (s / (d-c)) * 100;
        var position = scrollPercent;

   $("#progressbar").attr('value', position);

});

希望这能有所帮助,谢谢你

我建议根据页面大小动态设置进度条的最大值

将进度条的HTML更改为此

<progress id="progressbar" value="0"></progress>
这消除了对黑客计算的需要,也使进度条在页面较长或较短的情况下保持动态


要获取当前的滚动比率,您应该首先检查文档是否具有可滚动高度。在这种特殊情况下,我选择返回
0
。 下一步计算同上

/**
 * @returns number
 */
function scrollYProgression() {
    const scrollableHeight = window.document.body.scrollHeight - window.innerHeight;
    if (scrollableHeight <= 0) return 0;

    return window.scrollY / scrollableHeight;
}
当你收听滚动事件时要当心!这可能真的很重,你真的需要它在每次重新油漆最多一次。您可以检查以防止对方法的大量调用(最大60/s)

关于滚动事件侦听器:

编辑

$(window).scroll(() => {
    $('#progressbar')
        .attr('value', scrollYProgression() * 100);
});
不使用jQuery并使用
window.requestAnimationFrame
将触发速率限制为60/s

/** @return number */
function scrollYProgression() {
    const scrollableHeight = window.document.body.scrollHeight - window.innerHeight;
    if (scrollableHeight <= 0) return 0;

    return window.scrollY / scrollableHeight;
}

/**
 *  @return void
 *  @description DOM element manipulation
 */
function scrollHandler() {
    const progress = scrollYProgression();
    const bar = document.getElementById('progressbar');
    bar.setAttribute('value', progress * 100);
}

/** Start listening */
window.addEventListener('scroll', function(ev){
    window.requestAnimationFrame(scrollHandler);
}, { passive: true });
/**@返回编号*/
函数ScrollyProgPression(){
const scrollableHeight=window.document.body.scrollHeight-window.innerHeight;

如果(scrollableHeight在现代web中,这可以在vanilla js中相当容易地完成(从中提取的基本方法):

var progressBar=document.querySelector('progress');
var winheight、Dochweight、轨道长度、节流辊;
函数getDocHeight(){
var D=文件;
返回Math.max(
D.body.scrollHeight,D.documentElement.scrollHeight,
D.body.offsetHeight,D.documentElement.offsetHeight,
D.body.clientHeight,D.documentElement.clientHeight
);
}
函数getMeasurements(){
winheight=window.innerHeight | | |(document.documentElement | | document.body);
docheight=getDocHeight();
trackLength=docheight-winheight
}
函数更新(){
var scrollTop=window.pageYOffset | | |(document.documentElement | | document.body.parentNode | | document.body)。scrollTop
var pctScrolled=scrollTop/trackLength*100;
var wholePct=数学地板(PCT);
progressBar.value=pctScrolled;
}
getMeasures();
window.addEventListener('scroll',update,false);
window.addEventListener(“resize”,getMeasures,false);
进展{
位置:固定;
排名:0;
左:0;
/*重置默认外观*/
-webkit外观:无;
外观:无;
}

呼噜当宠物给我一些食物给我一些食物给我一些食物给我一些食物meh,我不希望它消失四天然后带着昂贵的伤回家;咬兽医嚼iPad电源线,但人类在凌晨4点会注意到我,无缘无故地喵喵叫或尖叫。舔sellotape嘶嘶声,什么也不看,然后突然跑了一圈一路倒下死去(不是真的,而是得了梅毒),但在一个盒子里坐上几个小时,摧毁百叶窗。整夜喵喵叫着让他们的伴侣打扰熟睡的人类,有时会用法语说“喵”只是因为,为什么不呢?穿着烤面包服在太空飞行时大便彩虹。拒绝离开硬纸盒吃狗粮,吃狗粮时发出咕噜声。到处留头发先舔主人的手,然后再咬,因为我情绪低落


在车上行走,在引擎盖和挡风玻璃上留下脚印攻击孩子,舔胳膊上的毛,无情地追赶飞蛾,但从警察手中跑开的人却停下来养猫,进了监狱。在空房间里喵喵叫,咳嗽,滚吧,给我一些食物,给我一些食物,给我一些食物,我不想要鱼,我必须找到我的红色猫咬鱼跳下阳台给主人一只死老鼠现在在垃圾箱里大便抓纱线和狗打架猫追激光然后在草地上玩发现橱柜里的小斑点整天睡觉在浴缸里跳,当主人装满食物盘时猫撞翻了食物盘猫滑下滑梯进入水池d游泳,即使它不喜欢水在房子周围和上下楼梯追逐幽灵,所以在鞋子里撒尿。咀嚼,咀嚼,咀嚼,咀嚼。舔爪子追逐红色激光点或燕尾服猫总是看起来整洁的喵喵叫我喜欢青蛙和0重力或打扮自己4小时-检查,让你的美容睡眠18小时-检查,非常适合一天剩下的时间-检查过了。喜欢奶酪汉堡。卫生纸攻击爪子到处都是绒毛喵喵喵叫法国ciao垃圾箱在合成器键盘上玩铆接件在你玩游戏的时候把屁股放在主人的脸上在你的键盘上,然后转一圈攻击狗然后假装什么都没发生。

检查这个答案-我我猜这就是你要找的,你需要从文档高度中减去视口高度:你需要在实际页面上尝试,看看它是否与小提琴中的效果相同。干杯!谢谢,出于某种原因小提琴起了作用,但当我将它添加到页面中时,我正在处理的事情没有发生任何变化。谢谢大家方法。这太神奇了,亲爱的!这真是太棒了。+1这并不总是有效:如果
document.body.scrollHeight
window.innerHeight
相等!它将返回
NaN
(并且应该会引发
dividedByzerorror
)。你不能保证
document.body.scrollHeight
window.innerHeight
。为什么要为这么简单的东西包含jQuery?为什么只链接到使用
requestAnimationFrame
而不只是实现一个使用它的版本?你完全正确,jQuery因为原始问题使用了它。我添加了一个实现使用
requestAnimationFrame
取消对处理程序的调用。感谢您的反馈
/**
 * @returns number
 */
function scrollYProgression() {
    const scrollableHeight = window.document.body.scrollHeight - window.innerHeight;
    if (scrollableHeight <= 0) return 0;

    return window.scrollY / scrollableHeight;
}
$(window).scroll(() => {
    $('#progressbar')
        .attr('value', scrollYProgression() * 100);
});
/** @return number */
function scrollYProgression() {
    const scrollableHeight = window.document.body.scrollHeight - window.innerHeight;
    if (scrollableHeight <= 0) return 0;

    return window.scrollY / scrollableHeight;
}

/**
 *  @return void
 *  @description DOM element manipulation
 */
function scrollHandler() {
    const progress = scrollYProgression();
    const bar = document.getElementById('progressbar');
    bar.setAttribute('value', progress * 100);
}

/** Start listening */
window.addEventListener('scroll', function(ev){
    window.requestAnimationFrame(scrollHandler);
}, { passive: true });