- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我们有一个 width
和 height
未知的容器 div,它小于主体的完整尺寸。
此容器 div 包含 未知数量 的 div。容器中的所有 div 都具有不同的大小,除此之外具有与以下 3 种类型之一相同的 CSS:
类型 1 和类型 2 div 有边距,可能也有填充。 Type 3 div 可能有其中之一,没有或两者都有。
鉴于容器中的 div 类型未知 - 最终目标是在原始容器中添加一个辅助容器,其大小足以容纳视口(viewport)中的所有 div(溢出:滚动)。 计算成本最低的方法是什么?
注意事项:
divs 可能会也可能不会(作为一个整体)有 box-sizing: border-box
。这将影响其边框、边距和填充的呈现方式,也应予以考虑。
在类型 1 和 2( float div)的情况下,div 旨在水平堆叠 - 即,容器应增长以适应其总宽度。应考虑到这一点。
例如,最右边的 div 的右边距应该被计算在内,并且应该增加容器的宽度。这同样适用于顶部、底部和最左侧的 div。
不需要 IE8 及以下版本。
请仅使用 vanilla Javascript。没有像 jQuery 等框架。
谢谢!
一些可视化:
最佳答案
您可能必须自己进行性能测试才能确定哪种方法最快,但无论如何,这是一种非常快速的方法。 ( jsfiddle )
function getOuterBoxDimensions() {
var original = document.getElementById('original'),
divs = original.getElementsByTagName('div'),
left = 0,
right = original.offsetWidth,
top = 0,
bottom = original.offsetHeight;
for (var i = 0, div; div = divs[i++];) {
if (div.offsetTop < top) {
top = div.offsetTop;
}
if (div.offsetTop + div.offsetHeight > bottom) {
bottom = div.offsetTop + div.offsetHeight;
}
if (div.offsetLeft < left) {
left = div.offsetLeft;
}
if (div.offsetLeft + div.offsetWidth > right) {
right = div.offsetLeft + div.offsetWidth;
}
}
return {
top: top,
left: left,
bottom: bottom,
right: right
};
// Note that dimensions are relative to the original div top left
}
据我所知,无论是否设置了 box-sizing: border-box
,offsetLeft、offsetWidth 等都会返回正确的尺寸。如果您在内部 div 中有 div,那么事情会变得有点复杂 - 您将只想检查作为原始子节点的 div。
编辑:这是一个扩展版本,它适本地考虑了边距并扩展了新容器以在一行中容纳所有 float div(请参阅评论中的讨论)。 http://jsfiddle.net/m7N2J/10/
function getOuterBoxDimensions() {
var original = document.getElementById('original'),
divs = original.getElementsByTagName('div'),
left = 0,
right = original.offsetWidth,
top = 0,
bottom = original.offsetHeight,
d = document.defaultView,
style, marginTop, marginBottom, marginLeft, marginRight, float, floatWidth = 0;
for (var i = 0, div; div = divs[i++];) {
if (style = div.currentStyle) {
// May be possible to exclude this if IE7/8 not needed
marginTop = parseFloat(style.marginTop);
marginBottom = parseFloat(style.marginBottom);
marginLeft = parseFloat(style.marginLeft);
marginRight = parseFloat(style.marginRight);
float = style.float;
}
else {
style = d.getComputedStyle(div, null);
marginTop = parseFloat(style.getPropertyValue('margin-top'));
marginBottom = parseFloat(style.getPropertyValue('margin-bottom'));
marginLeft = parseFloat(style.getPropertyValue('margin-left'));
marginRight = parseFloat(style.getPropertyValue('margin-right'));
float = style.getPropertyValue('float');
}
if (float == 'left' || float == 'right') {
floatWidth += div.offsetWidth + marginLeft + marginRight;
if (div.offsetHeight + marginBottom > bottom) {
bottom = div.offsetHeight + marginBottom;
}
}
else {
if (div.offsetTop - marginTop < top) {
top = div.offsetTop - marginTop;
}
if (div.offsetTop + div.offsetHeight + marginBottom > bottom) {
bottom = div.offsetTop + div.offsetHeight + marginBottom;
}
if (div.offsetLeft < left - marginLeft) {
left = div.offsetLeft - marginLeft;
}
if (div.offsetLeft + div.offsetWidth + marginRight > right) {
right = div.offsetLeft + div.offsetWidth + marginRight;
}
}
}
if (right < left + floatWidth) {
right = left + floatWidth;
}
return {
top: top,
left: left,
bottom: bottom,
right: right
};
// Note that dimensions are relative to the original div
}
关于javascript - 找到最远的 DIV 的最便宜的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14019043/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
很难说出这里问的是什么。这个问题是模棱两可的、含糊的、不完整的、过于宽泛或修辞的,不能以其目前的形式得到合理的回答。如需帮助澄清此问题以便可以重新打开,visit the help center .
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我是一名优秀的程序员,十分优秀!