javascript css检查是否溢出
简单的方法来检测元素是否溢出?
我的用例是,我想限制某个内容框有一个300px的高度。 如果内容比这更高,我把它切掉,溢出。 但是,如果它溢出,我想显示一个“更多”button,但如果不是,我不想显示该button。
有没有一种简单的方法来检测溢出,还是有更好的方法? 谢谢。
如果DOM元素溢出,该函数将返回布尔值:
function isOverflown(element) { return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth; }
该元素可能会垂直或水平溢出或两者
如果你只想显示更多内容的标识符,那么你可以用纯CSS做到这一点。 我为此使用纯滚动阴影。 诀窍是使用background-attachment: local;
。 你的CSS看起来像这样:
.scrollbox { overflow: auto; width: 200px; max-height: 200px; margin: 50px auto; background: /* Shadow covers */ linear-gradient(white 30%, rgba(255,255,255,0)), linear-gradient(rgba(255,255,255,0), white 70%) 0 100%, /* Shadows */ radial-gradient(50% 0, farthest-side, rgba(0,0,0,.2), rgba(0,0,0,0)), radial-gradient(50% 100%,farthest-side, rgba(0,0,0,.2), rgba(0,0,0,0)) 0 100%; background: /* Shadow covers */ linear-gradient(white 30%, rgba(255,255,255,0)), linear-gradient(rgba(255,255,255,0), white 70%) 0 100%, /* Shadows */ radial-gradient(farthest-side at 50% 0, rgba(0,0,0,.2), rgba(0,0,0,0)), radial-gradient(farthest-side at 50% 100%, rgba(0,0,0,.2), rgba(0,0,0,0)) 0 100%; background-repeat: no-repeat; background-color: white; background-size: 100% 40px, 100% 40px, 100% 14px, 100% 14px; /* Opera doesn't support this in the shorthand */ background-attachment: local, local, scroll, scroll; }
该代码和一个例子,你可以在http://dabblet.com/gist/2462915find
你可以在这里find一个解释: http : //lea.verou.me/2012/04/background-attachment-local/ 。
会是这样的: http : //jsfiddle.net/Skooljester/jWRRA/1/工作? 它只是检查内容的高度,并将其与容器的高度进行比较。 如果它大于你可以在代码中添加一个“显示更多”button。
更新:添加了在容器顶部创build“显示更多”button的代码。
如果你正在使用jQuery,你可能会试试一下:让外部div与overflow: hidden
和内部div的内容。 然后使用.height()
函数检查内部div的高度是否大于外部div的高度。 我不确定它会工作,但试试看。
比较element.scrollHeight
到element.clientHeight
应该完成这个任务。
你应该考虑的另一个问题是JS不可用性。 想想渐进的魅力或优雅的退化。 我会build议:
- 默认添加“更多button”
- 默认添加溢出规则
- 隐藏button,如果有必要,在比较element.scrollHeight到element.clientHeight之后,在JS中进行CSS修改
这里是一个确定一个元素是否溢出的小提琴使用包含溢出的包装div:隐藏和JQuery的高度()来衡量包装和内部的内部div之间的差异。
outers.each(function () { var inner_h = $(this).find('.inner').height(); console.log(inner_h); var outer_h = $(this).height(); console.log(outer_h); var overflowed = (inner_h > outer_h) ? true : false; console.log("overflowed = ", overflowed); });
来源: jsfiddle.net上的框架和扩展
使用js来检查孩子的offsetHeight
是否超过了父母..如果是,使父母溢出scroll/hidden/auto
无论你想要的,还display:block
更多的div ..
您可以检查相对于偏移父级的边界。
// Position of left edge relative to frame left courtesy // http://www.quirksmode.org/js/findpos.html function absleft(el) { var x = 0; for (; el; el = el.offsetParent) { x += el.offsetLeft; } return x; } // Position of top edge relative to top of frame. function abstop(el) { var y = 0; for (; el; el = el.offsetParent) { y += el.offsetTop; } return y; } // True iff el's bounding rectangle includes a non-zero area // the container's bounding rectangle. function overflows(el, opt_container) { var cont = opt_container || el.offsetParent; var left = absleft(el), right = left + el.offsetWidth, top = abstop(el), bottom = top + el.offsetHeight; var cleft = absleft(cont), cright = cleft + cont.offsetWidth, ctop = abstop(cont), cbottom = ctop + cont.offsetHeight; return left < cleft || top < ctop || right > cright || bottom > cbottom; }
如果你传递这个元素,它会告诉你它的边界是否完全在一个容器内,如果没有提供明确的容器,它将默认为元素的偏移父对象。 它用
setTimeout(function(){ isOverflowed(element) },500) function isOverflowed(element){ return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth; }
这为我工作。 谢谢。
这是为我工作的jQuery解决scheme。 clientWidth
等没有工作。
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(); } });
希望这可以帮助。