Javascript中确定垂直滚动百分比的跨浏览器方法

IT技术 javascript cross-browser scroll
2021-02-03 03:50:49

如何找出用户在任何给定点移动过的垂直滚动条的百分比?

onscroll当用户向下滚动页面时触发事件很容易,但是我如何在该事件中找出他们滚动了多远?在这种情况下,百分比尤其重要。我并不特别担心 IE6 的解决方案。

是否有任何主要框架(Dojo、jQuery、Prototype、Mootools)以简单的跨浏览器兼容方式公开了这一点?

6个回答

2016 年 10 月:已修复。答案中缺少 jsbin 演示中的括号。oop。

铬、火狐、IE9+。jsbin 上的现场演示

var h = document.documentElement, 
    b = document.body,
    st = 'scrollTop',
    sh = 'scrollHeight';

var percent = (h[st]||b[st]) / ((h[sh]||b[sh]) - h.clientHeight) * 100;

作为功​​能:

function getScrollPercent() {
    var h = document.documentElement, 
        b = document.body,
        st = 'scrollTop',
        sh = 'scrollHeight';
    return (h[st]||b[st]) / ((h[sh]||b[sh]) - h.clientHeight) * 100;
}

如果您愿意jQuery(原始答案):

$(window).on('scroll', function(){
  var s = $(window).scrollTop(),
      d = $(document).height(),
      c = $(window).height();

  var scrollPercent = (s / (d - c)) * 100;
  
  console.clear();
  console.log(scrollPercent);
})
html{ height:100%; }
body{ height:300%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

通过添加此 css 代码修复了该Infinity问题html { height: 100%; }
2021-03-14 03:50:49
Infinity当我尝试这个时,我得到了发现document.documentElement.scrollHeightdocument.documentElement.clientHeight相等导致除以零。我使用的是基于 Ubuntu 的 Chromium 版本 72.0.3626.121(官方版本)
2021-03-20 03:50:49
我添加了一个带有实时演示的最佳 IE9+ 版本,并且也恢复了原始的 jQuery 解决方案。
2021-03-28 03:50:49
为什么要使用这么短的变量名?它使代码立即变得不可读。对我来说,它看起来像缩小的 JS。
2021-03-30 03:50:49
对我来说,它有点适用于 Chrome,但不适用于最新的 Firefox。它给出了 NaN。我指的是 vanilla javascript。有什么想法吗?@PhilRicketts
2021-04-04 03:50:49

我想我找到了一个不依赖于任何库的好解决方案:

/**
 * Get current browser viewpane heigtht
 */
function _get_window_height() {
    return window.innerHeight || 
           document.documentElement.clientHeight ||
           document.body.clientHeight || 0;
}

/**
 * Get current absolute window scroll position
 */
function _get_window_Yscroll() {
    return window.pageYOffset || 
           document.body.scrollTop ||
           document.documentElement.scrollTop || 0;
}

/**
 * Get current absolute document height
 */
function _get_doc_height() {
    return Math.max(
        document.body.scrollHeight || 0, 
        document.documentElement.scrollHeight || 0,
        document.body.offsetHeight || 0, 
        document.documentElement.offsetHeight || 0,
        document.body.clientHeight || 0, 
        document.documentElement.clientHeight || 0
    );
}


/**
 * Get current vertical scroll percentage
 */
function _get_scroll_percentage() {
    return (
        (_get_window_Yscroll() + _get_window_height()) / _get_doc_height()
    ) * 100;
}
此解决方案不会给出 0%-100% 结果,因为它在开始时添加了视口高度,要使其为 0-100,您应该从文档总高度中减去高度:_get_window_Yscroll() / (_get_doc_height() - _get_window_height( ))
2021-03-24 03:50:49
@CaioVertematti 这就是目标。它显示了用户浏览了整个页面的多少。如果用户没有滚动但整个页面适合视口,它会显示 100。理论上,如果页面很长和/或视口很短,它可以给你 0。
2021-03-24 03:50:49
纯 Javascript 的完美答案..!
2021-04-05 03:50:49
我尝试了其他解决方案,但这仅对我有用,谢谢
2021-04-07 03:50:49

这应该可以解决问题,不需要库:

function currentScrollPercentage()
{
    return ((document.documentElement.scrollTop + document.body.scrollTop) / (document.documentElement.scrollHeight - document.documentElement.clientHeight) * 100);
}
啊,是的:现在编辑代码,试试吧!WebKit 浏览器中存在一个奇怪的问题,请参见此处:code.google.com/p/chromium/issues/detail?id=2891
2021-03-13 03:50:49
Chrome 版本 5.0.335.1 测试版。问题肯定是分母计算为零,因为函数(完全复制和粘贴)总是返回 Infinity :/
2021-03-17 03:50:49
快到了,谢谢。但是,至少在 Chrome 中,document.documentElement.scrollHeight 和 document.documentElement.clientHeight 都等于相同的值(内容的高度),因此分母始终为零。
2021-03-22 03:50:49
仍然没有工作:/我很确定错误在部门的下半部分。(document.documentElement.scrollHeight - document.documentElement.clientHeight) 在 Chrome 中始终为零。好像是个bug?
2021-03-28 03:50:49
嗯,刚刚测试过,它在 Chrome、IE 和 Firefox 中对我来说运行良好。您使用的是官方最新版本的 Chrome 吗?
2021-03-30 03:50:49

这些在 Chrome 19.0、FF12、IE9 中对我来说非常有效:

function getElementScrollScale(domElement){
        return domElement.scrollTop / (domElement.scrollHeight - domElement.clientHeight);
    }

function setElementScrollScale(domElement,scale){
        domElement.scrollTop = (domElement.scrollHeight - domElement.clientHeight) * scale;
    }
谢谢@toske,我找到了几个复杂的答案,直到找到你的答案才起作用。正是我要找的。
2021-03-17 03:50:49

如果您使用的是 Dojo,则可以执行以下操作:

var vp = dijit.getViewport();
return (vp.t / (document.documentElement.scrollHeight - vp.h));

这将返回一个介于 0 和 1 之间的值。

因为同一天的其他人没有给出完整的答案,而且每个其他答案都是在我标记正确后一年多才出现的:)
2021-03-16 03:50:49
@majelbstoat 如果您现在认为另一个人更好,那么移动支票没有任何问题。您可以随时更改接受的答案,或者只是不接受答案。 ” 良好的问题维护是好的。;^)
2021-04-06 03:50:49