BFC布局

作者: 刘松阳 | 来源:发表于2020-04-09 15:22 被阅读0次

一、何为BFC

   BFC(Block Formatting Context)格式化上下文,是Web页面中盒模型布局的CSS渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器。

二、形成BFC的条件

  1、浮动元素,float 除 none 以外的值; 
  2、定位元素,position(absolute,fixed); 
  3、display 为以下其中之一的值 inline-block,table-cell,table-caption; 
  4、overflow 除了 visible 以外的值(hidden,auto,scroll);

三、BFC的特性

  1.内部的Box会在垂直方向上一个接一个的放置。
  2.垂直方向上的距离由margin决定
  3.bfc的区域不会与float的元素区域重叠。
  4.计算bfc的高度时,浮动元素也参与计算
  5.bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素。

看到这里是不是有丈二和尚摸不着头脑的感觉,下面我就用案例来帮助理解认识:

(1)BFC中的盒子对齐

特性的第一条是:内部的Box(块级元素)会在垂直方向上一个接一个的放置。(这条特性不必纠结,即便不在BFC里块级盒子也会垂直排列)

(2)外边距折叠

特性的第二条:垂直方向上的距离由margin决定

在常规文档流中,两个兄弟盒子之间的垂直距离是由他们的外边距所决定的,但不是他们的两个外边距之和,而是以较大的为准。


image

html:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> <div class="container">
<div class="box"></div>
<div class="box"></div>
</div></pre>

css:

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> .container { overflow: hidden; width: 100px; height: 100px; background-color: red;
} .box1 { height: 20px; margin: 10px 0; background-color: green;
} .box2 { height: 20px; margin: 20px 0; background-color: green;
}</pre>

[ 复制代码

](javascript:void(0); "复制代码")

这里我门可以看到,第一个子盒子有上边距(不会发生margin穿透的问题);两个子盒子的垂直距离为20px而不是30px,因为垂直外边距会折叠,间距以较大的为准。

那么有没有方法让垂直外边距不折叠呢?答案是:有。特性的第5条就说了:bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素,同样外面的元素不会影响到BFC内的元素。所以就让box1或box2再处于另一个BFC中就行了。

image

html:

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> <div class="container">
<div class="wrapper">
<div class="box1"></div>
</div>
<div class="box2"></div>
</div></pre>

[ 复制代码

](javascript:void(0); "复制代码")

css:

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> .container { overflow: hidden; width: 100px; height: 100px; background-color: red;
} .wrapper { overflow: hidden;
} .box1 { height: 20px; margin: 10px 0; background-color: green;
} .box2 { height: 20px; margin: 20px 0; background-color: green;
}</pre>

[ 复制代码

](javascript:void(0); "复制代码")

*(3)不被浮动元素覆盖 *

以常见的两栏布局为例。

左边固定宽度,右边不设宽,因此右边的宽度自适应,随浏览器窗口大小的变化而变化。

image

html:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> <div class="column"></div>
<div class="column"></div></pre>

css:

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> .column:nth-of-type(1) { float: left; width: 200px; height: 300px; margin-right: 10px; background-color: red;
} .column:nth-of-type(2) { overflow: hidden;/*创建bfc */ height: 300px; background-color: purple;
}</pre>

[ 复制代码

](javascript:void(0); "复制代码")

还有三栏布局。

左右两边固定宽度,中间不设宽,因此中间的宽度自适应,随浏览器的大小变化而变化。

image

html:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> <div class="contain">
<div class="column"></div>
<div class="column"></div>
<div class="column"></div>
</div></pre>

css:

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> .column:nth-of-type(1),
.column:nth-of-type(2) { float: left; width: 100px; height: 300px; background-color: green;
} .column:nth-of-type(2) { float: right;
} .column:nth-of-type(3) { overflow: hidden; /创建bfc/ height: 300px; background-color: red;
}</pre>

[ 复制代码

](javascript:void(0); "复制代码")

也可以用来防止字体环绕:

众所周知,浮动的盒子会遮盖下面的盒子,但是下面盒子里的文字是不会被遮盖的,文字反而还会环绕浮动的盒子。这也是一个比较有趣的特性。

image
         ![image](https://img.haomeiwen.com/i17368924/c9bee255fc76d74d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

html:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> <div class="left"></div>
<p>你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好
你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好
你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好
</p></pre>

css:

(1)环绕

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> .left { float: left; width: 100px; height: 100px; background-color: yellow;
} p { background-color: green;
/* overflow: hidden; */
}</pre>

[ 复制代码

](javascript:void(0); "复制代码")

(2)利用bfc防止环绕

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> .left { float: left; width: 100px; height: 100px; background-color: yellow;
} p { background-color: green; overflow: hidden;
}</pre>

[ 复制代码

](javascript:void(0); "复制代码")

(4)BFC包含浮动的块

这个是大家再熟悉不过的了,利用overflow:hidden清除浮动嘛,因为浮动的盒子无法撑出处于标准文档流的父盒子的height。这个就不过多解释了,相信大家都早已理解。

相关文章

  • 2019-07-03

    BFC 是什么,BFC布局规则是?哪些元素会生成BFC?

  • 什么是BFC

    BFC:即“块级格式化上下文” BFC是在传统布局中实现自适应布局,所产生的一种布局。 那如何触发BFC呢? 下面...

  • 面试题

    1.Bfc 1、BFC是一个独立的布局环境,BFC内部的元素布局与外部互不影响;2、可以通过一些条件触发BFC,从...

  • CSS进阶(二)

    BFC 渐进增强和优雅降级 CSS验证 / 压缩 圣杯布局与双飞翼布局 BFC(块级格式化上下文) BFC(Blo...

  • BFC

    什么是 BFC Block Formatting Contexts(BFC):块级元素格式化上下文 BFC布局规则...

  • 关于 BFC 的布局应用:清除浮动、文字环绕

    关于 BFC 的布局应用:清除浮动、文字环绕 参考文档:理解CSS中BFC BFC(Block Formattin...

  • CSS中的BFC

    个人理解 1、BFC是一个独立的布局环境,BFC内部的元素布局与外部互不影响; 2、可以通过一些条件触发BFC,从...

  • 一文搞懂CSS中的BFC是什么?

    个人理解 1、BFC是一个独立的布局环境,BFC内部的元素布局与外部互不影响; 2、可以通过一些条件触发BFC,从...

  • 多列布局思路

    首先阅读:BFC与多列布局 通过BFC特性:float + BFC盒子 通过margin回拉(用到float)或绝...

  • 布局

    两栏布局(bfc)demo 原理:BFC的区域不会与float box重叠。通过触发main生成BFC, 来实现自...

网友评论

      本文标题:BFC布局

      本文链接:https://www.haomeiwen.com/subject/wgycmhtx.html