CSS 100% height with padding/margin – Dev

The best answers to the question “CSS 100% height with padding/margin” in the category Dev.


With HTML/CSS, how can I make an element that has a width and/or height that is 100% of it’s parent element and still has proper padding or margins?

By “proper” I mean that if my parent element is 200px tall and I specify height = 100% with padding = 5px I would expect that I should get a 190px high element with border = 5px on all sides, nicely centered in the parent element.

Now, I know that that’s not how the standard box model specifies it should work (although I’d like to know why, exactly…), so the obvious answer doesn’t work:

#myDiv {
    width: 100%
    height: 100%;
    padding: 5px;

But it would seem to me that there must be SOME way of reliably producing this effect for a parent of arbitrary size. Does anyone know of a way of accomplishing this (seemingly simple) task?

Oh, and for the record I’m not terribly interested in IE compatibility so that should (hopefully) make things a bit easier.

EDIT: Since an example was asked for, here’s the simplest one I can think of:

<html style="height: 100%">
    <body style="height: 100%">
        <div style="background-color: black; height: 100%; padding: 25px"></div>

The challenge is then to get the black box to show up with a 25 pixel padding on all edges without the page growing big enough to require scrollbars.


There is a new property in CSS3 that you can use to change the way the box model calculates width/height, it’s called box-sizing.

By setting this property with the value “border-box” it makes whichever element you apply it to not stretch when you add a padding or border. If you define something with 100px width, and 10px padding, it will still be 100px wide.

box-sizing: border-box;

See here for browser support. It does not work for IE7 and lower, however, I believe that Dean Edward’s IE7.js adds support for it. Enjoy 🙂


I learned how to do these sort of things reading “PRO HTML and CSS Design Patterns”. The display:block is the default display value for the div, but I like to make it explicit. The container has to be the right type; position attribute is fixed, relative, or absolute.

.stretchedToMargin {
  display: block;
  background-color: green;
<div class="stretchedToMargin">
  Hello, world

Fiddle by Nooshu’s comment


The better way is with the calc() property. So your case would look like:

#myDiv {
    width: calc(100% - 5px);
    height: calc(100% - 5px);
    padding: 5px;

Simple, clean, no workarounds. Just make sure you don’t forget the space between the values and the operator (eg (100%-5px) that will break the syntax. Enjoy!


The solution is to NOT use height and width at all! Attach the inner box using top, left, right, bottom and then add margin.

.box {margin:8px; position:absolute; top:0; left:0; right:0; bottom:0}
<div class="box" style="background:black">
  <div class="box" style="background:green">
    <div class="box" style="background:lightblue">
      This will show three nested boxes. Try resizing browser to see they remain nested properly.