CSS-BFC相关知识

CSS规范中对 BFC 的描述

  • 块级格式化上下文(block formating context
    浮动,绝对定位元素,非块盒的块容器(不是display:blockblock)(例如,inline-blocks,table-cells和table-captions)和overflow不为visible的块盒会为它们的内容建立一个新的块格式化上下文
    在一个块格式化上下文中,盒(子元素)在竖直方向一个接一个地放置,从包含块(父容器)的顶部开始。两个兄弟盒之间的竖直距离由margin属性决定。同一个块格式化上下文中的相邻块级盒之间的竖直margin会合并
    在一个块格式化上下文中,每个盒的left外边(left outer edge)挨着包含块的left边(对于从右向左的格式化,right边挨着)。即使存在浮动(尽管一个盒的行盒可能会因为浮动收缩),这也成立。除非该盒建立了一个新的块格式化上下文(这种情况下,该盒自身可能会因为浮动变窄)

MDN 对 BFC 的描述

一个块格式化上下文(block formatting context) 是Web页面的可视化CSS渲染出的一部分。它是块级盒布局出现的区域,也是浮动层元素进行交互的区域。
一个块格式化上下文由以下之一创建:

  • 根元素或其它包含它的元素
  • 浮动元素 (元素的 float 不是 none)
  • 绝对定位元素 (元素具有 position 为 absolute 或 fixed)
  • 内联块 (元素具有 display: inline-block)
  • 表格单元格 (元素具有 display: table-cell,HTML表格单元格默认属性)
  • 表格标题 (元素具有 display: table-caption, HTML表格标题默认属性)
  • 具有overflow 且值不是 visible 的块元素,
  • display: flow-root:让当前元素变成一个BFC(触发BFC),没有其他的任何副作用。避免了不成交。
  • column-span: all 应当总是会创建一个新的格式化上下文,即便具有 column-span: all 的元素并不被包裹在一个多列容器中。
  • 一个块格式化上下文包括创建它的元素内部所有内容,除了被包含于创建新的块级格式化上下文的后代元素内的元素。
    代码示例:
    因为儿子是bfc,所以孙子由儿子照,所以爸爸就不管孙子,所以爸爸包不住孙子,但是baba也触发了bfc,所以baba是要包住儿子的。因为儿子的高度写死了。所以才没有包住孙子,想要包住孙子,不要限制高度就可以了。
  • 块格式化上下文对于定位 (参见 float) 与清除浮动 (参见 clear) 很重要。定位和清除浮动的样式规则只适用于处于同一块格式化上下文内的元素。浮动不会影响其它块格式化上下文中元素的布局,并且清除浮动只能清除同一块格式化上下文中在它前面的元素的浮动。

BFC的功能:

  • BFC没有定义,只有功能特征。
  1. 功能1:爸爸管儿子。BFC可以清除浮动。
    用BFC包住浮动元素(不是清除浮动,.clearfix才是清除浮动。)
    以下代码baba不添加float:eft就不BFC,就不能包裹住浮动的erzi。或者添加position: absolute;或者display: inline-block;或者overflow: auto;;display: flow-root等等。
    css不正交:改的东西不是我想要的效果,互相影响。
.baba {
  border: 10px solid red;
  min-height: 10px;
  float:left;
}
.erzi {
  height: 100px;
  width: 400px;
  background: green;
  float: left;
}

使用以上的方法会出现一些自己不想要的效果,比如display:inline-block还虽然触发了BFC,但是还是使元素变成inline-block了,,但是display: flow-root可以做到,没有副作用,只是单纯地触发BFC。

  1. 兄弟之间划清界限
    float + div做左右自适应布局。felx代替。
    一个float:left + overflow: auto就可以简单的实现一个左右布局。如果didi也用float:left触发BFC,缺点:宽度无法自适应。
    <style type = "text/css">
        .gege {
            width: 100px;
            min-height: 600px;
            border: 3px solid red;
            float: left;
            margin-right: 10px;
        }
        .didi {
            overflow: auto;
            min-height: 600px;
            border: 5px solid green;

        }
    </style>
</head>
<body>
<div class = "gege">
erds
</div>
<div class = "didi">
    123
</div>
</body>
/*如果用float:left;则宽度无法自适应*/
}
捕获.PNG

