什么是BFC

  • 之前一直听舍友说起过BFC,但老实说,我并不理解,后来看了同学写的BFC的内容也不是理解的很深,今天看到一个文章,懂了一点点,感觉有所入门,今天和大家一起分享一下。

开始

  • 一些元素,如float元素,如positionabsolute,inline-block,table-celltable-caption的元素,以及overflow属性不为visible的元素,它们将会建立一个新的块级格式化上下文
  • 总结一下
    • 上述定义已经很详细的描述了块级格式化上下文(Block Formatting Context)是如何形成的,为了方便起见,文中均用BFC代替。现在,让我们用一种简单的方式对其进行重新定义: BFC也是HTML中的一个盒子(看不见而已),只有满足至少下列条件之一才能形成BFC:
    • float属性不为none.
    • position属性不为staticrelative.
    • display属性为下列之一:table-cell,table-caption,inline-block,flex,或者 inline-flex.
    • overflow属性不为visible.

让我们建立一个BFC

  • html代码如下:
<div class="container"> 
    Some Content here
</div>
  • 我们可以用CSS为container容器附加上述条件,如overflow: scroll, overflow: hidden, display: flex, float: left, or display: table.尽管这些条件都能形成一个BFC,但是它们各自却有着不一样的表现:
    • display: table : 在响应式布局中会有问题
    • overflow: scroll : 可能会出现你不想要的滚动条
    • float: left: 使元素左浮动,并且其他元素对其环绕
    • overflow: hidden: 消除溢出部分
  • 这么看来,建立BFC的最好方式莫过于overflow:hidden了:
.container { overflow: hidden;}

在BFC中,块级元素又是怎么布局的呢?

块级布局.png
  • 简单的说:上图中所有属于BFC的box都默认左对齐,并且它们的左边距可以触及到容器container的左边。最后一个box,尽管它是浮动的,但它依然遵循这个原则。(BFC中的浮动下面会介绍)
  • 那么,BFC到底有什么卵用呢?
  • 实际上,真的特别有用

1.利用BFC可以消除Margin Collapse

  • 在正常情况下,在一个容器内的所有box将会由上至下依次垂直排列,即我们所说的一个元素占一行,并切垂直相邻的距离(即margin)是由各自的margin决定的,而不是两个margin的叠加。
  • 让我们看一个例子:红色的div包含三个绿色的p元素。
  • html代码
<div class="container"> 
  <p>Sibling 1</p> 
  <p>Sibling 2</p> 
  <p>Sibling 3</p>
</div>
  • css代码
.container { background-color: red; overflow: hidden;}
p { background-color: lightgreen; margin: 10px 0;}
  • 理想情况下,我们会认为p标签之间的margin应该是它们的和(20px),但实际上却是10px.这其实是collapsing margins
结果.png
  • 这似乎让人有点困惑,BFC导致了margin collapse,而现在又要用它来解决margin cllapse.但是始终要记住一点:只有当元素在同一个BFC中时,垂直方向上的margin 才会clollpase.如果它们属于不同的BFC,则不会有margin collapse.因此我们可以再建立一个BFC去阻止margin collpase的发生。
  • 现在HTML变成:
<div class="container"> 
    <p>Sibling 1</p> 
    <p>Sibling 2</p> 
    <div class="newBFC"> 
      <p>Sibling 3</p> 
    </div>
</div>
  • CSS也有改变:
.container { background-color: red; overflow: hidden;} 
p { margin: 10px 0; background-color: lightgreen;} 
.newBFC { overflow: hidden; }
  • 现在的结果为:
现在的结果.png

2.利用BFC去容纳浮动元素

  • 我相信大家经常会遇到一个容器里有浮动元素,但是这个容器的高度却是0的场景,如下图:
  • 看下面的例子:
  • html:
<div class="container"> 
    <div>Sibling</div> 
    <div>Sibling</div>
</div> 
  • css:
.container { background-color: green;} 
.container div { float: left; background-color: lightgreen; margin: 10px;}
结果.png
  • 在上边的情形中,container是不会有高度的,因为它包含了浮动元素。通常我们解决这个问题的办法是利用一个伪元素去实现clear fix,但是现在我们有了更好的解决办法,即利用BFC,因为它够容纳浮动元素的。 我们现在让container形成BFC规则,结果如下:
.container { overflow: hidden; background-color: green;} 
.container div { float: left; background-color: lightgreen; margin: 10px;}
新结果.png

3.利用BFC阻止文本换行

  • 有时候,确切的说大多数情况(若没有特殊设置),文本将会环绕浮动元素(如Figure 1), 但有时候这并不是我们期望的,我们想要的是Figure2。
float.png
  • 往往可能大家都会选择利用margin-left来强行让p的容器有一个左边距,而距离恰好为Floated div的宽度,但现在我们可以利用BFC更好的解决这个问题。
  • 首先让我们了解一下文本换行的原理吧:
float环绕得原因.png
  • 在Figure1中,整个p元素实际上是处于上图中的黑色区域,p元素没有移动是因为它在浮动元素的下方。但实际上p作为行块级别的元素(相对于行内文本)却发生了移动,因为要给float元素’腾’位置,而随着文本的增加,文本高度超过浮动元素的部分则不会在水平方向上收缩内部距离,因此看起来像是环绕。
  • 如图:
环绕.png
  • W3C为这种情况提供了一个解决方案:unless the box establishes a new block formatting context,即为p建立BFC。
  • 结果:
非环绕.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,751评论 1 92
  • BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用...
    一木_qintb阅读 1,535评论 0 2
  • 程序报错信息 问题描述 连接池保留了连接,但是mysql数据库已经回收了连接 解决方案 程序连接池配置如果使用的是...
    no才阅读 1,661评论 0 0
  • 开始看李雪的《当我遇见一个人》,然然有退行的表现,以前一些可以自己做的就想让我来帮着做,心理上用这种方式来体会爸爸...
    张家小林阅读 243评论 0 0
  • 二郎神,本名杨戬。 又称二郎显圣真君、灌口二郎、二郎真君、灌江神、赤城王、清源妙道真君等等。 是民间信仰和道教的神...
    欧阳瑟涩阅读 1,469评论 1 1