css-浮动清除、BFC

116 阅读3分钟

1. 浮动

1.1 介绍

css浮动是一种使元素脱离文档流的方法,元素会根据float的值向左或向右移动,直到它的外边界碰到父元素的内边界另一个浮动元素的外边界为止,其周围的元素也会重新排列。浮动是一种非常有用的布局方式,能够改变页面中对象的前后流动顺序。

1.2 浮动特性

1.文字环绕

2.浮动可以让块级元素同行显示

3.元素脱离文档流,父容器的高度塌陷

4.浮动元素可以让行内元素可以设置宽高

5.浮动元素可以设置margin,但是不能用margin:0 auto居中;

1.2.1 文字环绕

<div class="container">
  111测试文字测试文字测试文字222
  <div class="block block1">1</div>
</div>

block1设置浮动

image.png

1.2.2 块级元素同行

<div class="container">
  <div class="block block1">1</div>
  <div class="block block2">2</div>
  <div class="block block3">3</div>
</div>

三个div均设置浮动 image.png

1.2.3 父容器高度塌陷

<div class="container">
  <div class="block block1">1</div>
  <div class="block block2">2</div>
  <div class="block block3">3</div>
</div>

给 block2 和 block3 设置浮动 image.png 可以看到,父容器的高度仅由block1撑起,无法包裹其他设置浮动的元素。

1.2.4 行内元素设置宽高

<div class="container">
  <span class="text">111测试文字测试文字测试文字222</span>
  <div class="block block1">1</div>
  <div class="block block2">2</div>
  <div class="block block3">3</div>
</div>
.text{
  float: left;
  border: 1px solid blue;
  height: 50px;
}

image.png 在设置浮动的情况下,height无效,设置之后height有效。

1.2.5 浮动元素设置margin

<div class="container">
  <div class="block block1">1</div>
  <div class="block block2">2</div>
  <div class="block block3">3</div>
</div>

三个div均设置浮动

.block{
  height: 100px;
  width: 100px;
  float: left;
  margin: 0 10px;
}

设置margin

image.png

1.3 清除浮动

清除浮动,主要是针对浮动会导致父元素高度塌陷的特性。

1.3.1 父容器添加空元素并使用clear

<div class="container">
  <div class="block block1">1</div>
  <div class="block block2">2</div>
  <div class="block block3">3</div>
  <div class="clear"></div>
</div>
.clear{
  clear: both;
}

image.png 父容器高度正常。

此方法缺点是引入了额外的元素。

1.3.2 使用::after伪元素

此方法与上一个方法原理一致,只是将插入空元素以css伪元素的方式实现。

"::after" 伪元素可以在元素的内容之后插入新内容。

给父容器添加clearFix

<div class="container clearFix">
  <div class="block block1">1</div>
  <div class="block block2">2</div>
  <div class="block block3">3</div>
</div>

css中添加

.clearFix::after{
  content: '';
  display: block;
  clear: both;
}

1.3.3 父容器后的元素添加clear

在父容器后添加一个div

<div class="container">
  <div class="block block1">1</div>
  <div class="block block2">2</div>
  <div class="block block3">3</div>
</div>
<div class="clear"></div>
.clear{
  height: 100px;
  background-color: blue;
  clear: both;
}

在设置clear属性之前:

image.png 设置clear之后:

image.png 可以看到,蓝色区域显示正确,但父容器的高度仍然是塌陷状态。

1.3.4 使用父容器BFC

可以为父容器设置overflow: hidden

<div class="container">
  <div class="block block1">1</div>
  <div class="block block2">2</div>
  <div class="block block3">3</div>
</div>
.container{
  overflow: hidden;
}

image.png

2. BFC

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

BFC(Block formatting context):块级格式化上下文,形成独立的渲染区域,内部元素的渲染不会影响外界

2.1 BFC解决的问题

2.1.1 高度塌陷

上文已讲过,不再赘述

2.1.2 外边距合并

两个块级元素的上外边距和下外边距可能会合并为一个外边距,其值会取其中值大的那个,这种行为就是外边距折叠。重叠只会出现在垂直方向

<div class="block block1">1</div>
<div class="block block2">2</div>
.block{
  height: 50px;
  width: 50px;
}
.block1{
  background-color: red;
  margin-bottom: 30px;
}

.block2{
  margin-top: 20px; // 主要修改这一属性
  background-color: green;
}

block1margin-bottom30px,可以对 block2 的 margin-top 进行修改,分别修改为 0px 20px 50px,效果如下: image.png 可以看到垂直方向上的两个margin的效果,只会是其中最大值,分别为30px 30px 50px

2.2 创建BFC

  • position: absolute / fixed
  • float: 不是 none
  • overflow: 不是 visible
  • display: inline-block / flex / grid
  • 根元素