Styling HTML and BODY selector to height: 100%; vs using 100vh

CssHtml

Css Problem Overview


My brother and I were messing around in sublime earlier and he suddenly shout out, "I learned something new!"

A little shocked, I asked, "What's that..?"

He replied, "Viewport height! I started in I.E.6 when it wasn't fully supported and never really looked at it again." He then proceeded to show me.

To which I replied, "I accomplished the same thing here." and showed him another sandbox project I messed around with.

In my project, in the CSS, I wrote

(edit: I edited to put the background color in the div, not the html or body, my mistake)

(jsfiddle http://jsfiddle.net/nvLq8eg9/embedded/result/ )

html, body {
    height: 100%;
}

div {
    height: 100%;
    background: green;
}

his code is, (jsfiddle http://jsfiddle.net/nvLq8eg9/1/embedded/result/ )

div {
    height: 100vh;
    background: green;
}

Both did virtually the same thing. After doing some research on here, it appears as if the commonly run in to issue via the former method is the inability to scroll; however, on my sandbox project I had more content in it and was able to scroll and interact with the website normally.

Neither of us were able to determine what the differences were between both methods. Would anyone on here be able to educate us?

Thank you!

Css Solutions


Solution 1 - Css

height: 100vh = 100% of the viewport height

height: 100% = 100% of the parent's element height

That is why you need to add height: 100% on html and body, as they don't have a size by default

Something you have to know : if you use % for vertical margin or padding, % will be calculated on the width of the parent element, not the height.

Tip : try using vh and vw units for font size :) I like this one (not supported in some browsers I know) : font-size: calc(.5vh + .5vw); (for example)

See a nice page here for CSS units : http://css-tricks.com/the-lengths-of-css/

Solution 2 - Css

> height: 100vh = 100% of the viewport height

Technically, this is true, but a better way to think of it is = 100% of the available height.

If you are looking to fill up a div with the available height, that's a mighty useful trick. Before I learned this, I would have to ensure every div from html down to the nested div had a height of 100% which can be tedious and error prone. Instead, I now just use height:100vh on the nested item.

See this gist.run for an example with Bootstrap 4.1:

Solution 3 - Css

View port units = vw, vh, vmin, and vmax - are based on the size of the browser viewport. Because, their actual size changes depending on the Viewport Size, this makes them great units for responsive design > Note: When dealing with widths, the % unit is more suitable but with heights, the vh unit is better. > > the width of the viewport will actually be larger than the width of the html element. > >Viewport > html > body

Solution 4 - Css

It's also worth noting that mobile toolbars are NOT included in the viewport height. Apparently this is by design. (https://stackoverflow.com/questions/37112218/css3-100vh-not-constant-in-mobile-browser) This makes vh and vw frustrating to use for mobile. The worst is when your modal's X button is covered by a mobile toolbar.

You can come across similar problems with scrollbars and body margin/padding in vw. (https://stackoverflow.com/questions/25225682/difference-between-width100-and-width100vw)

If you need something to take up the whole viewport height, consider using height:100% (and making sure to set height:100% on both the html and body tags). It is a huge pain as described above, however, if you end up needing to specify height:100% on a long nested chain of elements.

If you don't have a lot of nested elements, using height:100% seems like the way to go. Otherwise, with a lot of nested elements, vh saves you the trouble.

If mobile toolbars are still a relevant problem, then you may need to actively calculate with window.innerHeight.

Solution 5 - Css

This is also interesting:

Here, blue color is for <body> and red is for <html>. If you use 100vh, and then the browser is resized so the content is not visible fully - you get scrollbar. When you scroll, <body> that was 100vh, will stay above and you will see red part of the <html>.

When using 100%, you get <body> covering <html> all the time.

enter image description here

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMedriView Question on Stackoverflow
Solution 1 - CsssodawillowView Answer on Stackoverflow
Solution 2 - CssGreg GumView Answer on Stackoverflow
Solution 3 - CssMr. DroidView Answer on Stackoverflow
Solution 4 - CssGrinfishView Answer on Stackoverflow
Solution 5 - CssBojan VukasovicView Answer on Stackoverflow