最小高度的父母内部的孩子:100%没有继承身高

lam*_*fun 137 html css

我找到了一种方法,通过设置使div容器占据页面的至少全高min-height: 100%;.但是,当我添加嵌套的div和set时height: 100%;,它不会延伸到容器的高度.有办法解决吗?

html, body {
  height: 100%;
  margin: 0;
}

#containment {
  min-height: 100%;
  background: pink;
}

#containment-shadow-left {
  height: 100%;
  background: aqua;
}
Run Code Online (Sandbox Code Playgroud)
<div id="containment">
  <div id="containment-shadow-left">
    Hello World!
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

Kus*_*our 158

添加height: 1px到父容器.适用于Chrome,FF,Safari.

  • @jjenzz我认为Styler试图解决的问题是,这不会保留`min-height`的扩展特性.例如,如果有足够的文本,它将溢出.见http://jsbin.com/vuyapitizo/1/ (30认同)
  • @styler添加`height:1px;`不会覆盖最小高度.恰恰相反.这是最好的解决方案......演示:http://jsbin.com/mosaboyo/1/edit (14认同)
  • 这样做并不能解决这个问题,实际上你会覆盖最小高度:100%设置,无法实现高度无法实现的任何目标:100%这不是OP想要的 (8认同)
  • 引用Paul的评论如下:"但它不允许容器生长,这违背了使用最小高度的目的." /sf/ask/592764651/#comment66853175_24481020 (3认同)
  • 看看这个为什么`height:1px;`工作http://stackoverflow.com/questions/2341821/height100-vs-min-height100 (2认同)

ptr*_*iek 132

这是一个报告的webkit(chrome/safari)错误,具有最小高度的父级的子级无法继承高度属性:https://bugs.webkit.org/show_bug.cgi?id = 26559

显然Firefox也受到影响(目前无法在IE中测试)

可能的解决方法:

  • 添加位置:相对于#containment
  • 添加位置:绝对到#containment-shadow-left

当内部元素具有绝对定位时,该错误不会显示.

http://jsfiddle.net/xrebB/

编辑于2014年4月10日

由于我目前正在开发一个项目,我真的需要父容器min-height,而子元素继承容器的高度,我做了一些更多的研究.

首先:我不再确定当前的浏览器行为是否真的是一个错误.CSS2.1规范说:

百分比是根据生成的框的包含块的高度计算的.如果未明确指定包含块的高度(即,它取决于内容高度),并且此元素未绝对定位,则该值将计算为"auto".

如果我在容器上放置一个最小高度,我没有明确指定它的高度 - 所以我的元素应该达到一个auto高度.这正是Webkit和所有其他浏览器所做的.

其次,我找到了解决方法:

如果我将我的容器元素设置为display:table,height:inherit它的行为方式与我给它min-height的100%相同.并且 - 更重要的是 - 如果我将子元素设置为display:table-cell它将完美地继承容器元素的高度 - 无论是100%还是更高.

完整的CSS:

html, body {
  height: 100%;
  margin: 0;
}

#container {
  background: green;
  display: table;
  height: inherit;
  width: 100%;
}

#content {
  background: red;
  display: table-cell;
}
Run Code Online (Sandbox Code Playgroud)

标记:

<div id="container">
  <div id="content">
      <p>content</p>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/xrebB/54/.

  • 男人,这仍然没有固定:S (20认同)
  • 2021 年仍然遇到这个错误 https://codepen.io/dshung1997/pen/LYxvXNy (4认同)
  • 这是对规范的奇怪解读,得出的结论是最小/最大高度不是明确的……而奇怪的是,我的意思是错误的。在上下文中阅读整个段落,这种解释是不正确的。为了弄清原因,上下文中的“包含块的高度”在语义上不同于height属性。如果相反,措辞是“包含块的高度*属性*”,那么您的解释将是有道理的(并且是规范中的错误)。 (3认同)
  • 请注意,正如编辑(和 bugs.webkit 链接)所提到的,这并不是一个真正的错误 - 如果父级是“min-height: 20px”,但子级是“height: 120%”,这会影响父母的身高,这会影响孩子的身高...当父母的身高不可知时,孩子不能用它来测量尺寸。 (3认同)

