CSS浮动与浮动清除(BFC)

浮动

1. 什么是浮动

当元素的 float 属性不为 none 时就产生了浮动。

<div class="float">float</div>

.float {
  float: left;
  width: 100px;
  height: 100px;
  background-color: #ddd;
}
2. 浮动的影响
  1. 浮动会使元素脱离文档流,具体表现为:
  • 父元素高度塌陷,即不会包含浮动元素。

    比如上面的代码就会表现为
    在这里插入图片描述

  • 文本环绕。 在这里插入图片描述可以注意到这里.normal元素的宽度覆盖了.float元素,但是.float元素下是没有文本的,也就是说文本被“挤”出来了,这是因为它虽然会脱离文档流,但是不会脱离文本流。这个效果也是float属性的本意。其代码如下:

<body>
  <div class="float">float</div>
  <div class="normal">正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素正常元素</div>
</body>

body {
  background-color: #ccc;
}
.float {
  float: left;
  width: 100px;
  height: 100px;
  background-color: #ddd;
}
.normal {
  background-color: #fff;
}
  1. 浮动元素的外边距不会合并。
    关于外边距合并的相关内容可以戳这里

  2. 元素一旦浮动便会变成行内块元素,即 display: inline-block。

3. 浮动的应用

上面提到的文本环绕。

写一个三列布局,左右固定宽度,中间自适应。

<body>
  <div class="left float">left</div>
  <div class="right float">right</div>
  <div class="mid">自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素</div>
</body>

body {
  background-color: #ccc;
}
.float {
  float: left;
  width: 100px;
  height: 100px;
  background-color: #ddd;
}
.left {
  float: left;
}
.right {
  float: right;
}
.mid {
  height: 100px;
  background-color: #fff;
  margin: 200px; /*故意加上了上下 margin 值*/
}

这里我故意加上了上了 margin 值,可以看到效果:
在这里插入图片描述body 也随 .midmargin 往下掉了,这点可以用前面介绍的外边距合并来解释。
ps:我第一次自己写这个三列布局的时候,html 是这样写的

<body>
  <div class="left float">left</div>
  <div class="mid">自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素自适应宽度元素</div>
  <div class="right float">right</div>
</body>

如上把中间自适应的元素写在中间,其实这样比较符合逻辑,但是如果这样写是行不通的,右边的元素会掉下来,因为 .mid 元素是块级元素,会占满整行,.left 不会掉下来是因为它本来就是脱离文文档流的浮动元素。

清除浮动

在子元素上清除

这里我只写不会产生无意义标签的方法。

  • 浮动元素后面若有兄弟元素,则可以在给它的兄弟元素加上clear属性。
  • 如文本环绕那一部分代码,给 .normal 加上 clear:left 或者 clear:both。clear 的具体用法这里不做过多赘述。

给要清除浮动的元素加上伪类或者伪元素。

.float::after {
  content: '';
  display: block;
  visiability: hidden;
  height: 0;
  clear: both;
}

关于 ::after 的使用可以看 MDN 的文档。

在父元素上清除,即BFC

BFC(Block Formatting Context),即块级格式上下文,它的官方解释是:

浮动、绝对定位元素(position 为 absolute 或 fixed)、行内块元素 display:inline-block、表格单元格 display:table-cell、表格标题 display:table-caption 以及 overflow 属性值不为 visible 的元素(除了该值被传播到视点 viewport 的情况)将创建一个新的块级格式化上下文。

总结来说它要满足下列条件之一:

  • float 不为 none

  • position 不为 static 或 relative

  • display 为 table-cell、table-caption、inline-block、flex、inline-flex

  • overflow 不为 visible

只要给父元素加上以上任意一个属性满足条件,也就是给父元素加上 BFC 就能清除子元素的浮动。

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值