检查 HTML 元素是否有滚动条

IT技术 javascript dom scrollbar overflow
2021-01-20 06:45:24

检查元素是否具有滚动条的最快方法是什么?

一件事当然是检查元素是否大于其视口,这可以通过检查这两个值轻松完成:

el.scrollHeight > el.offsetHeight || el.scrollWidth > el.offsetWidth

但这并不意味着它也有滚动条(因此它实际上可以由人类滚动)。

问题

如何1 个跨浏览器和2 个javascript(如没有 jQuery)中检查滚动条

仅 Javascript,因为我需要尽可能小的开销,因为我想编写一个非常快的 jQuery 选择器过滤器

// check for specific scrollbars
$(":scrollable(x/y/both)")

// check for ANY scrollbar
$(":scrollable")

我想我必须检查overflow样式设置,但我如何以跨浏览器的方式做到这一点?

附加编辑

不仅overflow样式设置。检查元素是否有滚动条并不像看起来那么简单。当元素没有边框时,我上面写的第一个公式可以正常工作,但是当它有时(尤其是当边框具有相当大的宽度时),offset尺寸可以大于scroll尺寸但元素仍然可以滚动。我们实际上必须从offset维度中减去边框以获得元素的实际可滚动视口并将其与scroll维度进行比较

备查

:scrollablejQuery 选择器过滤器包含在我的.scrollintoview()jQuery 插件中。如果有人需要,可以在我的博客文章中找到完整的代码即使它没有提供实际的解决方案 Soumya 的代码也大大帮助我解决了问题。它为我指明了正确的方向。

6个回答

几周前我在某个地方发现了这个。它对我有用。

var div = document.getElementById('container_div_id');

var hasHorizontalScrollbar = div.scrollWidth > div.clientWidth;
var hasVerticalScrollbar = div.scrollHeight > div.clientHeight;

/* you'll get true/false */
这可能不是公认的解决方案,但它对我有用。罗伯特,对于这些情况,您不能也获取 css 溢出属性来测试这些情况div.scrollHeight>div.clientHeight && !(div.style.overflow && div.style.overflow == 'hidden')(例如)?
2021-03-19 06:45:24
你显然有一个简化的例子。如果您的容器已overflow:hidden设置在上面怎么办?会有多余的内容,但它仍然无法滚动。问题远没有看起来那么简单。
2021-03-22 06:45:24
如果溢出可见或隐藏,则通常没有滚动条。
2021-03-24 06:45:24
这可能不是公认的解决方案,但它对我有用。如果它是隐藏的,我不确定为什么要滚动它。
2021-04-03 06:45:24
这在很多情况下都失败了。如果您的元素溢出:可见;宽度:200px;并且有一个宽度为 500 像素的子元素,您的元素没有滚动条,但滚动宽度为 500 像素,客户端宽度为 200 像素。
2021-04-06 06:45:24

尝试:

对于垂直滚动条

el.scrollHeight > el.clientHeight

对于水平滚动条

el.scrollWidth > el.clientWidth

我知道这至少适用于 IE8 和 Firefox 3.6+。

@RobertKoritnik - 所以只需检查该特定元素是否包含overflow:hidden在它上面......在我看来这仍然是正确的答案,因为它是最简单的。
2021-03-15 06:45:24
我指出是的,这告诉我某个元素比看起来大,但这并不意味着它显示滚动条。它也可以具有overflow:hidden并且不再可滚动。
2021-04-04 06:45:24
并且检查 clientHeight/clientWidth 值不会给出好的结果,因为元素也可以有边框,这不包括在此度量中。检查我的公式。它比你的好用。
2021-04-09 06:45:24
使用 offsetHeight/offsetWidth 代替 clientHeight/clientWidth 检查滚动条是正确的。感谢您指出了这一点。
2021-04-14 06:45:24

这可能看起来(或可能)有点骇人听闻,但您可以测试scrollTopscrollLeft属性。

如果它们大于 0,您就知道有滚动条。如果它们是 0,则将它们设置为 1,并再次测试它们以查看结果是否为 1。然后将它们重新设置为 0。

