检查与jquery,如果div有溢出元素
我有一个固定的高度和overflow:hidden;
的div overflow:hidden;
我想用jQuery检查div是否有超过div的固定高度溢出的元素。 我该怎么做?
你实际上不需要任何jQuery来检查是否有溢出发生。 使用element.offsetHeight
, element.offsetWidth
, element.scrollHeight
和element.scrollWidth
你可以确定你的元素的内容是否大于它的大小:
if (element.offsetHeight < element.scrollHeight || element.offsetWidth < element.scrollWidth) { // your element have overflow } else { // your element doesn't have overflow }
看到行动中的例子: 小提琴
但是如果你想知道你的元素里面的元素是否可见,那么你需要做更多的计算。 就能见度而言,有三个子元素状态:
如果你想要统计半可见项目,那将是你需要的脚本:
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]); } }
如果你不想计数半可见,你可以计算一点点差异。
我和OP有同样的问题,这些答案都不符合我的需求。 我需要一个简单的条件,为了一个简单的需要。
这是我的答案:
if ($("#myoverflowingelement").prop('scrollWidth') > $("#myoverflowingelement").width() ) { alert("this element is overflowing !!"); } else { alert("this element is not overflowing!!"); }
另外,如果您需要testing这两种情况,则可以通过scrollHeight
更改scrollWidth
。
一种方法是检查scrollTop本身。 给内容一个大于它的大小的滚动值,然后检查它的scrollTop是否为0(如果它不是0,它有溢出)。
部分基于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');
所以我用溢出jQuery库: https : //github.com/kevinmarx/overflowing
安装库之后,如果要将overflowing
的类分配给所有溢出的元素,只需运行:
$('.targetElement').overflowing('.parentElement')
然后这会使类overflowing
,如<div class="targetElement overflowing">
所有元素。 然后,您可以将其添加到某个事件处理程序(click,mouseover)或其他将运行上述代码的函数,以便dynamic更新。
用简单的英文:获取父元素。 检查它的高度,并保存该值。 然后遍历所有的子元素,并检查他们的个人身高。
这是肮脏的,但你可能会得到基本的想法: http : //jsfiddle.net/VgDgz/
这是一个纯粹的jQuery解决scheme,但是很麻烦:
var div_height = $(this).height(); var vertical_div_top_position = $(this).offset().top; var lastchild_height = $(this).children('p:last-child').height(); var vertical_lastchild_top_position = $(this).children('p:last-child').offset().top; var vertical_lastchild_bottom_position = lastchild_height + vertical_lastchild_top_position; var real_height = vertical_lastchild_bottom_position - vertical_div_top_position; if (real_height > div_height){ //overflow div }
这是为我工作的jQuery解决scheme。 offsetWidth
等没有工作。
function is_overflowing(element, extra_width) { return element.position().left + element.width() + extra_width > element.parent().width(); }
如果这不起作用,请确保元素的父级具有所需的宽度(个人而言,我必须使用parent().parent())
。 position
相对于父母。 我还包括extra_width
因为我的元素(“标签”)包含的图像需要很短的时间来加载,但在函数调用时,他们有零宽度,破坏计算。 为了解决这个问题,我使用下面的调用代码:
var extra_width = 0; $(".tag:visible").each(function() { if (!$(this).find("img:visible").width()) { // tag image might not be visible at this point, // so we add its future width to the overflow calculation // the goal is to hide tags that do not fit one line extra_width += 28; } if (is_overflowing($(this), extra_width)) { $(this).hide(); } });
希望这可以帮助。