子元素设置margin-top,父元素也受影响

Posted zhchoutai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子元素设置margin-top,父元素也受影响相关的知识,希望对你有一定的参考价值。

这个问题困惑了非常久。尽管没有大碍早就摸出来怎么搞定它。但始终不明确原因出在哪里,假设仅仅是IE有问题我也不会太在意。可问题是全部上等浏览器都表现如此,这样叫我怎能安心?今天总算下狠心查出来怎么回事,竟然是CSS2.1盒模型规范……尽管非常别扭,非常别扭的规定。

问题例如以下。两层Div结构。Outer Div属性为“margin:0 auto”。本该紧贴外框顶部的,假设没有Inner Div,或者没有Inner Div的“margin-top”属性,一切如预期。可是当Inner Div设置了“margin-top:10px”之后。它的父元素Outer Div也被撑出来一个本不该有的“margin-top:10px”效果。


Inner Div [margin-top: 10px]

Outer Div [margin: 0 auto]

?html Demo Area

 这个“问题”……它是CSS2.1的盒模型中规定的内容——Collapsing margins

In this specification, the expression?collapsing margins?means that adjoining margins (no non-empty content, padding or border areas or clearance separate them) of two or more boxes (which may be next to one another or nested) combine to form a single margin. 全部毗邻的两个或很多其它盒元素的margin将会合并为一个margin共享之。毗邻的定义为:同级或者嵌套的盒元素,而且它们之间没有非空内容、Padding或Border分隔。

  这就是原因了。

“嵌套”的盒元素也算“毗邻”。也会 Collapsing Margins。

这个合并Margin事实上非经常见,就是文章段落元素<p/>,并列非常多个的时候。每个都有上下1em的margin,但相邻的<p/>之间仅仅会显示1em的间隔而不是相加的2em。这个非常好理解,我就是奇怪为什么W3C要让嵌套的元素也共享Margin,想不出来在什么情况下须要这种表现。

? ? ? 这个问题的避免方法非常多,仅仅要破坏它出现的条件即可。给?Outer Div?加上 padding/border,或者给?Outer Div / Inner Div?设置为 float/position:absolute(CSS2.1规定浮动元素和绝对定位元素不參与Margin折叠)。

  很多其它信息。关于不同值的margin折叠后表现的计算方法等等,可自行查阅W3C的CSS2.1规范:Collapsing margins

http://blog.csdn.net/duran1986/article/details/6930967

以上是关于子元素设置margin-top,父元素也受影响的主要内容,如果未能解决你的问题,请参考以下文章

子元素的margin-top属性为啥会影响父元素的margin-top?

子元素margin-top为何会影响父元素?

CSS子元素“margin-top”属性影响父元素[重复]

子元素使用margin-top影响父元素的解决方法

子元素的margin-top影响父元素原因和解决办法

子元素设置margin-top影响到父级的原因及办法