So first a bit of meat to set the scene:
HTML
<div id="container">
<div id="inner">test</div>
</div>
CSS
#container {
width:300px;
height:150px;
background-color:#d7ebff;
}
#inner {
width:100%;
height:100%;
padding:5px;
background-color:#4c0015;
opacity:.3;
}
This will produce something that looks like this in all modern browsers:

Now I know this is the standards-compliant behavior (as I knew before, but reconfirmed in this post, and I also know that if I include this code in the inner CSS declaration:
box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box
…it will adopt the “border-box” model and get the behavior that seems more intuitive to me, but I just found myself trying to logically justify the reasoning behind why this is the way it is and I was unable to do it.
It seems (on the surface of things) more logical to me for the inner box to always fill the container to exactly 100% of the container’s width, regardless of the padding or border of the inner box. I run into this problem all the time when I’m trying to set the width of a textarea to 100% that has a border or something like a 4px interior padding…the textarea will always overflow the container.
So my question is…what is the logic behind setting the default behavior to ignore the border and padding of an element when setting its width?
The reason CSS uses the box model as:
Is because CSS is a document styling language. It was (originally) designed with research papers and other formal documents in mind, not as a way to make pretty graphics. As such, the model revolves around the contents, not the container.
CSS isn’t a programming language, it’s a styling language. It doesn’t explicitly tell the document how it should be displayed, it suggests some guidelines the browser should follow. All of these can be overwritten and modified by an actual programming language: JavaScript.
Going back to the content-model idea, consider the following CSS:
heightisn’t specified, because the content defines the height, it may be long, it may be short, but it’s unknown, and unimportant. Thewidthis set to 400px because that’s how wide the content (text) should be.The
paddingis just a means of extending the background color so that the text can be nicely legible away from the edges, just like how you leave space when writing/printing on a sheet of paper.The
borderis a means of surrounding some content to differentiate it from the other backgrounds, or to provide a border (go figure) between various elements.The
margintells the paragraph to leave some space between edges, and with margin-collapsing, each group will remain evenly spaced without having to specify a different margin for the first or last element.To maintain fluidity,
widthdefaults toauto, which means the width will be as wide as possible:Of course, in edge cases, the padding will extend beyond its container because the content might get squished. It’s all about the content.