【问题标题】:parent div with absolutely positioned child divs refuses to be 100% height具有绝对定位子 div 的父 div 拒绝 100% 高度
【发布时间】:2014-02-23 23:52:54
【问题描述】:

我想要一个 100% 高度的 div,其中包含绝对定位的 div。无论出于何种原因,当我添加子 div 时,父 div 的高度都会缩小到静态内容大小。

为了澄清,我确实希望绝对定位的元素是全高的。只是包含 div。

我有(简化的)标记如下:

<div id="content">
   <div id="dashboard">
      Some text
      <div class="widget"></div>
      <div class="widget"></div>
      ...
   </div>
</div>

还有样式:

#content {
  min-height: 100%;
}
#dashboard {
  min-height: 100%;
  height: 100%;
  position: relative;
}
.widget {
  height: 50px; /* arbitrary */
  width: 50px;
  position: absolute;
}

我已将 #content#dashboard 设置为最小高度 100% 和高度 100% 并且有效。如果我注释掉绝对定位的 div,它们都是屏幕的全高。

但是当我添加.widgets 时,#content 仍然是全高(很好),但#dashboard 只是“一些文本”的高度。无论出于何种原因,将绝对定位的内容添加到 #dashboard 会改变其高度。

注释(编辑)

我不希望 #content 达到 100% 的高度,因为它需要增长 与其他页面上的内容。我希望#dashboard 正好是 100% 高度。

jQuery 工作,但我想只用 css 来做

$("#dashboard").height( $("#content").height() );

我还尝试将 #content 的显示类型更改为阻止或内联,并将 -moz-box-sizing 设置为默认值,因为我读到它可能会破坏 Firefox 的最小高度。

知道如何解决这个问题吗?


类似但不一样:How to set 100% height of a parent div with absolutely positioned children (not a duplicate)?

【问题讨论】:

    标签: javascript html css


    【解决方案1】:

    来自MDN

    min-height 属性的百分比值使用以下公式计算 相对于生成框的包含块的高度。 如果包含块的height没有明确指定(即它取决于内容高度),并且该元素不是绝对定位的,则百分比值被视为0强>。

    因此,您需要明确指定#content 元素的height 才能使#dashboard 元素的min-height 属性起作用。

    因此,请尝试使用 height 属性为 #content 而不是 min-height

    #content {
      height: 100%;
    }
    

    这是一个jsDiddle Demo

    html, body {
        height: 100%;
    }
    #content {
      height: 100%;
    }
    #dashboard {
      min-height: 100%;
      position: relative;
    }
    .widget {
      height: 50px; /* arbitrary */
      width: 50px;
      position: absolute;
    }​
    
    <div id="content">
       <div id="dashboard">
          Some text
          <div class="widget"></div>
          <div class="widget"></div>
          ...
       </div>
    </div>​
    

    更新

    我不希望 #content 在任何时候都是全尺寸的。

    然后,您需要为#content 使用固定高度:

    #content {
      height: 200px;  /* or whatever you want */
    }
    
    #dashboard {
      height: 100%;   /* or inherit */;
    }
    

    否则,您应该使用 JavaScript 计算所需的高度并将其应用于 #dashboard 元素。

    【讨论】:

    • 我不希望#content 一直都是全尺寸的。我希望它在其他页面上无限期地扩展...
    • 那你为什么用min-height ??但是,您可以使用任何所需的百分比或像素。
    • 我希望它占据整个屏幕或扩展。这就是 min-height 的用途,不是吗?
    • 告诉我你的意思。
    • 已编辑问题。您的解决方案可以工作,但 #content 是一个居中的内容 div,页面中间有一个背景,所以我不能有溢出的内容,也不能让它滚动,或者中间有一个滚动条页面!
    【解决方案2】:

    绝对定位的元素不再是布局的一部分。父元素不知道子项有多大。

    需要手动设置父元素的高度,或者使用JS计算子元素的大小并相应应用。

    此外,高度为 100% 的元素也需要其父元素的高度为 100%:

    body, html { height:100% }
    

    【讨论】:

    • 父 (#dashboard) 高度指定为 100%
    • +1 100% 的高度仅占其父元素的 100%,在这种情况下是主体,html :) - jsfiddle.net/mcAXP
    • #content 设置为 min-height: 100%,但根据@Hashem,将其设置为height: 100% 有效。 -- 显然这不是 OP 的解决方案。
    【解决方案3】:

    当您希望#content 的最小高度为 100%(最小 100%,当有更多内容时展开),请使用 min-height 和 height: auto

    body, html {
      height: 100%;
    }
    #content {
      min-height: 100%;
      height: auto;
    }
    

    此外,如果我正确理解您的问题,您可以简单地将position: absolutetop: 0; right: 0; bottom: 0; left: 0; 一起使用,使#dashboard 的高度正好为100%。如果#dashboard 的高度应该相对于#content,则将position: relative 添加到#content。

    【讨论】:

    • 不完全是,#content 浮动并位于另一个 div 下。感谢auto 提示!
    【解决方案4】:

    从流中取出绝对元素。 如果他们不在流程中,他们不会给他们的父母增加高度。

    【讨论】:

    • 父 (#dashboard) 高度指定为 100%
    • 因为 OP 似乎并没有意识到绝对定位会将元素从流中取出。 (即这不是这里的问题。)
    • 由于 OP 不知道如何使用 height 属性,我假设已经对绝对定位进行了说明。由于我的声誉低,我无法发表评论,所以我回答了。我的错。我应该删除它吗?
    • 由于 OP 不知道如何使用 height 属性我没有得到那种印象。他说,只要子 DIV 不是 position: absoluteheight: 100% 就可以工作。我在我的小提琴中验证了:jsfiddle.net/kboucher/4zwyW。 (将 #content min-height 更改为 height 并查看它的工作原理。)
    • 如果您要编辑答案,但我会删除反对票。 (已经尝试过,但在您编辑之前被锁定)
    猜你喜欢
    • 2012-07-08
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2012-08-17
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多