示例: http : //jsfiddle.net/MxpR6/1/

function hasScroll(el, direction) {
    direction = (direction === 'vertical') ? 'scrollTop' : 'scrollLeft';
    var result = !! el[direction];

    if (!result) {
        el[direction] = 1;
        result = !!el[direction];
        el[direction] = 0;
    }
    return result;
}

alert('vertical? ' + hasScroll(document.body, 'vertical'));
alert('horizontal? ' + hasScroll(document.body, 'horizontal'));

我相信 IE 有一个不同的属性,所以我会在一分钟内更新。

编辑:似乎 IE 可能支持此属性。(我现在无法测试 IE。)

http://msdn.microsoft.com/en-us/library/ms534618(VS.85).aspx

并不真地。如果您检查我的jQuery 插件,我必须找到实际的可滚动祖先,否则我无法将元素滚动到视图中。
2021-03-19 06:45:24
@Robert:不确定是否更容易,但我确实看到它是如何工作的。然后我假设如果一个元素有overflow:scroll,无论滚动条是否启用,您都希望将其报告为可滚动。当然,如果附加了 onscroll 事件,我的解决方案可能会出现问题。
2021-03-26 06:45:24
总是返回假
2021-04-02 06:45:24
如果比较offsetHeight,检查滚动条会容易得多clientHeight当存在滚动条时,后者总是小于滚动条大小。
2021-04-06 06:45:24
@RobertKoritnik 不正确;某些浏览器可能具有不会减小宽度的滚动条。例如在 OS X 上。或触摸设备。
2021-04-07 06:45:24

这是另一个解决方案:

正如一些人指出的那样,仅仅比较 offsetHeight 和 scrollHeight 是不够的,因为它们在隐藏溢出等的元素上有所不同,这些元素仍然没有滚动条。所以在这里我还要检查元素的计算样式上的溢出是滚动还是自动:

var isScrollable = function(node) {
  var overflowY = window.getComputedStyle(node)['overflow-y'];
  var overflowX = window.getComputedStyle(node)['overflow-x'];
  return {
    vertical: (overflowY === 'scroll' || overflowY === 'auto') && node.scrollHeight > node.clientHeight,
    horizontal: (overflowX === 'scroll' || overflowX === 'auto') && node.scrollWidth > node.clientWidth,
  };
}
If overflow*isscroll总是会有一个滚动条,所以我认为你想要vertical: overflowY === 'scroll' || overflowY === 'auto' && node.scrollHeight > node.clientHeight,等等(即删除括号,所以scroll*vsclient*只在overflow*is时测试auto)。否则这似乎是最正确的解决方案。
2021-03-28 06:45:24
@Jake 如果滚动溢出时 scrollHeight < clientHeight ,滚动条将在那里,但它们将被禁用(即元素不可滚动)。所以我认为这取决于应用程序。您的修改是有效的,您只想检查滚动条,与状态无关。对我来说,当我想出这个时,我希望为一个组件实现自动滚动,所以在这种情况下禁用滚动条是没有用的。这个问题似乎也是这种情况(它需要“由人类滚动”)
2021-03-30 06:45:24

我参加聚会可能有点晚了,但是...

我相信您可以使用 e.offsetWidth 与 e.clientWidth 检测滚动条。偏移宽度包括边框和滚动条、填充和宽度。客户端宽度包括填充和宽度。请参见:

https://developer.mozilla.org/en/DOM/element.offsetWidth(第二张图片) https://developer.mozilla.org/en/DOM/element.clientWidth(第二张图片)

您需要检查:

  1. 元素是否使用计算/级联/当前样式将溢出设置为自动/滚动(包括溢出X/Y)。
  2. 如果元素确实将溢出设置为自动/滚动。建立 offsetWidth 和 clientWidth。
  3. 如果 clientWidth 小于 offsetWidth - 右边框(通过计算/级联/当前样式再次找到),那么您知道您有一个滚动条。

对垂直(偏移/客户端高度)执行相同的操作。

IE7 报告某些元素的 clientHeight 为 0(我还没有检查原因),因此您总是需要进行第一次溢出检查。

希望这可以帮助!