如何检查滚动条是否可见?

IT技术 javascript css dom scrollbar
2021-01-16 15:31:36

是否可以检查overflow:autodiv的?

例如:

HTML

<div id="my_div" style="width: 100px; height:100px; overflow:auto;" class="my_class"> 
  * content
</div>

查询

$('.my_class').live('hover', function (event)
{
    if (event.type == 'mouseenter')
    {
         if( ...  if scrollbar visible ? ... )
         {
            alert('true'):
         }
         else
         {
            alert('false'):
         }
    }

});

有时内容很短(没有滚动条),有时很长(滚动条可见)。

6个回答

一个小插件。

(function($) {
    $.fn.hasScrollBar = function() {
        return this.get(0).scrollHeight > this.height();
    }
})(jQuery);

像这样使用它,

$('#my_div1').hasScrollBar(); // returns true if there's a `vertical` scrollbar, false otherwise..

已在 Firefox、Chrome、IE6、7、8 上测试

但在body标签选择器上不能正常工作

演示


编辑

我发现当你有水平滚动条导致垂直滚动条出现时,这个功能不起作用......

我找到了另一个解决方案......使用 clientHeight

return this.get(0).scrollHeight > this.get(0).clientHeight;
这有一个问题,如果水平滚动条也存在,那么即使垂直滚动条存在直到高度被水平滚动条高度缩小,这也会返回false。
2021-03-20 15:31:36
scrollHeight > clientHeight,这适用于所有情况,包括填充、边框
2021-03-20 15:31:36
如果您有填充,则需要使用> this.innerHeight(); jsfiddle.net/p3FFL/210
2021-03-29 15:31:36
(function($) { $.fn.hasScrollBar = function() { return this.get(0).scrollWidth > this.width); } })(jQuery); 这适用于水平溢出。非常适合在 iframe 中检查网站上的移动响应。
2021-04-01 15:31:36
请注意,在 Mac 上,滚动条会浮动在内容上,并在不使用时消失。在 Windows 上,它始终可见并占据水平空间。因此,仅仅因为内容可以滚动(这个函数检测到)并不意味着滚动条一定存在。
2021-04-05 15:31:36

您可以使用Element.scrollHeightElement.clientHeight属性的组合来执行此操作

根据 MDN:

所述Element.scrollHeight只读属性是一个元素的内容的高度的测量,包括由于溢出内容在屏幕上不可见的。scrollHeight 值等于元素需要的最小 clientHeight,以便在不使用垂直滚动条的情况下适应视点中的所有内容。它包括元素填充但不包括它的边距。

和:

所述Element.clientHeight只读属性返回一个元件的内部高度,以像素,包括填充但不水平滚动条高度,边框或余量。

clientHeight 可以计算为 CSS 高度 + CSS 填充 - 水平滚动条的高度(如果存在)。

因此,如果滚动高度大于客户端高度,元素将显示滚动条,因此您的问题的答案是:

function scrollbarVisible(element) {
  return element.scrollHeight > element.clientHeight;
}
例如:github.com/twbs/bootstrap/blob/master/js/modal.js#L242和 +1 用于 MDN 引用和解释!
2021-03-19 15:31:36
在 chrome 中,如果内容有边框,则不包含在 scrollHeight 中
2021-03-20 15:31:36
投票支持不蹩脚和使用框架/库。
2021-03-22 15:31:36
每次直接调整元素大小时,您都必须运行此函数,或者它的一个子元素是(这也可能会影响它)。如果没有提到这些事情,这个答案还不到一半。
2021-03-25 15:31:36
小心 - 这会导致回流,这是性能消耗。gist.github.com/paulirish/5d52fb081b3570c81e3a
2021-04-06 15:31:36

也许是一个更简单的解决方案。

if ($(document).height() > $(window).height()) {
    // scrollbar
}
在使用JQuery检查 DOM 是否准备好后,这个答案对我有用.ready()
2021-03-16 15:31:36
这假设滚动条在窗口上而不是 div 元素。建议修改参考建议:“如果你只需要在主窗口测试滚动条,你可以尝试:”
2021-04-09 15:31:36

我应该对 Reigel 所说的做一点改动:

(function($) {
    $.fn.hasScrollBar = function() {
        return this[0] ? this[0].scrollHeight > this.innerHeight() : false;
    }
})(jQuery);

innerHeight 计算控件的高度及其顶部和底部填充

@BT但是如果我在我的 css 中将溢出设置为自动,那么我不需要这个额外的检查?它比较大小就足够了......?
2021-03-12 15:31:36
我认为这应该被指定为正确答案。这适用于 FF35、IE11 和 Chrome39。
2021-03-17 15:31:36
一个只对你有用的答案不是一个答案..你怎么知道其他人在他们的 css 中有什么?你的回答没有提到这个限制。如果有人不能放弃你的答案并让它起作用,这不是一个好的答案。
2021-03-29 15:31:36
return (this.get(0))?this.get(0).scrollHeight>this.innerHeight():false;
2021-04-04 15:31:36
它不会检查“溢出”值以确保在满足 scrollHeight 条件时会出现滚动条。
2021-04-10 15:31:36

这扩展了@Reigel 的回答。它将返回水平或垂直滚动​​条的答案。

(function($) {
    $.fn.hasScrollBar = function() {
        var e = this.get(0);
        return {
            vertical: e.scrollHeight > e.clientHeight,
            horizontal: e.scrollWidth > e.clientWidth
        };
    }
})(jQuery);

例子:

element.hasScrollBar()             // Returns { vertical: true/false, horizontal: true/false }
element.hasScrollBar().vertical    // Returns true/false
element.hasScrollBar().horizontal  // Returns true/false