HTML and CSS boggle my mind sometimes.
A DIV with a border shows its background color for the full height of the element and its contents. Why is it that without a border, a DIV will assume (reverse inherit?) its child’s margins?
As an example, here is a JSFiddle illustrating the behavior with and without borders.
Does anyone care to explain how this is a “feature” and not some kind of bug?
Update: adding 1px of padding to the parent is a quick fix.
Sure. In CSS, by default, adjacent top and bottom margins overlap each other. This was a sensible workaround before the adjacent sibling selector (
+) was thought of/became well-supported, as it meant that if you wroteh2 {margin-top: 3em;}, you’d have 3ems worth of space above your h2s even if there was a paragraph before it with a bottom margin of 1em.In your second example, because the
<div>doesn’t have any top or bottom padding or borders, its top and bottom margins are adjacent to the<h1>‘s default top and bottom margins. Even though the<div>’s margins don’t have any height, they’re still treated as if they exist, and so the<h1>’s margins have to overlap them. As the<div>s margins are by definition outside of the background-color area of the<div>, the<h1>’s margins have to be positioned outside too.In your first example, because the
<div>has a border, its margins are no longer adjacent to the<h1>’s margins, so no overlapping occurs. You can get the same effect by adding top and bottom padding to the<div>: http://jsfiddle.net/ahNUX/7/(I’m not sure what you mean about the
<div>“reverse-inheriting” its child’s padding though. In your examples, neither the<div>nor the<h1>have any padding. The space inside the<div>in your first example is created by the<h1>’s top and bottom margin.)