How can an html element fill out 100% of the remaining screen height, using css only?
I have a header element and a content element:
#header
#content
I want the header to be of fixed height and the content to fill up all the remaining height available on the screen, with overflow-y: scroll;
.
It this possible without Javascript?
Solution 1:
forget all the answers, this line of CSS worked for me in 2 seconds :
height:100vh;
1vh
= 1% of browser screen height
source
For responsive layout scaling, you might want to use :
min-height: 100vh
[update november 2018] As mentionned in the comments, using the min-height might avoid having issues on reponsive designs
[update april 2018] As mentioned in the comments, back in 2011 when the question was asked, not all browsers supported the viewport units.
The other answers were the solutions back then -- vmax
is still not supported in IE, so this might not be the best solution for all yet.
Solution 2:
The trick to this is specifying 100% height on the html and body elements. Some browsers look to the parent elements (html, body) to calculate the height.
<html>
<body>
<div id="Header">
</div>
<div id="Content">
</div>
</body>
</html>
html, body
{
height: 100%;
}
#Header
{
width: 960px;
height: 150px;
}
#Content
{
height: 100%;
width: 960px;
}
Solution 3:
Actually the best approach is this:
html {
height:100%;
}
body {
min-height:100%;
}
This solves everything for me and it helps me to control my footer and it can have the fixed footer no matter if page is being scrolled down.
Technical Solution - EDITED
Historically, 'height' is tricky thing to mold with, compared to 'width', the easiest. Since css focus on <body>
for styling to work. The code above - we gave <html>
and <body>
a height. This is where magic comes into picture - since we have 'min-height' on playing table, we are telling browser that <body>
is superior over <html>
because <body>
holds the min-height. This in turn, allows <body>
to override <html>
because <html>
had height already earlier. In other words, we are tricking browser to "bump" <html>
off the table, so we could style independently.
Solution 4:
You can use vh on the min-height property.
min-height: 100vh;
You can do as follows, depending on how you are using the margins...
min-height: calc(100vh - 10px) //Considering you're using some 10px margin top on an outside element
Solution 5:
The accepted solution will not actually work.
You will notice that the content div
will be equal to the height of its parent, body
.
So setting the body
height to 100%
will set it equal to the height of the browser window. Let's say the browser window was 768px
in height, by setting the content div
height to 100%
, the div
's height will in turn be 768px
. Thus, you will end up with the header div being 150px
and the content div being 768px
. In the end you will have content 150px
below the bottom of the page. For another solution, check out this link.