I'd like to use the CSS3 flexbox model to create a cross-device layout and found a nice example layout by HugoGiraudel which I used as a starting point.
The layout basically looks like this:
Here is the structure of the HTML:
<div class="wrapper">
<header class="header">Header</header>
<article class="main">
...
</article>
<aside class="aside aside-1">Aside 1</aside>
<aside class="aside aside-2">Aside 2</aside>
<footer class="footer">Footer</footer>
</div>
Here the most important parts of the CSS:
.wrapper {
display: flex;
flex-flow: row wrap;
}
.wrapper > * {
padding: 10px;
flex: 1 100%;
}
.aside { flex: 1 auto; }
.main { flex: 3 0px; }
My problem is when the article contains more content than fits on the screen, a vertical scrollbar appears next to the outer .wrapper
and the footer isn't visible any more.
I tried to add overflow: scroll
and flex-flow: column wrap
to the article's styling, but without success - the scrollbars are visible but the article always grows to completely enclose its contents.
How can I keep the footer visible and the article scrolling if the contents grow?
The reason your article content expands the whole layout is that it doesn't have any height limitation. Something like max-height
would limit its growth, and then a vertical scrollbar could appear.
Here's your code with a few adjustments:
HTML (added a nested flex container for article and asides)
<div class="wrapper">
<header class="header">Header</header>
<section class="inner-wrapper">
<article class="main">
<p>Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas...</p>
<p>Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas...</p>
<p>Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas...</p>
.
.
.
</article>
<aside class="aside aside-1">Aside 1</aside>
<aside class="aside aside-2">Aside 2</aside>
</section>
<footer class="footer">Footer</footer>
</div>
CSS (key adjustments only)
html, body {
height: 100%;
}
.wrapper {
display: flex;
height: 100%;
flex-direction: column; /* switch main container from row direction */
}
.inner-wrapper {
display: flex; /* nested flex container; row direction */
flex: 0 0 50%; /* limit height of container; adjust as necessary */
min-height: 0; /* addresses a scrolling bug in Firefox;
http://stackoverflow.com/a/34982902/3597276 */
}
.header {
flex: 1; /* header to occupy all available height */
}
.footer {
flex: 1; /* footer to occupy all available height */
}
.main {
overflow-y: scroll; /* enable vertical scrollbar */
}
Revised Codepen
NOTES:
- Now the main flex container (
.wrapper
) has three flex items stacked vertically.
- The height of each item can be set individually. In the code above, the header and footer are told to consume all available space (
flex: 1
). The middle flex item (.inner-wrapper
) is confined to 50%, which enables scrolling. Try 25% and 75% for alternative examples.
- The middle item doubles as a flex container, and lines up the article and asides horizontally. The width of each item can be set individually. The previous point applies here, as well.