计算 DIV 元素的最大/最小高度

2024-05-04

问题:给定一个具有固定高度的 DIV 元素,其中包含未知数量的子元素,这些子元素的大小相对于其高度,计算 DIV 可以调整大小的最大/最小高度,而不违反其子元素的任何最大/最小值元素。

Example求 DIV A 的最大/最小高度

Answer

最小:150 像素

最大:275 像素

* {
  box-sizing: border-box;
}
.border {
  border-style: solid;
  border-width: 1px 1px 1px 1px;
}
.A {
  height: 200px;
  width: 200px;
}
.B {
  float: left;
  width: 50%;
  height: 75%;
  min-height: 125px;
  max-height: 225px;
  background: yellow;
}
.C {
  float: left;
  width: 50%;
  height: 75%;
  min-height: 100px;
  max-height: 250px;
  background: green;
}
.D{
  float: left;
  width: 100%;
  height: 25%;
  min-height: 25px;
  max-height: 50px;
  background: blue;
}
<div class="A border">
  <div class="B border">
    B
  </div>
  <div class="C border">
    C
  </div>
  <div class="D border">
    D
  </div>
</div>

附加信息:我目前尝试使用一种算法来遍历 DIV 的 DOM 树,并使用元素偏移量创建一个表示元素空间位置的对象图。下面是一个基本算法,用于检查元素的空间关系,允许边缘之间 10 像素的距离被视为“接触”。

允许使用 jQuery 和其他库,只要它们是开源的。

var _isContentRoot = function(a,b){
    var aRect = a.innerRect;
    var bRect = b.outerRect;
    //Check if child element is a root node
    return Math.abs(aRect.top - bRect.top) <= 10;
}

var _isLayoutSibling = function(a,b){
    var aRect = a.outerRect;
    var bRect = b.outerRect;

    // If element X has a boundary that intersects element Y, and
    // element X is located above element Y, element Y is a child node of
    // element X
    if(Math.abs(aRect.bottom - bRect.top) <= 10) {
        if (aRect.left <= bRect.left && aRect.right >= bRect.left ||
            aRect.left <= bRect.right && aRect.right >= bRect.right ||
            aRect.left >= bRect.left && aRect.right <= bRect.right ||
            aRect.left <= bRect.left && aRect.right >= bRect.right) {

            return true;
        }
    }
    return false;
}

编辑:修复了 CSS 错误。这是更新的小提琴http://jsfiddle.net/zqnscmo2/ http://jsfiddle.net/zqnscmo2/

编辑 2:尝试将其更多地视为 CSS/HTML 问题空间中的图形问题。想象一下 CSS 和 HTML 用于描述一个图,其中每个 DIV 都是一个顶点。两个顶点之间存在一条边

1.) 如果 HTML 元素的边界 rectA.top ≈ rectB.top 或 2.) 如果边界 rectA.bottom ≈ rectB.top,则存在边缘

每个顶点都有两个互斥的边集,集 A 包含满足条件 1 的所有边。集 B 包含满足条件 2 的所有边。因此,您可以遍历图并找到最小和最大路径,这应该是 PARENT DIV 的最大值/最小高度。

这是我提出的用于确定内部内容的最大/最小高度的算法。我非常愿意接受不太复杂的解决方案。


如果我正确理解你的问题,这会起作用吗?

// - I use two support functions that can probably be found in other JSes frameworks, and they're down below.
function calculateMySizes(someElement) {
    var childDiv = findChild(someElement, "DIV");

    var totalWidth = 0;
    var totalHeight = 0;
    var maxWidth = 0;       
    var maxHeight = 0;       

    do
    {
        if(childDiv.offsetLeft > maxWidth) {
            maxWidth = childDiv.offsetLeft;
            totalWidth += childDiv.offsetLeft;
        }

        if(childDiv.offsetTop > maxHeight) {
            maxHeight = childDiv.offsetTop;
            totalHeight += childDiv.offsetTop;
        }            
    }
    while (childDiv = nextElement(childDiv));

    alert("object's current width is: " + totalWidth + " and it's child's largest width is: " + maxWidth);
    alert("object's current height is: " + totalHeight + " and it's child's largest height is: " + maxHeight);
}

// - Returns the next Element of object
function nextElement(object) {
    var nextObject = object;
    while (nextObject = nextObject.nextSibling) {
        if (nextObject.nodeType == 1) {
            return nextObject;
        }
    }
    return nextObject;
}

// - Returns the first child of elementName found
function findChild(object, elementName) {
    for (var i = 0; i < object.childNodes.length; i++) {
        if (object.childNodes[i].nodeType == 1) {
            if (object.childNodes[i].nodeName.toUpperCase() == childName) {
                return object;
            }

            if (object.childNodes[i].hasChildNodes()) {
                var child = findChild(object.childNodes[i], childName, countMatch);
                if (child) {
                    return child;
                }
            }
        }
    }
}

我可以想到这样一种场景,在浮动或位置:绝对元素的情况下,子对象的边界框比它自己的子对象小得多,并且需要修复所有子对象的递归调用,但除了在这种情况下,这应该根据子元素的大小为您提供任何元素的最小宽度/高度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 DIV 元素的最大/最小高度 的相关文章

