【问题标题】:100% height when parent is flex item: Chrome bug? [duplicate]父项为 flex 项时 100% 高度:Chrome 错误? [复制]
【发布时间】:2016-12-23 19:38:04
【问题描述】:

假设我们有这个标记:

<div id="outer">
  <div id="middle">
    <div id="inner">
    </div>
  </div>
</div>

还有这个css:

#outer {
  display: flex;
  flex-direction: column;
  background-color: white;
  height: 300px;
}

#middle {
  flex-grow: 1;
  background-color: beige;
}

#inner {
  background-color: black;
  height: 100%;
}

我希望内部 div 跨越整个 300 像素,因为它应该与中间的 flex 项一样高,而中间的 flex 项又会填充其父项。

这是我在 IE、Edge 和 Firefox 上看到的行为。

在 Chrome 上,中间 div 仍然填充 300 像素,但内部 div 与没有任何高度属性时一样高。

看到这个小提琴:https://jsfiddle.net/mhjussna/

这是 Chrome 中的错误,对吧?

【问题讨论】:

  • height:100% 使用 flex 会出错。而是在 #outer 元素上使用 align-items: stretch
  • align-item 用于水平对齐,当 flex-directioncolumn - so it has no bearing on the question. Also note I don't use height: 100%` 时,在任何直接参与 flex 布局的元素上。

标签: css google-chrome flexbox


【解决方案1】:

这是因为您只是在#middle div 上使用了flex-grow:1

如果您使用推荐的速记flex:1...它会完美运行。

#outer {
  display: flex;
  flex-direction: column;
  background-color: white;
  height: 300px;
}
#middle {
  flex: 1;
  /* here */
  background-color: beige;
}
#inner {
  background-color: black;
  height: 100%;
  color: white;
}
<div id="outer">
  <div id="middle">
    <div id="inner">
      x
    </div>
  </div>
</div>

或者,声明所有的弹性值

#middle {
  flex-grow: 1;
  flex-shrink:0;
  flex-basis:0;
  background-color: beige;
}

JSfiddle Demo

【讨论】:

  • 它有效,不是因为您使用的是flex 属性本身,而是因为Chrome 允许flex-growflex-basis 一起作为孩子身高百分比的父母参考身高。单独的任何一个属性都无法完成任务。 请注意,此解决方案在 Safari 中不起作用。 不过,此答案揭示并突出了 webkit 浏览器中的一个重要差异。我已经在欺骗中更新了我的答案。谢谢。
【解决方案2】:

我认为这不是 Chrome 中的错误。

来自W3C推荐https://www.w3.org/TR/CSS2/visudet.html#the-height-property

指定百分比高度。百分比是相对于生成框的包含块的高度计算的。如果包含块的高度没有明确指定(即,它取决于内容高度),并且该元素不是绝对定位的,则该值计算为“自动”。

如果您为#middle 设置height: 100%,您将获得与在其他浏览器中相同的结果https://jsfiddle.net/mhjussna/1/

【讨论】:

  • 但是包含块的高度不依赖于内容高度(在这种情况下为零),甚至 Chrome 也同意这一点。高度是明确设置的,不是使用 height 属性,而是使用 flex-grow 属性。
  • 另外,将height: 100% 设置为#middle 是没有解决方法的,因为它完全破坏了弹性布局:如果我有另一个弹性孩子怎么办?
  • 我认为如果我们有两个内部元素高度为 100% 的中间元素,则 100% 表示 300 而不是 150px。您可以使用绝对位置与 top:0, right:0, bottom: 0, left: 0 代替 height 100% jsfiddle.net/6xj7zrLv
  • 有绝对定位不起作用的情况。我相信 iframe,但可能会记错。
猜你喜欢
  • 2016-02-11
相关资源
最近更新 更多