Kev*_*ton 84

以为我会分享这个,因为我没有在任何地方看到这一点,而且是我用来修复我的解决方案.

解决方案:min-height: inherit;

我有一个指定最小高度的父母,我需要一个孩子也是那个高度.

.parent {
  min-height: 300px;
  background-color: rgba(255,255,0,0.5); //yellow
}

.child {
  min-height: inherit;
  background-color: rgba(0,255,0,0.5); //blue
}

p {
  padding: 20px;
  color: red;
  font-family: sans-serif;
  font-weight: bold;
  text-align: center;
}
Run Code Online (Sandbox Code Playgroud)
<div class="parent">
  <div class="child">
    <p>Yellow + Blue = Green :)</p>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

这样,孩子现在充当最小高度的100%的高度.

我希望有些人觉得这很有用:)

  • 部分工作,但孩子只继承`min-height`.当父母身高较大时,孩子不会扩大. (6认同)
  • 它仅适用于最小高度为绝对高度而非百分比的AFAICS. (5认同)
  • 如果父级具有vh值,也可以正常工作!谢谢! (3认同)

小智 8

Kushagra Gour的解决方案确实有效(至少在Chrome和IE中)并且无需使用display: table;和解决原始问题display: table-cell;.请参阅plunker:http://plnkr.co/edit/ULEgY1FDCsk8yiRTfOWU

min-height: 100%; height: 1px;根据需要,在外部div上进行设置会使其实际高度至少为100%.它还允许内部div正确地继承高度.

  • 但它不允许容器生长,这违背了使用最小高度的目的. (21认同)

JW.*_*JW. 8

这是@jackocnr在评论中添加的,但我错过了。对于现代浏览器,我认为这是最好的方法。

如果太小,它将使内部元素填充整个容器,但如果太大,则将扩展容器的高度。

#containment {
  min-height: 100%;
  display: flex;
  flex-direction: column;
}

#containment-shadow-left {
  flex: 1;
}
Run Code Online (Sandbox Code Playgroud)

  • 有史以来最好的解决方案 (4认同)

Sti*_*ers 6

除了现有的答案外,还vh可以使用视口单位。下面的简单片段。当然它也可以和 with 一起使用calc(),例如min-height: calc(100vh - 200px);当页眉和页脚200px一起有高度时。

body {
  margin: 0;
}

.child {
  min-height: 100vh;
  background: pink;
}
Run Code Online (Sandbox Code Playgroud)
<div class="parent">
  <div class="child"></div>
</div>
Run Code Online (Sandbox Code Playgroud)


Dis*_*tum 6

尽管display: flex;已在此处提出建议display: grid;,但现在考虑使用它,因为它已得到广泛支持。默认情况下,网格的唯一子项将完全填充其父项。

html, body {
  height: 100%;
  margin: 0;
  padding: 0; /* Don't forget Safari */
}

#containment {
  display: grid;
  min-height: 100%;
  background: pink;
}

#containment-shadow-left {
  background: aqua;
}
Run Code Online (Sandbox Code Playgroud)


zyr*_*rup 6

这通常对我有用:

.parent {
  min-height: 100px;
  background-color: green;
  display: flex;
}
.child {
  height: inherit;
  width: 100%;
  background-color: red;
}
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>
  <body>
    <div class="parent">
      <div class="child">
      </div>
    </div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)


Mik*_*ins 5

我不认为这是浏览器的错误。所有行为都以相同的方式 - 也就是说,一旦停止指定显式高度,最小高度基本上是“最后一步”。

这似乎正是 CSS 2.1 规范建议的方式: http://www.w3.org/TR/CSS2/visudet.html#the-height-property

百分比是根据生成的盒子的包含块的高度计算的。如果未明确指定包含块的高度(即,它取决于内容高度),并且该元素未绝对定位,则该值计算为“auto”。

因此,由于min-height父级没有显式height设置属性,因此默认为 auto。

display: table-cell如果您的目标受众的浏览器可以的话,可以通过使用 或较新的样式(例如 flexbox)来解决此问题。在某些情况下,您还可以通过在绝对定位的内部元素上使用top和属性来颠覆这一点,这会为您提供 100% 的高度,而无需指定。bottom