开篇

一些元素,如float元素,如position为absolute,inline-block,table-cell或table-caption的元素,以及overflow属性不为visible的元素。它们将会建立一个新的块级格式化上下文。

上述定义已经非常具体的描写叙述了块级格式化上下文(Block Formatting Context)是怎样形成的,为了方便起见。文中均用BFC取代。

如今,让我们用一种简单的方式对其进行又一次定义:

BFC也是HTML中的一个盒子(看不见而已),仅仅有满足至少下列条件之中的一个才干形成BFC:

  • float属性不为none.

  • position属性不为static和relative.

  • display属性为下列之中的一个:table-cell,table-caption,inline-block,flex,or 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中。块级元素又是怎么布局的呢?

W3C规范描写叙述例如以下:

In a block formatting context, each box’s left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box’s line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).bfcbfc.jpg

简单的说:上图中全部属于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; /* creates a block formatting context */
} p {
background-color: lightgreen;
margin: 10px 0;
}

理想情况下。我们会觉得p标签之间的margin应该是它们的和(20px),但实际上却是10px.这事实上是collapsing margins

结果例如以下:

这似乎让人有点困惑,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; /* creates a block formatting context */
} p {
margin: 10px 0;
background-color: lightgreen;
} .newBFC {
overflow: hidden; /* creates new block formatting context */
}

如今的结果为:

由于第二个p元素和第三个p元素属于不同的BFC,因此避免了margin collapse.

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;
}

结果:

在上边的情形中,container是不会有高度的,由于它包括了浮动元素。通常我们解决问题的办法是利用一个伪元素去实现clear fix,可是如今我们有了更好的解决的方法。即利用BFC,由于它够容纳浮动元素的。

我们如今让container形成BFC规则,结果例如以下:

.container {
overflow: hidden; /* creates block formatting context */
background-color: green;
} .container div {
float: left;
background-color: lightgreen;
margin: 10px;
}

结果:

3.利用BFC阻止文本换行

有时候。确切的说大多数情况(若没有特殊设置),文本将会围绕浮动元素(如Figure 1),

但有时候这并非我们期望的。我们想要的是Figure2。

往往可能大家都会选择利用margin-left来强行让p的容器有一个左边距,而距离恰好为Floated div的宽度,但如今我们能够利用BFC更好的解决问题。

首先让我们了解一下文本换行的原理吧:

在Figure1中。整个p元素实际上是处于上图中的黑色区域。p元素没有移动是由于它在浮动元素的下方。但实际上p作为行块级别的元素(相对于行内文本)却发生了移动,由于要给float元素’腾’位置,而随着文本的添加,文本高度超过浮动元素的部分则不会在水平方向上收缩内部距离,因此看起来像是围绕。

如图:

在解决问题之前,我们先来看一下W3C的规范在这方面的描写叙述:

In a block formatting context, each box’s left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box’s line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).

W3C为这样的情况提供了一个解决方式:unless the box establishes a new block formatting context,即为p建立BFC。

结果:

注:此文为译文

blog请戳

原文请戳

理解CSS中的BFC(块级可视化上下文)[译]的更多相关文章

  1. CSS2系列:BFC(块级格式化上下文)IFC(行级格式化上下文)

    BFC 块级格式化上下文,不好理解,我们暂且把她理解成"具有特殊的一类元素" 哪些元素会生成BFC? 根元素 float属性不为none position为absolute或fix ...

  2. BFC块级格式化上下文

    BFC块级格式化上下文 触发条件 overflow 值不为 visible 的块元素 根元素 html 元素 浮动元素(元素的 float 不是 none) 绝对定位元素(元素的 position 为 ...

  3. BFC——块级格式化上下文

    BFC(块级格式化上下文) 一.BFC是什么? 从样式上看,具有BFC的容器和普通的容器没有区别.从功能上看,具有BFC的容器可以看作是隔离了的容器,容器里面的元素不会影响到外面的元素,并且BFC具有 ...

  4. BFC块级格式上下文

    BFC块级格式上下文,独立的一个渲染区域 1.同一个BFC的两个相邻盒子间的margin会重叠(垂直方向): 2.BFC内部的盒子在垂直方向上会一个接一个的放置: 3.每个子元素的左外边距与包含块的左 ...

  5. 我理解的BFC(块级格式化上下文)

    BFC(Block formatting context) 直译为"块级格式化上下文". BFC它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Bl ...

  6. BFC块级格式化上下文简述

    做过页面编写的各位应该对定位不陌生了,这个样式表中的重头戏,也是最难把控的元素之一,今天在这里我们要讲到的就是与浮动与清除浮动相关的定位元素,对于定位有很多种,有绝对定位,还有相对定位,固定定位,静态 ...

  7. BFC块级格式上下文介绍

    块级格式上下文(Block formatting context) 什么是BFC? 块格式化上下文(block formatting context) 是页面 CSS视觉渲染的一部分.它是用于决定块盒 ...

  8. BFC块级排版上下文

    1.BFC 全称是块级排版上下文,用于对块级元素排版,默认情况下只有根元素(body)一个块级上下文,但是如果一个块级元素 设置了float:left,overflow:hidden或position ...

  9. BFC(块级格式化上下文)

    转载自:https://www.cnblogs.com/asheng2016/p/7281784.html https://blog.csdn.net/jiaojsun/article/details ...

随机推荐

  1. 【29】html5新标签有哪些?

    [29]html5新标签有哪些? canvas svg video audio [01]article(IE8不支持) [01]details [02]aside(IE8不支持) [03]header ...

  2. 【01】git下载和安装的完整过程

    [03]下载地址: 有许多种安装方式,主要分为两种,一种是通过编译源代码来安装:另一种是使用为特定平台预编译好的安装包. Git 各平台安装包下载地址为:http://git-scm.com/down ...

  3. 百度蜘蛛IP段分析

    大家进行网站日志分析的时候,常见到很多不同IP段的百度蜘蛛,为了方便大家更好的进行日志分析,下面列举了百度不同IP段常见蜘蛛的一些详情情况,及所谓的降权蜘蛛,沙盒蜘蛛,高权重蜘蛛等等 下面的百度蜘蛛I ...

  4. python刷toj

    1452 import sys a , b , c = map(int,sys.stdin.readline().split()) print ((a+b+c),(a*b*c), '%.2f' %(( ...

  5. 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分

    题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...

  6. POJ 2699 The Maximum Number of Strong Kings ——网络流

    一定存在一种最优方案,使得分数前几个人是SK 所以我们可以二分答案或者枚举,然后就是经典的网络流建模. 另:输入很Excited #include <cstdio> #include &l ...

  7. 【容斥】HDU 4135 Co-prime

    acm.hdu.edu.cn/showproblem.php?pid=4135 [题意] 询问[a,b]中与n互质的数有多少个 [思路] 考虑[1,m]中与n互质的数有多少个,答案就是query(b) ...

  8. 【HDOJ6354】Everything Has Changed(计算几何)

    题意: 给定一个平面和一个(0,0)为中心的大圆,有n个小圆保证没有两两之间相交与覆盖整个大圆的情况,求小圆覆盖后大圆的周长并 1≤m≤100, -1e3<=x[i],y[i]<=1e3, ...

  9. yii 之数据库关联查询

    <?php namespace app\controllers; use yii\web\Controller; use app\models\Customer; class CustomerC ...

  10. hdu - 3594 Cactus (强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=3594 判断给定的图是否是强连通的,并且每条边都只属于一个连通分量. 判断强连通只需要判断缩点之后顶点数是否为1即 ...