我对CSS中的BFC的理解

 1.什么是BFC

其实在老师让我们写这篇叫BFC的时候,我跟本不知道有什么BFC的东西。

后来,我找了一些资料,知道了,BFC是Block Formatting Context (块级格式化上下文)的缩写,它是W3C CSS 2.1 规范中的一个概念,是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

2.什么情况下会创建BFC

CSS规范说明了在下列这些情况下会创建新的block formatting context:

?浮动元素(float: left | right);

?绝对定位元素(position: absolute | fixed);

?行内块元素(display: inline-block);

?表格的单元格(display: table-cells,TD、TH);

?表格的标题(display: table-captions,CAPTION);

?‘overflow‘ 特性不为visible 的元素(除非该值已经传播到viewport?);

?表格元素创建的"匿名框"

注意,"display:table" 本身并不产生"block formatting contexts"。但是,它可以产生匿名框,其中包含"display:table-cell" 的框会产生块格式化上下文。总之,对于"display:table" 的元素,产生块格式化上下文的是匿名框而不是"display:table" 。

注意,是这些元素创建了块格式化上下文,它们本身不是块格式化上下。

3.BFC布局规则:

  • 内部的Box会在垂直方向,一个接一个地放置。
  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
  • 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  • BFC的区域不会与float box重叠。
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  • 计算BFC的高度时,浮动元素也参与计算

 4.BFC的主要作用及原理

1.自适应两栏式

代码:

页面效果如下:

这个图就像上面的布局规则第3条(每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。)所说一样,虽然存在浮动的元素mydiv1,但mydiv2的左边依然会与包含块的左边相接触,而根据布局规则第4条(BFC的区域不会与float box重叠)所说,我们可以通过通过触发mydiv2生成BFC, 来实现自适应两栏布局:

而当我们添加了(overflow:hidden)后,我们就通过触发mydiv2来生成了一个BFC,而BFC生成后页面效果如图:

注意:这个新的BFC不会与浮动的mydiv1重叠。因此会根据包含块的宽度,和mydiv1的宽度,自动变窄

2.清除浮动

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" content="text/html">
    <title></title>
    <style type="text/css">
        .mydiv1{
            width: 100px;
            height: 150px;
            float: left;
            background: #f66;
            margin-left: 10px;
        }
        .mydiv2{
            width: 100px;
            height: 150px;
            background: #fcc;
            float: left;
            margin-left: 10px;
        }
        .mydiv3{
            width: 100px;
            height: 150px;
            float: left;
            background-color: #ebcccc;
            margin-left: 10px;
        }
        .wdiv{
            border: 5px solid #9acd32;
            width: 100%;
        }
    </style>
</head>
<body>
    <div class="wdiv">
        <div class="mydiv1"></div>
        <div class="mydiv2"></div>
        <div class="mydiv3"></div>
    </div>
</body>
</html>

一般我们想下的是如下的情况:

可是现实效果呢?却是如下:

之所以会这样了,是因为父容器并没有把浮动的子元素包围起来,俗称塌陷

而我们要清除这种现像了,就要根据布局规则第6条(计算BFC的高度时,浮动元素也参与计算),我们可以触发wdiv来生成BFC,,那么wdiv在计算高度时,wdiv内部的浮动元素也会参与计算。代码如下:

效果也同上面第一张一样,效果如下:

总结

因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。

时间: 2024-08-05 19:35:33

我对CSS中的BFC的理解的相关文章

BFC?来自CSS中的BFC

浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的块级格式化上下文. 在一个块级格式化上下文里,盒子从包含块的顶端开始垂直地一个接一个地排列,两个盒子之间的垂直的间隙是由他们的margin 值所决定的.两个相邻的块级盒子的垂直外边距会发生叠加. 在块级格式化上下文中,每一个盒子的左外边缘(margin-left)会触碰到容

CSS中box-sizing属性的理解与部分用法

今天看了一些关于box-sizing的一些资料,在这里整理一下,希望也能对大家有所帮助. box-sizing是CSS的一个属性,很好的解决了盒模型的相关问题.CSS中的盒模型(Box model)分为两派,一派是W3C的标准模型,一派是IE的传统模型.那它们之间有什么不同的呢?首先需要明确它们都是对元素计算尺寸的模型,具体说就是对元素的width,height,padding,border以及元素实际尺寸的计算关系:而不同的地方就在于两者的计算方法不一至:(下面引用一些公式向大家展示一下两者的

理解CSS中的BFC(块级可视化上下文)[译]

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

css中的bfc怎么玩?

首先弄明白一个概念,上面是bfc? w3c是这样解释 BFC(Block Formatting Context)是Web页面中盒模型布局的CSS渲染模式.它的定位体系属于常规文档流. 说通俗一点就是: float的值不为none position的值不为static或者relative display的值为 table-cell, table-caption, inline-block, flex, 或者 inline-flex中的其中一个 overflow的值不为visible <!DOCTY

CSS中的BFC详解

一 常见定位方案 普通流 默认,从上而下,行内元素水平排列,行满换行,块级元素渲染成一个新行. 浮动 先按普通流位置出现,然后根据浮动方向偏移. 绝对定位 元素具体位置由绝对定位坐标组成. 一.何为BFC BFC(Block Formatting Context)格式化上下文,是Web页面中盒模型布局的CSS渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器. BFC 即 Block Formatting Contexts (块级格式化上下文),属于普通流. 可以把 BFC 理解为一个封闭

对css中clear元素的理解

clear:left;表示左侧不能有浮动元素. clear:right;表示右侧不能有浮动元素. clear:both;表示左右两侧都不能有浮动元素. 但在使用时,还得考虑css优先级问题.相同类型选择器制定的样式,在样式表文件中,越靠后的优先级越高 . 当所有元素的clear属性都设为right时,由于优先级的原因,并不是所想的那样:右侧没有浮动元素,而是右侧出现了浮动元素. 比如下面的代码: <html> <head> <style type="text/css

简单谈谈自己对htm与css中画圆的理解。

近几天,在利用css编辑中,发现不少边框图像要求是矩形圆角或者直接画一个圆的例子,下面和大家一起分享下对画圆的看法. 在这次的分享中,我侧重给大家看一些例子来更好的理解, 我们都明白,画圆时要用到“border-radius:”,而且在每次画圆时,我们都应该先设定一个width和height. 那么我们可以这样理解, 我们的圆是在一个矩形(正方形)中进行裁剪的,而border-radius就是我们要裁剪的尺寸. 给大家一些图片,更好的去理解. 首先,我们设定一个width为100px,高度为10

css中的bfc和ifc

bfc 定义:块级格式化上下文,他是一个独立的渲染区域,他规定了这个内部如何布局,并且与这个区域的外部毫不相干. BFC布局规则: 内部的Box会在垂直方向,一个接一个地放置. Box垂直方向的距离由margin决定.属于同一个BFC的两个相邻Box的margin会发生重叠 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反).即使存在浮动也是如此. BFC的区域不会与float box重叠,常用来清除浮动和布局. BFC就是页面上的

CSS中关于margin的理解误区

在以前,我对于margin的理解是这样的,此处用margin-top举例:指的是离相邻元素之间的距离. 但是实际是:相对于自身原来的位置偏移. 举个例子: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <!-- 规定字符集的编码为utf-8