二、BFC和Clearfix
大约 2 分钟约 728 字
(一)高度塌陷和 BFC
1. 成因
- 在浮动布局中,父元素高度默认由子元素高度撑开
- 当子元素设置浮动脱离文档流后,父元素高度丢失,导致页面结构上移
- https://www.bilibili.com/video/BV1XJ411X7Ud?p=64
2. 解决
- 块级格式化环境 Block Formatting Context(BFC),是一个隐含的属性
- 通过设置某些已有样式为元素开启 BFC,使元素形成独立的布局区域
3. 元素开启 BFC 后具备的特点
- 开启 BFC 的元素不会被浮动元素所覆盖
- 开启 BFC 的元素子元素和父元素外边距不会重叠
- 开启 BFC 的元素可以包含浮动的子元素
4. 开启 BFC 的方法
- 设置元素浮动:
display: float;
- 不推荐,宽度会丢失
- 将元素设置为行内块元素:
display: inline-block;
- 不推荐,不适合外部元素,且宽度丢失
- 将元素的 overflow 设置为一个非 visible 的值:
overflow: hidden/auto;
- 常用,但是也有代价,不是最佳解决方案
(二)清除浮动
- 如果不希望某个元素因为其他元素浮动的影响而改变位置
- 可以通过
clear
属性来清除浮动元素对当前元素所产生的影响
1. clear 属性
clear: left;
- 清除浮动向左的元素产生的影响
clear: right;
- 清除浮动向右的元素产生的影响
clear: both;
- 常用
- 清除左右浮动的元素中影响较大的一方产生的影响(上移高度较大者)
2. clear 属性解决高度塌陷
- 可以解决,但是不推荐
- CSS 产生的问题应该由 CSS 来解决
- 凭空增加占用 div 会使 HTML 结构混乱
<div class="box1">
<div class="box2"></div>
<!-- 通过增加HTML结构解决CSS样式产生的高度塌陷问题 -->
<div style="clear: both;"></div>
</div>
3. ::after 伪类解决高度塌陷
- 最完美最常用的解决方案
<div class="box1">
<div class="box2"></div>
</div>
.box1::after {
content: "";
clear: both;
/* ::after伪类元素默认是行内元素,不会独占一行,设置为块元素才可以撑开父元素 */
display: block;
}
(三)外边距重叠
1. 成因
- 相邻元素在垂直方向上的边距会折叠
- 不等时取较大者
2. ::before 伪类解决外边距重叠
- 思路:让两个元素样式上不相邻
<div class="box1">
<div class="box2"></div>
</div>
.box1 {
width: 200px;
height: 200px;
background-color: #bfa;
}
.box1::before {
content: "";
/* table布局无内容时不占空间,同时结构上可以将两个元素隔开 */
display: table;
clear: both;
}
.box2 {
width: 100px;
height: 100px;
background-color: orange;
margin-top: 100px;
}
(四)clearfix 同时解决高度塌陷和外边距重叠
- 为需要清除浮动影响的元素添加
clearfix
类即可 - 常用方法,推荐
.clearfix::before,
.clearfix::after {
content: "";
display: table;
clear: both;
}