I have a layout like this:
<div> <div></div> <div></div> <div></div>
</div>and css for it:
html,
body { height: 100%;
}
.flexbox { display: flex; flex-direction: column; flex-wrap: nowrap; justify-content: flex-start; align-content: stretch; align-items: flex-start; height: 100%; width: 100%;
}
.flexbox .main { order: 0; flex: 1 1 auto; align-self: stretch;
}
.flexbox .header,
.flexbox .footer { order: 0; flex: 0 1 auto; align-self: stretch;
}in the above .main column is stretched 100% height, all this works perfect, now adding .flexbox-row inside .main:
<div> <div></div> <div> <div> <div></div> <div></div> <div></div> </div> </div> <div></div>
</div>and css:
.flexbox-row { display: flex; flex-direction: row; flex-wrap: nowrap; justify-content: flex-start; align-content: stretch; align-items: flex-start;
}
.flexbox-row .first,
.flexbox-row .second,
.flexbox-row .third { order: 0; flex: 0 1 auto; align-self: stretch;
}
.flexbox-row .second { order: 0; flex: 1 1 auto; align-self: stretch;
}but for some reason .main column the second one does not stretch 100% in height anymore.
Here is jsbin demo
01 Answer
Add height:100% to .flexbox-row
I've simplified your rules, there were unnecessary properties there.
html,
body { height: 100%; margin: 0
}
.flexbox { display: flex; flex-direction: column; flex-wrap: nowrap; height: 100%; width: 100%;
}
.flexbox .main { flex: 1; background: red
}
.flexbox .header,
.flexbox .footer { background: green; padding:1em
}
.flexbox-row { display: flex; height: 100%;
}
.flexbox-row .first,
.flexbox-row .second,
.flexbox-row .third { background: #C9E1F4; padding: 1em;
}
.flexbox-row .second { flex: 1; background: #A8EDAC
}<div> <div>Header</div> <div> <div> <div>First</div> <div>Main</div> <div>Third</div> </div> </div> <div>Footer</div>
</div>UPDATE
In Chrome and Safari, the height of (non flex) children are not recognized in percentages. However Firefox and IE recognize and scale the children based on percentage heights.
So a workaround for that is adding .position:relative to .main and position:absolute, width/height:100% to .flexbox-row
html,
body { height: 100%; margin: 0
}
.flexbox { display: flex; flex-direction: column; flex-wrap: nowrap; height: 100%; width: 100%
}
.flexbox .main { flex: 1; background: red; position: relative
}
.flexbox .header,
.flexbox .footer { background: green; padding: 1em
}
.flexbox-row { display: flex; position:absolute; height: 100%; width: 100%
}
.flexbox-row .first,
.flexbox-row .second,
.flexbox-row .third { background: #C9E1F4; padding: 1em;
}
.flexbox-row .second { flex: 1; background: #A8EDAC
}<div> <div>Header</div> <div> <div> <div>First</div> <div>Main</div> <div>Third</div> </div> </div> <div>Footer</div>
</div> 6