CSS垂直外边距合并

这几天写CSS的时候发现一个奇怪的现象,子元素的margin-top会影响父元素的margin-top。本来父元素只是一个简单的容器,没有设置样式,第一个子元素设置了margin-top后,父元素也具有了一样的margin-top,原来是边距合并(Margin Collapse)在作怪。

普通文档流中相邻的块框,还有父元素与第一个子元素的上边距,父元素与最后一个子元素的下边距都有可能会发生外边距合并,这其中有些复杂的规则存在,与BFC(Block formatting contexts)密切相关,在同一个BFC(块格式化上下文)中,相邻的块级框之间的垂直外边距会出现折叠。详细的描述见参考文档[1]和[2],文档[1]描述的十分详细,这里就没必要再重复了。

防止父子元素外边据合并的常用方法有:

  • 父元素设置overflow:visible之外的其他值
  • 父元素设置border
    比如设置一个1px透明的border
    [css]
    border: 1px solid transparent;/透明边框,防止父子元素垂直边距合并/
    [/css]
  • 父元素或子元素设置float属性
  • 父元素设置padding-top(padding-top:1px)
  • 设置父元素或者自身display:inline-block
  • 父元素或子元素绝对定位(absolute或fix)
  • 设置父元素非空,填充一定的内容

注意:只有普通文档流中块框的垂直外边距才会发生外边距合并。行内框、浮动框或绝对定位之间的外边距不会合并。

References:
[1]深入理解BFC和Margin Collapse
[2]CSS 外边距合并
[3]由浅入深漫谈margin属性

===
[erq]