代码示例:
可以实现同等效果更好的代码:flex代替

.gege {
  background: rgba(255,0,0,0.5);
  border: 1px solid rgba(255,0,0,0.5);
  width: 200px;
  height:600px;
  float: left;
  margin-right: 10px;
}
.didi {
  border: 1px solid green;
  background: green;
  height: 600px;
  flex: 1;
 
}
body {
  display: flex;
}

代码示例:

  1. 计算baba的高度:
.baba {
  background: red;
 /* overflow: hidden;不好*/
  border-top: 10px solid blue;
}/*触发bfc或者设置border挡住儿子,则红色区域为爸爸的高度*/
.erzi {
  height: 100px;
  background: rgba(0,255,0,0.5);
  margin-top: 100px;
}
/*若没有bfc或者Border阻挡,则儿子的margin-top把爸爸的高度挡住,则高度和儿子绿色的部分一样*/

代码示例三:

  1. 一个块格式化上下文包括创建它的元素内部所有内容,除了被包含于创建新的块级格式化上下文的后代元素内的元素。
    <style type = "text/css">
        .baba {
            border: 10px solid red;
            display: flow-root;
        }
        .son {
            width: 300px;
            height: 100px; /*son的高度写死了,所以才没有包住sunzi*/
            background: aqua;
            float: left;
            margin-top: 100px;
         }
        .sunzi {
            height: 50px;
            width: 100px;
            margin-top: 200px; /*baba不会包住孙子,不会管孙子*/
            background: blue;
        }
    </style>
</head>
<body>
<div class = "baba">
    <div class = "son son1">
        <div class = "sunzi"></div>
    </div>
</div>
</body>
捕获.PNG

bfc和文档流有什么关系:

  • bfc说的是一个div拥有一些属性后,自己就是一个bfc,所以bfc说的是这个div的特性,并没有说div里面的内容。仅仅是影响外部元素的宽高。
  • 使DIV的高度计算方法发生变化,BFC之前只包含文档流元素,BFC之后还包含浮动元素。
  • 文档流内联元素从左到右排列,块级元素从上到下排列,排列顺序。
  • 如果想触发BFC,必须要写一个有副作用的语句。(CSS的不正交)
  • bfc内部的东西不可以出去,外面的东西也不可以进来。
<head>
    <meta charset="UTF-8">
    <title>demo练习</title>
    <style>
        .baba {
            border: 10px solid red;
            min-height: 10px;
            overflow: hidden;/*改用idsplay:flow-root,就不会出现副作用*/
            position: relative;
        }
        .erzi {
            background: green;
            width: 500px;
            float: left;
        }
        .v1 {
            position: absolute;
            width: 100px;
            height: 100px;
            top: 30px;
            background: grey;
        }
    </style>
</head>
<body>
    <div class = "baba">
        <div class = "erzi"></div>
        <div class = "v1"></div>
    </div>
</body>
  • bfc是不好的。

三个特性:

  1. BFC会阻止垂直(父子)的外边距折叠:只要把父元素设置为BFC就可以了。或者加一个border / padding等。代码示例三:
  2. BFC不会重叠浮动元素。代码示例:
  3. BFC可以包含浮动(清除浮动,不推荐)。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,722评论 1 92
  • 在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例块元素直接接触的垂直外...
    老虎爱吃母鸡阅读 448评论 0 0
  • 先前在学习CSS float时,有同学提到了BFC这个词,作为求知好问的好学生,哪里不懂查哪里,那么今天就来研究一...
    这名字真不对阅读 6,542评论 3 19
  • 什么是BFC BFC全称是Block Formatting Context,即块格式化上下文。它是CSS2.1规范...
    陌客百里阅读 530评论 3 4
  • “到了大学就可以自由恋爱了,你们会有很合心意的男朋友、女朋友,会有很美的爱情……”高中班主任总是这样劝诫十几岁春心...
    扬帆启航风阅读 437评论 0 3