How can I make Flexbox children 100% height of their parent?
I'm trying to fill the vertical space of a flex item inside a Flexbox.
.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>
And here's the JSFiddle
flex-2-child
doesn't fill the required height except in the two cases where:
-
flex-2
has a height of 100% (which is weird because a flex item has a 100% by default + it is buggy in Chrome) -
flex-2-child
has a position absolute which is also inconvenient
This doesn't work in Chrome or Firefox currently.
Solution 1:
Use align-items: stretch
Similar to David Storey's answer, my workaround is:
.flex-2 {
display: flex;
align-items: stretch;
}
Note that height: 100%
should be removed from the child component (see comments).
Alternatively to align-items
, you can use align-self
just on the .flex-2-child
item you want stretched.
Solution 2:
I have answered a similar question here.
I know you have already said position: absolute;
is inconvenient, but it works. See below for further information on fixing the resize issue.
Also see this jsFiddle for a demo, although I have only added WebKit prefixes so open in Chrome.
You basically have two issues which I will deal with separately.
- Getting the child of a flex-item to fill height 100%
- Set
position: relative;
on the parent of the child. - Set
position: absolute;
on the child. - You can then set width/height as required (100% in my sample).
- Fixing the resize scrolling "quirk" in Chrome
- Put
overflow-y: auto;
on the scrollable div. - The scrollable div must have an explicit height specified. My sample already has height 100%, but if none is already applied you can specify
height: 0;
See this answer for more information on the scrolling issue.
Solution 3:
If I understand correctly, you want flex-2-child to fill the height and width of its parent, so that the red area is fully covered by the green?
If so, you just need to set flex-2 to use Flexbox:
.flex-2 {
display: flex;
}
Then tell flex-2-child to become flexible:
.flex-2-child {
flex: 1;
}
See http://jsfiddle.net/2ZDuE/10/
The reason is that flex-2-child is not a Flexbox item, but its parent is.