检测元素是否溢出的简单方法是什么?javascript css检查是否溢出
我的用例是,我想限制某个内容框的高度为300px。如果内容比这更高,我会将它切掉并溢出。但是如果它溢出了,我想显示一个'更多'按钮,但是如果没有,我不想显示那个按钮。
有没有一种简单的方法来检测溢出,或者是否有更好的方法?谢谢。
检测元素是否溢出的简单方法是什么?javascript css检查是否溢出
我的用例是,我想限制某个内容框的高度为300px。如果内容比这更高,我会将它切掉并溢出。但是如果它溢出了,我想显示一个'更多'按钮,但是如果没有,我不想显示那个按钮。
有没有一种简单的方法来检测溢出,或者是否有更好的方法?谢谢。
会是这样的:http://jsfiddle.net/Skooljester/jWRRA/1/工作?它只是检查内容的高度,并将其与容器的高度进行比较。如果它大于您可以在代码中添加“显示更多”按钮。
更新:添加了在容器顶部创建“显示更多”按钮的代码。
用JS检查孩子的offsetHeight
比父母更多..如果是,让父母溢出无论你想scroll/hidden/auto
,也display:block
上更加格..
您可以检查相对界限到抵消父母。
// 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;
}
如果你传递这一个元素,它会告诉你它的边界是否完全是一个容器内,并且将默认为元素的偏移父母如果没有提供明确的容器。它使用
如果你使用的是jQuery,你可以试试一下:让外部div与overflow: hidden
和内部div与内容。然后使用.height()
函数检查内部div的高度是否大于外部div的高度。我不确定它会起作用,但试试看。
比较element.scrollHeight
到element.clientHeight
应该做的任务。
你应该考虑的另一个问题是JS不可用性。想想渐进的魅力或优雅的退化。我建议:
如果DOM元素溢出,该函数将返回布尔值:
function isOverflown(element) {
return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
}
元素可能是垂直或水平溢出或两者兼有
伟大的解决方案!这是一个jQuery变体(用于$(“#element”)。overflown()'):'$ .fn.overflown = function(){var e = this [0]; return e.scrollHeight> e。 clientHeight || e.scrollWidth> e.clientWidth;}' – Sygmoral 2013-08-22 22:01:55
@micnic您好,我正在使用ionic2并试图做同样的事情......但函数总是返回true ...有没有不同的方式来做事情angular 2 – Yasir 2017-04-23 09:31:59
@DavidBracoly,这个函数是用于纯DOM的API,我没有Ionic/Angular的经验,我想你应该得到原始的DOM Element并且使用这个函数 – micnic 2017-04-23 10:27:09
这是一个确定元素是否溢出使用带溢出的包装器div的方法:hidden和JQuery height()来测量包装器和内部内容分区。
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);
});
setTimeout(function(){
isOverflowed(element)
},500)
function isOverflowed(element){
return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
}
这是为我工作。谢谢。
这与micnic的回答有什么不同? – carefulnow1 2017-04-08 16:38:10
这是为我工作的jQuery解决方案。 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();
}
});
希望这有助于
如果您只想显示更多内容的标识符,那么您可以使用纯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/2462915
并解释你可以在这里找到:http://lea.verou.me/2012/04/background-attachment-local/。
真棒**纯CSS解决方案** – 2016-07-25 09:35:37
这不是一个问题的答案 – 2016-12-13 22:12:18
这是我见过的最疯狂的事情之一用CSS实现的! – Tim 2017-07-05 00:08:11
非常感谢,似乎不标准。 – Harry 2012-02-17 18:39:25
是的,但根据[quirksmode](http://quirksmode.org/dom/w3c_cssom.html#elementview)它最适用 - 并且比其他发布的解决方案简单得多。 – Bergi 2012-02-17 18:50:58
@Harry:它在所有当前浏览器(至少是桌面版本)中都支持,所以它在形式上不标准并不重要。 – 2012-03-07 23:03:46