如何使Flexbox子代的父母身高达到100%?


458

我正在尝试在Flexbox中填充Flex项目的垂直空间。

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  background-color: red;
}
.flex-2-child {
  height: 100%;
  width: 100%;
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>

这是JSFiddle

flex-2-child 不能满足要求的高度,但以下两种情况除外:

  1. flex-2 的高度为100%(这很奇怪,因为弹性项默认情况下为100%,而且在Chrome中存在错误)
  2. flex-2-child 绝对位置也不方便

目前,该功能不适用于Chrome或Firefox。


使用height:100%有什么问题?为.flex-2吗?
rmagnum2002

它违背了flex项的目的,即仅靠自身填充内容,这给了我chrome中最怪异的bug,每当我调整窗口大小时,高度都会归零
Raz 2013年

3
实际上,最新版本的Firefox是唯一可以正常运行的版本
Raz

1
当前,在flexbox中渲染百分比高度时,浏览器之间的行为存在显着差异:stackoverflow.com/a/35537510/3597276
Michael Benjamin

2
是的,Chrome出现了一些问题,尤其是嵌套式Flexbox。例如,我有一个嵌套的flex框,其中包含有子级的子级,height:100%但它们却以自然高度进行渲染。奇怪的是,如果我将它们的高度更改为auto,则它们的渲染height:100%就像我尝试做的那样。如果那是应该的,那肯定不是直观的。
trusktr

Answers:


235

采用 align-items: stretch

与David Storey的答案类似,我的解决方法是:

.flex-2 {
    display: flex;
    align-items: stretch;
}

或者到align-items,你可以使用align-self只是在.flex-2-child你想拉长项目。


7
stretch:这应该是选择的答案。
Dave Everitt

1
无疑,这到目前为止是该问题的最佳答案。完美运作。
marcias

是的,这确实是这个问题的最佳答案。
岛之风Bråthen如此阐述

19
不要忘记height: 100%从子组件中删除您想要与父组件高度相同的组件
Ilham Wahabi GX

height: 100%在答案中加上删除内容-我几乎放弃了,只在恢复到最后一刻才看到此内容absolute-这带有各种问题。
彼得

274

在这里回答了类似的问题。

我知道您已经说过position: absolute;不便,但是可以。有关解决调整大小问题的更多信息,请参见下文。

另请参阅此jsFiddle进行演示,尽管我仅添加了在Chrome中打开的webkit前缀。

您基本上有2个问题,我将分别处理。

  1. 让弹性项目的子项填充高度100%
    • 设置position: relative;在孩子的父母身上。
    • 坐落position: absolute;于孩子。
    • 然后,您可以根据需要设置宽度/高度(在我的示例中为100%)。
  2. 修复Chrome中调整大小的滚动“怪癖”
    • 放在overflow-y: auto;可滚动的div上。
    • 可滚动div必须具有指定的显式高度。我的样本已经有高度100%,但是如果没有应用,您可以指定height: 0;

有关滚动问题的更多信息,请参见此答案


10
要点1)在Chrome中完美运行,Firefox不需要绝对位置。
yuri 2013年

223

如果我理解正确,您是否希望flex-2-child填充其父级的高度和宽度,以便红色区域完全被绿色覆盖?

如果是这样,则只需将flex-2设置为使用flexbox:

.flex-2 {
    display: flex;  
}

然后告诉flex-2-child变得灵活:

.flex-2-child {    
    flex: 1;
}

http://jsfiddle.net/2ZDuE/10/

原因是flex-2-child不是flexbox项,但它的父项是flexbox。


身高100%并且每个孩子都是50/50时,我该怎么做?
里奇·里维

7
请注意,如果您使用“ align-items:center”,则您将无法使用此修复程序,因为您的项目现在将变为等高。
尼尔·梦露

10
@NeilMonroe align-items: center如果align-self: stretch仅对一个孩子使用,仍可以使用。
BT

1
嗨,@ David,我尝试了您的解决方案,它在flex-direction:行布局中正常工作,似乎无法在flex-direction:行布局中工作,或者我在代码中有任何错误的地方。您能否帮助检查为什么在这个小提琴jsfiddle.net/78o54Lmv中,内部框不会占据其父级的全部高度?
欢峰'18

我要补充min-height: 100vh;.flex-2元素,使其工作。谢谢您的帮助!
Tenaciousd93

24

我认为Chrome的行为与CSS规范更加一致(尽管不太直观)。根据Flexbox规范,属性的默认stretch仅更改元素的“交叉尺寸属性”(在本例中为)使用。而且,据我了解CSS2.1规范,百分比高度是根据父级的指定值(而不是其使用的值)计算得出的。父级的指定值不受任何flex属性影响,并且仍为。align-selfheightheightheightauto

