Hey Grant,
Ok, this is a hard one to explain simply, but here goes:
Your position: relative container is being affected by margin
escaping (top margins escape out of the parent container), while
your position: absolute container is not being affected.
Here is a more detailed explanation (using some of the components
from your original question):
--
TEST 1
--
http://maxdesign.com.au/jobs/grant-bailey/index.htm
HTML
div id=div_content
div id=div_omega
h1
I am the omega
/h1
/div
/div
CSS
#div_content { background: lime; }
#div_omega { background: blue; }
h1 { margin: 1em 0; background: yellow; }
- The #div_content has a lime background
- The #div_omega has a blue background
- The h1 has a yellow background as well as 1em of margin above and
below.
RENDERED
- You should see the h1 content and it's yellow background.
- You should NOT see is the #div_content or it's lime background.
- You should NOT see is the #div_omega or it's blue background.
Why won't you see the #div_content or #div_omega? It's because the
top margin on the h1 is escaping out the top of both of these two
containers and they are wrapping tightly around the h1 itself -
making them both invisible.
--
TEST 2
--
http://maxdesign.com.au/jobs/grant-bailey/index2.htm
In this case, the only difference is that #div_content also has
border-top: 1px solid red;. As soon as this occurs, the h1's top
margin is trapped inside #div_content. Then, the background of
#div_content is visible. You should see #div_content's lime
background (as well as the thin red border above).
This is normal margin behavior. You can trap descendant's margins
using border or padding.
--
TEST 3 4
--
http://maxdesign.com.au/jobs/grant-bailey/index3.htm
http://maxdesign.com.au/jobs/grant-bailey/index4.htm
The only difference in these two cases from the tests above is that
#div_omega (the parent of the h1) is set to position: relative;.
As you can see, it makes no difference. The h1 top margin escapes
if no border is on top of #div_content (see index3.htm) and is
trapped if the border is present (see index4.htm).
We still have not seen #div_omega or it's blue background. (If we had
put the border-top: 1px solid red; on #div_omega we would have seen
this element and not #div_content).
--
TEST 5
--
http://maxdesign.com.au/jobs/grant-bailey/index5.htm
In this test, #div_omega (the parent of the h1) is set to
position: relative;. As soon as this happens a few things change:
1. #div_content disappears except for the border-top. This is correct
behavior as without any content in flow, the container will simply
collapse.
2. we can see #div_omega and it's blue background.
3. More importantly, we can see that #div_omega is wrapping around
the top and bottom margins of the h1 element.
--
WHAT DOES THIS MEAN
--
These rough tests show that regardless of whether #div_omega is in
flow as in test 1 and 2 or set to position: relative as in test 3
and 4 - the margin escaping issue is still the same.
However, as soon as #div_omega is set to position: absolute, the
margin escaping issue is not relevant.
Does all of this make sense? I hope so. :)
Russ
On 27/06/2009, at 1:46 AM, Grant Bailey wrote:
Hello,
I have a question about collapsing margins. I realise that the margins
of relatively and absolutely positioned elements are not supposed to
collapse, but I've come across an example that appears to break this
rule. I'd be grateful if someone could clarify what is going on.
My issue is that, in all major browsers, the margin of the h1 of
#div_omega collapses with the margin of body, even though
#div_omega has
been relatively positioned. Furthermore, adding padding to the body
does
not seem to fix the problem.
Grant Bailey
***
List Guidelines: http://webstandardsgroup.org/mail/guidelines.cfm
Unsubscribe: http://webstandardsgroup.org/join/unsubscribe.cfm
Help: memberh...@webstandardsgroup.org
***