随机推荐

  • 使用 NumPy 查找元组列表第二个元素的中位数

    假设我有一个元组列表 如下所示 list a 1 b 3 c 5 我的目标是使用元组的第二个元素来获取元组列表中位数的第一个元素 在上面的情况下 我想要 b 的输出 因为中位数是 3 我尝试使用 NumPy 和以下代码 但无济于事 impo
  • Typescript 中的forwardRef 和defaultProps

    我正在尝试在forwardRef 中使用defaultProps 当我使用没有forwardRef的MessageBox时 它与defaultProps配合得很好 但是 当我使用forwardRef 时 会发生错误 怎么解决呢 打字稿 3
  • Compact Framework 3.5 上的 System.Data.SQLite 问题

    我在我的紧凑框架应用程序中使用 sqlite 来记录系统中的事件 我也在使用系统 数据 SQLite http sqlite phxsoftware com 该事件具有描述其发生时间的时间戳 我将此时间戳记作为刻度存储在我的表中 除此列外
  • C++ 标准是否保证未使用的私有字段会影响 sizeof?

    考虑以下结构 class Foo int a 在 g 中测试 我明白了sizeof Foo 4但这是由标准保证的吗 是否允许编译器注意到a是一个未使用的私有字段并将其从类的内存表示中删除 导致更小的 sizeof 我不希望任何编译器真正进行
  • 使用故事板和分割视图控制器在应用程序启动时正确显示条件登录屏幕?

    这看起来应该很简单 但事实证明它有很多具有挑战性的细微差别 而且我还没有在 Stack Overflow 上的其他地方找到完整 清晰和简单地回答这个问题的答案 简而言之 我有一个 iPad 应用程序 它使用故事板来布局应用程序流程 并使用分
  • 如何在 .NET Core 中设置全局环境变量(用户范围或系统范围)

    在完整的 NET中我们可以通过EnvironmentVariableTarget枚举到Environment SetEnvironmentVariable call public enum EnvironmentVariableTarget
  • 按下关闭按钮时 Java FX 中的关闭事件

    如果我直接按右上角的 X 按钮关闭窗口 Java FX 中是否存在任何事件处理程序 在这种情况下哪些事件会引起火灾 到目前为止 没有任何效果 setOnHiding 和 setOnCloseRequest 都不起作用 请帮忙 试试这个 im
  • 如何取消 NetworkStream.ReadAsync 而不关闭流

    我正在尝试使用 NetworkStream ReadAsync 读取数据 但我找不到如何取消调用后的 ReadAsync 作为背景 NetworkStream 由连接的 BluetoothClient 对象 来自 32Feet NET 蓝牙
  • 关于正则表达式中的问号

    我看到一个正则表达式说 i 那么当我们在一个字符前面加一个问号时 它意味着什么呢 一般来说 它没有任何意义 甚至可能导致错误 如果问号后面没有有效字符 但有些字符确实有效果 即如果该字符也用作modifier http www regula
  • PHP/Web 脚本保护

    我想用 PHP 和 javascript 编写一个脚本 并以某种方式保护我的源代码 以便我可以出售我的脚本 我正在寻找如何保护我的脚本的想法 如果我将其出售给某人 我如何阻止该人将其作为他们的产品重新分发 我知道有ZEND和ionCube
  • 贾瓦尔 (JNI) 不可用

    Windows 7 64 位 Eclipse Indigo SlickSVN 1 6 17 均已安装 并带有在 Windows 中输入的库的路径 为什么我收到消息 JAVAHL JNI Not available 以及为什么 Eclipse
  • 仅使用 url 嵌入视频

    给定一个 youtube url 我如何使用 net c 将视频嵌入到页面中 只需添加如下一行 将 autoplay 设置为 0 或 1 取决于您是否希望人们真正留在您的页面上
  • 即使设置为 false,clipChildren 也不起作用?

    在我的应用程序中 我尝试使用动画移动图像 当我尝试制作动画时 即使我使用了图像 图像也会被剪切clipChildren每个 xml 块中均为 false
  • Mongo Facet 聚合与 Sum

    试图在这个聚合中找出一些简单的东西 元数据下的 totalArrests 字段返回 0 由于某种原因 无法对前一阶段的该字段求和 请指教 const agg await KID aggregate group id source group
  • 使用Ajax使用php将记录插入mysql数据库

    如何使用 Ajax 对此代码进行编码 请帮助 我是 Bignner 我已经编写了这段代码 它可以工作 但我想与 ajax 一起使用 因为不想重新加载页面 PHP文件 Code For Making Form And getting Data
  • 使用 boost 几何检查两条线是否有交点

    是否可以使用 boost geometry 检查两条线段 每条线段由二维中的两个点给出 是否彼此相交 如果可能的话 boost geometry 是否还允许检查特殊情况 例如另一条线上只有一个点 数字上 或者两条线相等 如果你具体谈论Boo
  • es6 import var 未在代码导入中定义

    出于某种原因 当我执行 var sphere new Core 时在游戏中 我看到核心未定义 即使我导入它 Game js import Core from gameUnits Core export class Game construc
  • 如何在闪亮的仪表板侧栏中手动展开子菜单

    我正在尝试手动展开闪亮仪表板侧边栏中的子菜单 这updateTabItems该功能仅适用于普通菜单 不适用于嵌套菜单 这是基本示例 修改自updateTabItems文档 来显示问题 如果我单击 切换选项卡 它会切换菜单 但不会展开具有子菜
  • GoogleTest:如何跳过测试?

    使用 Google Test 1 6 Windows 7 Visual Studio C 如何关闭给定的测试 又名如何阻止测试运行 除了注释掉整个测试之外 我还能做些什么吗 The docs https github com google
  • 计算 DIV 元素的最大/最小高度

    问题 给定一个具有固定高度的 DIV 元素 其中包含未知数量的子元素 这些子元素的大小相对于其高度 计算 DIV 可以调整大小的最大 最小高度 而不违反其子元素的任何最大 最小值元素 Example求 DIV A 的最大 最小高度 Answ