css高度塌陷问题全解

4,545 阅读3分钟

高度塌陷

父块级元素的子元素都开启了BFC,导致不能撑开父级元素,而造成高度塌陷。在一个div里,有2个p标签,p标签都设置了浮动,div就会出现高度塌陷。

BFC

**bfc块格式化上下文,**是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

浮动定位和清除浮动及外边距重叠

此处引用MDN:块格式化上下文对浮动定位(参见 float)与清除浮动(参见 clear)都很重要。浮动定位和清除浮动时只会应用于同一个BFC内的元素。浮动不会影响其它BFC中元素的布局,而清除浮动只能清除同一BFC中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一BFC的块级元素之间。

常见的创建bfc的方式如下:

  1. ** 根元素‘HTML’**
  2. ** 行内块元素(元素的 display 为 inline-block)**
  3. 弹性元素(display 为 flex 或 inline-flex 元素的直接子元素)
  4. ** 元素(元素的 float 不是 none)**
  5. ** overflow 值不为 visible 的块元素 **
  6. 绝对定位元素(元素的 positionabsolutefixed

解决高度塌陷方法

1. 使用带clear属性的空元素(必须是块级元素)

在两浮动元素下,新添一个元素,用以撑开父级元素的宽度,再清除之前的左右浮动,向下移动,用以撑开高度。

.clear_both { clear: both; }

<div class="container"> 
<p class="left">floatrightfloatrightfloatrightfloatright,floatrightfloatright</p> 
<p class="right">只读分支:任何人都无法推送代码(包括管理员和所有者),需要推送代码时应设为“常规”或“保护”分支</p>
</div>

优点:简单,代码少,浏览器兼容性好。
缺点:需要添加大量无语义的html元素,代码不够优雅,后期不容易维护。

2. overflow属性

给浮动元素的容器添加overflow属性,属性值不为默认,如hidden,另外在 IE6 中还需要触发 hasLayout ,例如为父元素设置容器宽高或设置 zoom:1。

原理请点击此处:overflow清除浮动原理。

 .container {background-color: antiquewhite; border: steelblue 1px solid;overflow: hidden;zoom: 1; }

3. 给浮动元素的容器添加浮动

给浮动元素的容器也添加浮动属性即可清除内部浮动,但是这样会使其整体浮动,影响布局,不推荐使用。

4. 使用css伪元素after

原理通第一个空元素的方法类似。

 .container {background-color: antiquewhite; border: steelblue 1px solid;} 
.container::after {content: "";display: block;clear: both;}

建议使用css伪元素after解决高度塌陷问题,副作用少,便于维护,但浏览器兼容性一般。