聊聊CSS中的BFC

简介: Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

一、什么是BFC

Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。Block formatting context直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

二、如何创建BFC

①float为 left|right

②overflow为 hidden|auto|scroll

③display为 table-cell|table-caption|inline-block

④position为 absolute|fixed

三、 BFC有哪些特性

特性1:BFC会阻止垂直外边距折叠

按照BFC的定义,只有同属于一个BFC时,两个元素才有可能发生垂直margin的重叠,这个包括相邻元素或者嵌套元素,只要他们之间没有阻挡(比如边框、非空内容、padding等)就会发生margin重叠。

①相邻兄弟元素margin重叠问题



<style>
p{
        color: #fff;
        background: #888;
        width: 200px;
        line-height: 100px;
        text-align:center;
        margin: 100px;
  }
</style>
<body>
    <p>ABC</p>
    <p>abc</p>
</body>


最后页面如下图展示:

544739770a1b0fee76a0e485fd7cee6bb621101b

上图两个P元素之间距离应该为200px,然而实际上只有100px,发生了margin重叠。

bug如何修补

只需要在p外面包裹一层容器,并触发该容器生成一个BFC。那么两个P便不属于同一个BFC,就不会发生margin重叠了。


<style>
p{
        color: #fff;
        background: #888;
        width: 200px;
        line-height: 100px;
        text-align:center;
        margin: 100px;
    }
.wrap{
  overflow:hidden;
}
</style>
<body>
   <p>ABC</p>
  <div class="wrap">
    <p>abc</p>
  </div>
</body>


最后页面如下图展示:

f0a5a67d8334a4e9020b7db2ea7696efbf146cc3

②父子元素margin重叠问题


<style>
.box{
width:100px;
height:100px;
background:#ccc;
}
.wrap {
  background:yellow;
}
.wrap h1{
  background:pink;
  margin:40px;
}
</style>
<body>
<div class="box">box</div>
<div class="wrap">
  <h1>h1</h1>
</div>
</body>

最后页面如下图展示:

5a415d1aaae52e2bf5a96bca23205f864f184410

上图wrap元素与h1元素之间l理论上应该有个40px的上下margin值,然而实际上父子元素并没有存在margin值,与此同时,两个div元素之间的间距为40px。

bug如何修补

方法有很多,在wrap元素中添加:overflow:hidden;或者overflow:auto;使其父元素形成一个BFC;

也可以在wrap元素中添加border:1px solid; 或是padding:1px;这些都可以有效解决父子元素margin重叠问题。


886588012c05bc407f7a065b667da1be0327616a
利用这个特性,我们可以创造 自适应布局

<style>
.box1{
  height: 100px;
  width: 100px;
  float: left;
  background: lightblue;
}
.box2{
  width: 200px;
  height: 200px;
  background: #eee;
}
</style>
<body>
<div class="box1">我是一个左浮动的元素</div>
<div class="box2">喂喂喂!大家不要生气嘛,生气会犯嗔戒的。悟空你也太调皮了,
我跟你说过叫你不要乱扔东西,你怎么又……你看,我还没说完你就把棍子给扔掉了!
月光宝盒是宝物,你把它扔掉会污染环境,要是砸到小朋友怎么办,就算砸不到小朋友,
砸到花花草草也是不对的。</div>
</body>


最后页面如下图展示:
e3ab52f2c2a06701de034c3df37d2a41bdc5069a
这个方法可以用来实现两列自适应布局,效果不错,此时左边的宽度固定,右边的内容自适应宽度。如果我们改变文字的大小或者左边浮动元素的大小,两栏布局的结构依然没有改变!

特性3:BFC可以包含浮动----清除浮动

我们都知道浮动会脱离文档流,接下来我们看看下面的例子:


<style>
.box1{
  width:100px;
  height:100px;
  float:left;
  border: 1px solid #000;
}
.box2{
  width:100px;
  height:100px;
  float:left;
  border: 1px solid #000;
}
.box{
  background:yellow
}
</style>
<body>
<div class="box">
  <div class="box1"></div>
  <div class="box2"></div>
</div> 
</body>


最后页面如下图展示:

86b6751ef8dbb022331b4ceded2d0c45cbf70c47


原文发布时间为:2018年06月23日
原文作者: 浪里行舟
本文来源: 掘金  如需转载请联系原作者
相关文章
|
5月前
|
前端开发 容器
CSS 中BFC是什么?
CSS 中BFC是什么?
97 1
|
3月前
|
前端开发 容器
css【详解】—— BFC 和 IFC
css【详解】—— BFC 和 IFC
25 1
|
5月前
|
前端开发 容器
CSS面试考点:隐藏元素、BFC、垂直居中、CSS3新特性
【4月更文挑战第2天】 CSS面试考点:隐藏元素、BFC、垂直居中、CSS3新特性
49 10
|
前端开发 容器
CSS:BFC(Block Formatting Context 块级格式化上下文)
CSS:BFC(Block Formatting Context 块级格式化上下文)
76 0
|
5月前
|
前端开发 容器
CSS BFC是什么,应用实例
CSS BFC是什么,应用实例
43 0
|
12月前
|
前端开发 容器
前端CSS理解 —— BFC(块级格式化上下文)
前端CSS理解 —— BFC(块级格式化上下文)
58 0
|
前端开发 容器
CSS中的BFC是什么?
CSS中的BFC是什么?
79 0
|
前端开发 容器
CSS实战笔记(九) BFC
CSS实战笔记(九) BFC
100 0
CSS实战笔记(九) BFC
|
前端开发
【CSS】有意思的BFC:Block Formatting Context(块格式化上下文)!🤡
前言 大家好,我是HoMeTown,今天想聊一聊CSS中的BFC,很多朋友应该都听过这个名词,搞懂BFC可以让我们理解CSS中一些很诡异的地方,话不多说,直奔主题!
56 0
|
前端开发 容器
详细说说CSS中的BFC概念
详细说说CSS中的BFC概念
79 0
详细说说CSS中的BFC概念