使用 jquery 检查 div 是否有溢出元素

IT技术 javascript jquery html
2021-02-09 11:45:57

我有一个固定高度的 div 和 overflow:hidden;

我想用 jQuery 检查 div 是否有元素溢出超过 div 的固定高度。我怎样才能做到这一点?

6个回答

您实际上不需要任何 jQuery 来检查是否发生溢出。使用element.offsetHeightelement.offsetWidthelement.scrollHeightelement.scrollWidth可以判断,如果你的元素有比它的规模更大的内容:

if (element.offsetHeight < element.scrollHeight ||
    element.offsetWidth < element.scrollWidth) {
    // your element have overflow
} else {
    // your element doesn't have overflow
}

参见实际示例:Fiddle

但是,如果您想知道元素中的哪个元素可见或不可见,则需要进行更多计算。就可见性而言,子元素有三种状态:

在此处输入图片说明

如果您想计算半可见项目,这将是您需要的脚本:

var invisibleItems = [];
for(var i=0; i<element.childElementCount; i++){
  if (element.children[i].offsetTop + element.children[i].offsetHeight >
      element.offsetTop + element.offsetHeight ||
      element.children[i].offsetLeft + element.children[i].offsetWidth >
      element.offsetLeft + element.offsetWidth ){

        invisibleItems.push(element.children[i]);
    }

}

如果你不想计算半可见的,你可以稍微计算一下。

我了解 offsetHeight 包括边框,不计入可滚动区域。只是一个注释。(如我错了请纠正我)
2021-03-12 11:45:57
@Robbie<p>是块级元素,宽度为 100%。如果您想在 p 中使用大量文本来尝试此操作,只需 make p{display:inline}这样里面的文字就决定了p.
2021-03-20 11:45:57
@Lodewijk 我看到了同样的事情。也许正确的属性是 clientHeight?
2021-03-26 11:45:57
如果我错了,请纠正我,但这似乎不再起作用 Chrome V.20.0.1132.57 。如果更改 div 内的文本,背景颜色保持黄色,jsbin.com/ujiwah/25/edit#javascript , html , live
2021-04-02 11:45:57
适用于大多数情况,但不会覆盖 CSS 表格(显示表格单元格、表格 Rwo、表格)的场景 -
2021-04-05 11:45:57

我和 OP 有同样的问题,但这些答案都不符合我的需求。我需要一个简单的条件,为了一个简单的需要。

这是我的回答:

if ($("#myoverflowingelement").prop('scrollWidth') > $("#myoverflowingelement").width() ) {
  alert("this element is overflowing !!");
}
else {
 alert("this element is not overflowing!!");
}

此外,您还可以改变scrollWidthscrollHeight,如果你需要测试这两种情况下。

好吧,我自己想通了。我将我的脚本标签包装在 window.addEventListener('DOMContentLoaded') 中,因此它们将与我异步加载的 jquery 和其他文件一起使用。但是在那个阶段运行这个脚本会返回明显错误的读数,所以对于这个脚本,我用“加载”替换了 DOMContentLoaded 以进一步延迟脚本的执行。现在它每次都返回正确的结果。就我的目的而言,它可以等到页面加载后才运行它,这完全没问题,然后我什至可以添加动画来突出用户对“阅读更多”按钮的关注。
2021-03-17 11:45:57
谢谢,这对我有用。只需要一个简单的 jquery 例子,而不是普通的 js。
2021-04-05 11:45:57
在 ie 中不起作用,在 mozilla 和 chrome 中工作正常。
2021-04-05 11:45:57
不适用于具有填充/边距的元素。使用 externalWidth(true) 增加宽度
2021-04-09 11:45:57
我对这个脚本有一些奇怪的影响。在 Chrome 中测试。我重写它来检查高度(使用 OuterHeight),如果我使用 F5 重新加载页面来检查脚本,或者从另一个页面导航到它,它总是以溢出 = true 返回,但是如果我使用 ctrl-F5 它来返回溢出 = false。这是在测试应该返回错误的情况时。当它应该是真的时,它总是有效。
2021-04-10 11:45:57

部分基于 Mohsen 的回答(添加的第一个条件涵盖了孩子隐藏在父母之前的情况):

jQuery.fn.isChildOverflowing = function (child) {
  var p = jQuery(this).get(0);
  var el = jQuery(child).get(0);
  return (el.offsetTop < p.offsetTop || el.offsetLeft < p.offsetLeft) ||
    (el.offsetTop + el.offsetHeight > p.offsetTop + p.offsetHeight || el.offsetLeft + el.offsetWidth > p.offsetLeft + p.offsetWidth);
};

然后就这样做:

jQuery('#parent').isChildOverflowing('#child');

一种方法是针对自身检查 scrollTop。给内容一个大于其大小的滚动值,然后检查它的 scrollTop 是否为 0(如果不是 0,则表示溢出。)

http://jsfiddle.net/ukvBf/

所以我使用了溢出的jquery库:https : //github.com/kevinmarx/overflowing

安装库后,如果要将类分配overflowing给所有溢出元素,只需运行:

$('.targetElement').overflowing('.parentElement')

这将给 class overflowing,就像 <div class="targetElement overflowing">所有溢出的元素一样。然后,您可以将其添加到某个事件处理程序(单击、鼠标悬停)或其他将运行上述代码的函数中,以便它动态更新。