I'm trying to create a scrollable flex-child whose height is determined by its flex-grow property.
Example:
.container {
display: flex;
flex-direction: column;
height: 100%;
}
.heading {
background: #9D8189;
flex: 0 0 auto;
padding: 2rem;
min-height: 10rem;
}
.content {
background: #FFE5D9;
flex: 1 0 auto;
padding: 2rem;
/* Makes it scrollable but breaks the flexbox layout */
max-height: 40vh;
overflow: scroll;
}
.box {
background: #D8E2DC;
padding: 7rem;
}
<body>
<div class="container">
<div class="heading">heading</div>
<div class="content">
<div class="box">box1</div>
<div class="box">box2</div>
<div class="box">box3</div>
</div>
</div>
</body>
(jsfiddle)
The layout consists of the flex-parent .container
and two flex-children:
.heading
, that has a fixed height defined by padding
and min-height
, and .content
that is supposed to take all the remaining after .heading
space. In order to achieve that, the first flex-child (.heading
) has flex: 0 0 auto
and the second flex-child (.content
) has flex: 1 0 auto
. However, I also want .content
to have scrollable content inside. For now, the only way I see I can do that is to force .content
to have a somewhat fixed height (e.g. via max-height
, as I did in the provided example by setting it to 40vh
). But while it makes it scrollable, it also breaks the flexbox layout, where content
's height is parent
height minus heading
height.
It seems that as soon as I specify .content
height, it stops respecting the flexbox layout, which makes sense. But is there some other way to make it scrollable while retaining its height which is defined by flexbox layout?
height:100%
requires a known height
from parent to be calculated , unless the element is HTML
itself.
You need : html, body, {height:100%}
so .container {height:100%}
as a meaning , height
value will be inherited from HTML
(browser's window) then by BODY
and finally .container
.
VH
can also be used instead %
to make it simple.
.container
should be set to overflow:hidden
to allow children to scroll once reaching the limit of the parent.
Code sample :
* {
box-sizing: border-box;
padding: 0;
margin: 0;
}
.container {
display: flex;
flex-direction: column;
height: 100vh;/* update */
overflow:hidden;/* update */
}
.heading {
background: #9D8189;
/*flex: 0 0 auto; */
padding: 2rem;
min-height: 10rem;/* if needed */
}
.content {
background: #FFE5D9;
flex: 1 ;/* make it simple */
padding: 2rem;
overflow: auto;/* scroll if needed */
}
.box {
background: #D8E2DC;
padding: 7rem;
}
<div class="container">
<div class="heading">heading</div>
<div class="content">
<div class="box">box1</div>
<div class="box">box2</div>
<div class="box">box3</div>
<div class="box">box3</div>
</div>
</div>
Put min-height: 0
to .content
class style and it should work as you expectm
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With