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.
http://jsfiddle.net/ahNUX
http://jsfiddle.net/ahNUX/1/
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 wrote h2 {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.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With