饥人谷技术博客

子元素设置了margin-top,父元素跟随下移问题

2017-07-17  本文已影响244人  寻找薛定谔的猫

问题描述:


在页面布局的时候,本来想在子元素上设置margin-top,使得子元素和父元素隔开一定的距离,想象中的效果如下图1;结果却不尽如人意,如图2,margin像是加在了父元素上。
使用的代码如下:

HTML

<div class="big">
      <div class="small">
      </div>
</div>

CSS

 *{
     padding:0px;
     margin: 0px;
 }
.big{
     width: 200px;
     height: 200px;
     background-color:red;
 }
.small{
     width: 100px;
     height: 100px;
     background-color: blue;
     margin-top: 10px;
 }

分析原因:


这是因为父元素和子元素的margin发生了和并,父元素的margin是0px,子元素的margin是10px,所以合并后的margin是10px,且加在了父元素上,于是出现了图2的效果。在CSS2.1中对盒模型有如下规定:在垂直方向上,所有毗邻的两个或多个盒元素的margin将会合并。毗邻的意思是:同级或嵌套的盒元素,并且它们之间没有非空内容、padding或border。
合并后的margin的大小取两个发生合并的元素中margin较大的那一个。
更详细的讲,分为几种情况:

1.两个元素为同级元素,即当一个元素出现在另一个元素上面时,第一个元素的margin-bottom与第二个元素的margin-top发生合并,合并后的margin值是margin-bottom和margin-top中较大的那一个

2.当两个元素嵌套,即一个元素包含在另一个元素中时(假设没有padding或border把两个元素的margin分隔开),它们的margin-bottom和/或margin-top也会发生合并,合并后的margin值同样也是margin-bottom和margin-top中较大的那一个;该问题就属于这一种情况

3.假设有一个空元素,且不设置它的宽高,它有margin-bottom和margin-top,但是没有padding或border。在这种情况下,margin-bottom和margin-top就碰到了一起,它们也会发生合并,合并后的margin值同样也是margin-bottom和margin-top中较大的那一个。
如果这个外边距遇到另一个元素的外边距,它还会发生合并。

解决方法:


1.在父元素上设置overflow:hidden; (触发父元素的BFC)
2.给父元素设置padding或border(隔开两个元素的margin)
3.父元素或子元素使用浮动或者绝对定位(浮动或绝对定位不参与margin的折叠)
上一篇下一篇

猜你喜欢

热点阅读