检测页面是否有垂直滚动条?

IT技术 javascript jquery scroll
2021-03-07 23:40:40

我只想要一些简单的 JQ/JS 来检查当前页面/窗口(不是特定元素)是否有垂直滚动条。

谷歌搜索给我的东西对于这个基本功能来说似乎过于复杂。

如何才能做到这一点?

6个回答
$(document).ready(function() {
    // Check if body height is higher than window height :)
    if ($("body").height() > $(window).height()) {
        alert("Vertical Scrollbar! D:");
    }

    // Check if body width is higher than window width :)
    if ($("body").width() > $(window).width()) {
        alert("Horizontal Scrollbar! D:<");
    }
});
如果主体高度与窗口高度匹配,则这不起作用,如果文档高度与视口完全匹配,则会添加水平滚动条它会强制垂直。滚动条但文档/正文/窗口高度相同;即使有一个,它也不会提醒“垂直滚动条”。
2021-04-23 23:40:40
我在 Chrome 浏览器上有报告页面,它最初显示一个滚动条,然后在几毫秒内消失,这看起来像是浏览器行为,因为我没有对其进行编程。所以这个函数在我的情况下总是返回 true..
2021-04-23 23:40:40
@TiuTalk 对我来说 $("body").height() & $(window).height() 给出相同的值,而不是我使用 $(document).height() > $(window).height() 它适用于我。
2021-04-30 23:40:40
只是想我会提到我必须使用$(document)而不是$("body"),当身体没有时这对我有用(我有一个绝对定位的容器,宽/高的纵横比)
2021-05-05 23:40:40
+1 但为了准确起见,这只检查内容是否比视口扩展得更远。如果将 的overflow属性body设置为hidden沿线某处,它将不起作用。但是,隐藏在身体上的设置极为罕见。
2021-05-13 23:40:40

试试这个:

var hasVScroll = document.body.scrollHeight > document.body.clientHeight;

但是,这只会告诉您垂直 scrollHeight 是否大于可查看内容的高度。hasVScroll变量将包含true或false。

如果您需要进行更彻底的检查,请将以下内容添加到上面的代码中:

// Get the computed style of the body element
var cStyle = document.body.currentStyle||window.getComputedStyle(document.body, "");

// Check the overflow and overflowY properties for "auto" and "visible" values
hasVScroll = cStyle.overflow == "visible" 
             || cStyle.overflowY == "visible"
             || (hasVScroll && cStyle.overflow == "auto")
             || (hasVScroll && cStyle.overflowY == "auto");
上面的代码不起作用。浏览器:Chrome 56。网址:news.greylock.com/...
2021-04-20 23:40:40
哈哈,是的,我在争论是否要付出额外的努力来编写它,因为在许多情况下它是不需要的。
2021-04-23 23:40:40
无论scrollHeight 是否大于clientHeight,这都会导致只要overflowY 为“可见”,hasVScroll 就会为真。也许你的意思是cStyle.overflow === 'scroll'
2021-05-05 23:40:40
@BTcStyle.overflow == "visible" 可以在元素为document.body. 但它应该是 (hasVScroll && cStyle.overflow == "visible" && element.nodeName == "BODY") 。另外,它需要cStyle.overflow === 'scroll'像您指出的那样进行检查
2021-05-09 23:40:40
+1 不错!并具有必要的计算风格(这是我决定不参与这个问题的点;)
2021-05-11 23:40:40

我尝试了上一个答案,但似乎没有起作用 $("body").height() 不一定代表整个 html 高度。

我已更正解决方案如下:

// Check if body height is higher than window height :) 
if ($(document).height() > $(window).height()) { 
    alert("Vertical Scrollbar! D:"); 
} 

// Check if body width is higher than window width :) 
if ($(document).width() > $(window).width()) { 
    alert("Horizontal Scrollbar! D:<"); 
} 

让我们把这个问题从死里复活 ;) 谷歌没有给你一个简单的解决方案是有原因的。特殊情况和浏览器怪癖会影响计算,并没有看起来那么简单。

不幸的是,到目前为止,这里列出的解决方案存在问题。我完全没有贬低它们的意思——它们是很好的起点,并且触及了更强大的方法所需的所有关键属性。但我不建议从任何其他答案中复制和粘贴代码,因为

  • 它们没有以可靠的跨浏览器的方式捕捉定位内容的效果。基于正文大小的答案完全忽略了这一点(正文不是此类内容的偏移父级,除非它本身被定位)。这些答案检查$( document ).width().height()成为jQuery 对文档大小的错误检测的牺牲品
  • 依赖window.innerWidth,如果浏览器支持的话,会让你的代码在手机浏览器中检测不到滚动条,滚动条的宽度一般为0。它们只是临时显示为一个叠加,不占用文档空间. 在移动设备上缩放也成为一个问题(长话短说)。
  • 当人们将htmlbody元素的溢出显式设置为非默认值时,检测可能会被取消(然后发生的事情有点复杂 - 请参阅此描述)。
  • 在大多数答案中,没有检测到正文填充、边框或边距,并且会扭曲结果。

我花了比我想象的更多的时间来寻找“有效”的解决方案(咳嗽)。我提出的算法现在是插件jQuery.isInView 的一部分,它公开了一个.hasScrollbar方法如果您愿意,请查看

在您完全控制页面并且不必处理未知 CSS 的情况下,使用插件可能有点过分——毕竟,您知道哪些边缘情况适用,哪些不适用。但是,如果您需要在未知环境中获得可靠的结果,那么我认为这里列出的解决方案还不够。您最好使用经过良好测试的插件 - 我的或其他任何人。

谢谢@hashchange。它只是告诉是否有任何滚动条,这听起来非常愚蠢,所以我想这只是某种测试。虽然有点有希望。;-)
2021-04-20 23:40:40
谢谢。有点复杂!如果您不想/不需要向后兼容,是否有更简单的 html5 浏览器解决方案?我的意思是也许浏览器编码器/w3c 已经足够好,可以告诉我们元素上是否有滚动条?;-)
2021-05-06 23:40:40
@BT 而且我想当我们开始使用溢出设置时,我们可能会进入一堆奇怪的故障模式,因为它们的行为有点奇怪,但我已经停在那里了。
2021-05-06 23:40:40
@Leo 我不知道。好吧,有一个window.scrollbars对象只有一个属性,visible听起来很有希望,但事实并非如此。它在 IE 中不受支持,包括 IE11。它只是告诉你有一个滚动条 - 但不是哪个。请参阅此处测试页
2021-05-11 23:40:40
@BT 好的,太好了。现在让我带你到兔子洞的入口;) 这里有一个演示,内容不足以填满窗口。您的检测在 FF 中有效,但在 Chrome 中失败。这是另一个演示,其中定位元素放置在页面下方。您的检测在 Chrome 中有效,但在 FF 中失败。
2021-05-13 23:40:40

这个对我有用:

function hasVerticalScroll(node){
    if(node == undefined){
        if(window.innerHeight){
            return document.body.offsetHeight> window.innerHeight;
        }
        else {
            return  document.documentElement.scrollHeight > 
                document.documentElement.offsetHeight ||
                document.body.scrollHeight>document.body.offsetHeight;
        }
    }
    else {
        return node.scrollHeight> node.offsetHeight;
    }
}

对于身体,只需使用hasVerticalScroll().

clientHeightoffsetHeight这里更可取否则你可以有一个粗边框,当有滚动条时返回没有滚动条。
2021-04-26 23:40:40
这是该线程中唯一适用于我的 Chrome 的答案
2021-04-30 23:40:40