显式设置height: 100%可以正式计算子项的百分比高度,就像设置height: 100%html可以计算bodyCSS2.1中的高度百分比一样。


2
究竟!要付诸实践,只需将添加height:100%到即可.flex-2。这是jsfiddle
CourtDemone 2014年

7
Chrome的行为与Chrome Team对CSS规范的解释更加一致。尽管可以这样解释,但还有更好的解释方法,任何一种方法都不会把我们困在这种集市,烦人和令人讨厌的行为中。他们应该考虑更多。
WraithKenny '16

1
@RickDoesburg,这已经一年多了,但是我相信我不得不求助于固定高度的元素。我希望这些浏览器能够共同发挥作用。我真的开始不喜欢移动空间。
约旦

1
height: 100%在Chrome中,将垂直flexbox容器的子级设置为会给我带来非常奇怪的结果。似乎这导致将“指定的高度”设置为容器总高度,而不是元素本身的高度,因此,当其他元素具有相对于其计算的尺寸时,则会导致不必要的滚动。
朱尔斯

13

我自己找到了解决方案,假设您有以下CSS:

.parent {
  align-items: center;
  display: flex;
  justify-content: center;
}

.child {
  height: 100%; <- didn't work
}

在这种情况下,将高度设置为100%无效,因此我将margin-bottom规则设置为auto,例如:

.child {
  margin-bottom: auto;
}

并且子级将与父级的最顶层对齐,align-self如果您愿意,也可以使用该规则。

.child {
  align-self: flex-start;
}

一个不错的技巧,但是问题是:如果child是一个侧边栏,并且具有背景色,则空白空间仍为白色。
鲍里斯·伯科夫

此解决方案的最大优点是父级的高度可以动态变化!先前的解决方案要求父级具有设定的高度。谢谢你
Bribbons

4

一个想法是display:flex;with 用和flex-direction: row;填充containerdiv ,但这并不意味着它具有默认值,即使将其扩展到全高并带有子元素()也需要将父元素设置为或使用与上格了。.flex-1.flex-2.flex-2height:100%;.flex-2-childheight:100%;height:100%;display:flex;flex-direction: row;.flex-2

据我所知,display:flex不会将您所有子元素的高度都扩展到100%。

一个小型演示,删除了以下内容的高度.flex-2-childdisplay:flex;.flex-2以下位置使用:http : //jsfiddle.net/2ZDuE/3/


3

html

<div class="container">
    <div class="flex-1"></div>
    <div class="flex-2">
        <div class="flex-2-child"></div>
    </div>
</div>

的CSS

.container {
    height: 200px;
    width: 500px;
    display: -moz-box;
    display: -webkit-flexbox;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: -moz-flex;
    display: flex;
    -webkit-flex-direction: row;
    -moz-flex-direction: row;
    -ms-flex-direction: row;
    flex-direction: row;
}
.flex-1 {
   flex:1 0 100px;
    background-color: blue;
}
.flex-2 {
    -moz-box-flex: 1;
    -webkit-flex: 1;
    -moz-flex: 1;
    -ms-flex: 1;
    flex: 1 0 100%;
    background-color: red;
}
.flex-2-child {
    flex: 1 0 100%;
    height:100%;
    background-color: green;
}

http://jsfiddle.net/2ZDuE/750/


0

这也可以通过align-self: stretch;我们要拉伸的元素来解决。

有时,在弹性框设置中只拉伸一个项目是可取的。

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  align-self: stretch;
  background-color: red;
}
.flex-2-child {
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>


-7

。容器 { 。。。。align-items:拉伸;。。。。}


5
欢迎使用stackoverflow。您需要充分解释您的答案,以及它与现有答案有何不同。参见stackoverflow.com/help/how-to-answer
Simon.SA,

1
您的答案似乎与BT的答案相同(提前三年编写),但表达得差得多。
昆汀

-12

这是我使用css +的解决方案

首先,如果第一个孩子(flex-1)应该为100px,则不应为flex。实际上,在css +中,您可以设置灵活和/或静态元素(列或行),并且示例变得如此简单:

<div class="container">
  <div class="EXTENDER">
    <div class="COLS">
      <div class="CELL _100px" style="background-color:blue">100px</div>
      <div class="CELL _FLEX" style="background-color:red">flex</div>
    </div>
  </div>
</div>

容器CSS:

.container {
    height: 200px;
    width: 500px;
    position:relative;
}

并且显然包括css + 0.2核心

听到小提琴

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.