CSS:外边距合并

194 阅读1分钟

使用margin定义块垂直外边距时,可能会出现两个元素间的外边距合并

1、相邻元素的垂直外边距合并

当上下两块元素相遇时,假如上元素设置了margin-bottom,而下元素设置了margin-top,则此时就会出现合并,两个元素的垂直距离取margin-bottom和top两者之间较大者

<html>
<body>
  <div class="dad"></div>
  <div class="son"></div>  
</body>
<style>
  .dad{
    width:600px;
    height:600px;
    margin-bottom:10px;
    background-color: black;
  }
  .son{
    width:300px;
    height:300px;
    margin-top:20px;
    background-color: blue;
  }
</style>
</html>

效果如图,蓝黑两个元素设置了margin-top和bottom后,间距并不是10+20 = 30px,其实是取了两者之间较大者,margin-top = 20px

解决方法

  • 设置左浮动float:left
  • 转为行内块级元素display:inline-block

2、父子元素之间垂直外边距合并

两个嵌套关系的元素,如果父元素没有上内边距(padding-top)边框(border),此时父元素的上外边距就会和子元素的上外边距合并,最终的margin-top值为两者之间较大者

<html>
<body>
  <div class="dad">
    <div class="son"></div>
  </div>


</body>
<style>
  .dad{
    width:600px;
    height:600px;
    margin-top:10px;
    background-color: black;

  }
  .son{
    width:300px;
    height:300px;
    margin-top:100px;
    background-color: blue;
  }
</style>
</html>						

效果如图,子元素并没有像预期的一样距父元素顶部100px,而是紧挨着父元素顶部,而父元素并没有没有距其上部10px,而是变成了100px,在这里就发生了外边距的合并

解决方法

  • 给父元素添加border
  • float:left
  • 绝对定位
  • 父元素添加padding-top
  • display:inline-block
  • 父元素添加overflow:hidden
  • 父元素添加overflow:auto