从上图可以看出来,只有两个连续的块级元素都设置上下外边距(marign-top 和 margin-bottom)的时候,会出现上下外边距合并的情况,这种情况就是塌陷
这种塌陷是兄弟元素塌陷,还有一种是父子元素塌陷(父元素的上边距为0,子元素的margin-top有值,会把父元素拉下去)。
兄弟元素塌陷
当出现兄弟元素塌陷的时候,真正的边距是取大值的,就是上一个元素的margin-bottom 与 下一个元素的 margin-top 的数值对比,那个数值大,就取那个。
那么,怎么解决这个兄弟元素塌陷的问题呢?通过上边的图就知道,可以这样做:
- 把块级元素改为行内块元素
- 把块级元素改为浮动,当然记得给他们的父元素清除浮动,或者是让父元素overflow:hidden
父子元素塌陷
这种情况呢,一般尽量的给父元素设置 padding 或者 border ,代替给子元素设置margin
- 给父元素加border-top 或者 padding值,padding值代替子元素的margin
- 用BFC,盒子设置:
position:absolute
display:inline-block
float:left / right
overflow:hidden
题外话:触发BFC的条件
题外话:兄弟元素塌陷的第二种方法,把块级元素改为浮动,同时,给这对兄弟元素的父亲设置overflow:hidden
这种方法其实是用了BFC。
什么是 BFC?
BFC全称是Block Formatting Context。
BFC属于普通流,相当于一块独立的渲染区域,BFC看成是元素的一种属性, 当元素拥有了BFC属性后,这个元素就可以看做成隔离了的独立容器。容器内的元素不会影响容器外的元素。
- body根元素
- 设置浮动,取值 不包括none
- 设置定位position,取值为 absoulte 或者 fixed (fixed要结合top值或者其他三个方面的任何一个)
- 设置overflow,取值为hidden、auto 或者 scroll
- 行内块显示模式,inline-block
- 表格单元格,table-cell
- 弹性布局,flex
后边这三个总结一下,都是设置display的值,分别取值 inline-block 或者 table-call 或者 flex ,也可以取值grid,table,……