I have a div
(parent) that contains another div
(child). Parent is the first element in body
with no
I find out that, inside of your .css >if you set the display property of a div element to inline-block it fixes the problem. and margin will work as is expected.
Found an alternative at Child elements with margins within DIVs You can also add:
.parent { overflow: auto; }
or:
.parent { overflow: hidden; }
This prevents the margins to collapse. Border and padding do the same. Hence, you can also use the following to prevent a top-margin collapse:
.parent {
padding-top: 1px;
margin-top: -1px;
}
Update by popular request: The whole point of collapsing margins is handling textual content. For example:
h1, h2, p, ul {
margin-top: 1em;
margin-bottom: 1em;
}
<h1>Title!</h1>
<div class="text">
<h2>Title!</h2>
<p>Paragraph</p>
</div>
<div class="text">
<h2>Title!</h2>
<p>Paragraph</p>
<ul>
<li>list item</li>
</ul>
</div>
Because the browser collapses margins, the text would appear as you'd expect, and the <div>
wrapper tags don't influence the margins. Each element ensures it has spacing around it, but spacing won't be doubled. The margins of the <h2>
and <p>
won't add up, but slide into each other (they collapse). The same happens for the <p>
and <ul>
element.
Sadly, with modern designs this idea can bite you when you explicitly want a container. This is called a new block formatting context in CSS speak. The overflow
or margin trick will give you that.
An alternative solution I found before I knew the correct answer was to add a transparent border to the parent element.
Your box will use extra pixels though...
.parent {
border:1px solid transparent;
}
I had this problem too but preferred to prevent negative margins hacks, so I put a
<div class="supercontainer"></div>
around it all which has paddings instead of margins. Of course this means more divitis but it's probably the cleanest way to do get this done properly.
the parent element has not to be empty at least put
before the child element.
The margin
of the elements contained within .child
are collapsing.
<html>
<style type="text/css" media="screen">
#parent {background:#dadada;}
#child {background:red; margin-top:17px;}
</style>
<body>
<div id="parent">
<p>&</p>
<div id="child">
<p>&</p>
</div>
</div>
</body>
</html>
In this example, p
is receiving a margin
from the browser default styles. Browser default font-size
is typically 16px. By having a margin-top
of more than 16px on #child
you start to notice it's position move.