揭开CSS中BFC的面纱

引言:

这篇文章是我对BFC的理解及总结,带你揭开BFC的面纱。你将会知道BFC是什么,形成BFC的条件,BFC的相关特性,以及他的实际应用。

一、何为BFC

BFC(Block Formatting Context)格式化上下文,是Web页面中盒模型布局的CSS渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器。

二、形成BFC的条件

1、浮动元素,float 除 none 以外的值; 
      2、定位元素,position(absolute,fixed); 
      3、display 为以下其中之一的值 inline-blocks,table-cells,table-captions; 
      4、overflow 除了 visible 以外的值(hidden,auto,scroll);

三、BFC的特性

1.内部的Box会在垂直方向上一个接一个的放置。
      2.垂直方向上的距离由margin决定
      3.bfc的区域不会与float的元素区域重叠。
      4.计算bfc的高度时,浮动元素也参与计算
      5.bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素。

看到这里是不是有丈二和尚摸不着头脑的感觉,下面我就用案例来帮助理解认识:

四、实践是检验真理的唯一标准

(1)BFC中的盒子对齐

特性的第一条是:内部的Box会在垂直方向上一个接一个的放置。

浮动的元素也是这样,box3浮动,他依然接着上一个盒子垂直排列。并且所有的盒子都左对齐。

布局:

    <div class="container">
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
        <div class="box4"></div>
    </div>

css:

        div {
            height: 20px;
        }

        .container {
            position: absolute;  /* 创建一个BFC环境*/
            height: auto;
            background-color: #eee;
        }

        .box1 {
            width: 400px;
            background-color: red;
        }

        .box2 {
            width: 300px;
            background-color: green;
        }

        .box3 {
            width: 100px;
            background-color: yellow;
            float: left;
        }

        .box4 {
            width: 200px;
            height: 30px;
            background-color: purple;
        }

(2)外边距折叠

特性的第二条:垂直方向上的距离由margin决定

在常规文档流中,两个兄弟盒子之间的垂直距离是由他们的外边距所决定的,但不是他们的两个外边距之和,而是以较大的为准。

布局:

    <div class="container">
        <div class="box"></div>
        <div class="box"></div>
    </div>

css:

        .container {
            overflow: hidden;
            width: 100px;
            height: 100px;
            background-color: red;
        }

        .box1 {
            height: 20px;
            margin: 10px 0;
            background-color: green;
        }

        .box2 {
            height: 20px;
            margin: 20px 0;
            background-color: green;
        }

这里我门可以看到,第一个子盒子有上边距(不会发生margin穿透的问题);两个子盒子的垂直距离为20px而不是30px,因为垂直外边距会折叠,间距以较大的为准。

那么有没有方法让垂直外边距不折叠呢?答案是:有。特性的第5条就说了:bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素,同样外面的元素不会影响到BFC内的元素。所以就让box1或box2再处于另一个BFC中就行了。

布局:

    <div class="container">
        <div class="wrapper">
            <div class="box1"></div>
        </div>
        <div class="box2"></div>
    </div>

css:

    .container {
        overflow: hidden;
        width: 100px;
        height: 100px;
        background-color: red;
    }

    .wrapper {
        overflow: hidden;
    }

    .box1 {
        height: 20px;
        margin: 10px 0;
        background-color: green;
    }

    .box2 {
        height: 20px;
        margin: 20px 0;
        background-color: green;
    }

(3)不被浮动元素覆盖 

以常见的两栏布局为例。

左边固定宽度,右边不设宽,因此右边的宽度自适应,随浏览器窗口大小的变化而变化。

布局:

    <div class="column"></div>
    <div class="column"></div>

css:

        .column:nth-of-type(1) {
            float: left;
            width: 200px;
            height: 300px;
            margin-right: 10px;
            background-color: red;
        }

        .column:nth-of-type(2) {
            overflow: hidden;/*创建bfc */
            height: 300px;
            background-color: purple;
        }

还有三栏布局。

左右两边固定宽度,中间不设宽,因此中间的宽度自适应,随浏览器的大小变化而变化。

布局:

    <div class="contain">
        <div class="column"></div>
        <div class="column"></div>
        <div class="column"></div>
    </div>

css:

        .column:nth-of-type(1),
        .column:nth-of-type(2) {
            float: left;
            width: 100px;
            height: 300px;
            background-color: green;
        }

        .column:nth-of-type(2) {
            float: right;
        }

        .column:nth-of-type(3) {
            overflow: hidden;  /*创建bfc*/
            height: 300px;
            background-color: red;
        }

也可以用来防止字体环绕:

众所周知,浮动的盒子会遮盖下面的盒子,但是下面盒子里的文字是不会被遮盖的,文字反而还会环绕浮动的盒子。这也是一个比较有趣的特性。

             

布局:

    <div class="left"></div>
    <p>你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好       你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好       你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好    </p>

css:

(1)环绕

        .left {
            float: left;
            width: 100px;
            height: 100px;
            background-color: yellow;
        }

        p {
            background-color: green;
            /* overflow: hidden; */
        }

(2)利用bfc防止环绕

        .left {
            float: left;
            width: 100px;
            height: 100px;
            background-color: yellow;
        }

        p {
            background-color: green;
            overflow: hidden;
        }

(4)BFC包含浮动的块

这个是大家再熟悉不过的了,利用overflow:hidden清除浮动嘛,因为浮动的盒子无法撑出处于标准文档流的父盒子的height。这个就不过多解释了,相信大家都早已理解。

总结

我希望这篇文章已经向你展示了BFC的相关特性,以及他们如何影响元素在页面上的视觉定位。所有的例子都展示了它们在实际案例中的应用,这应该会使得他们更加清晰。

如果你有任何东西想要补充,请在评论中留言,欢迎共同讨论。

时间: 2024-10-18 11:49:24

揭开CSS中BFC的面纱的相关文章

css中bfc和ifc

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

html/css中BFC的开启、关闭、作用

什么是BFC BFC是什么并不重要.重要的是开启它干嘛?以及如何开启它 根据W3C的标准,在页面中元素都一个隐含的属性叫做Block Formatting Context(块级 格式化 环境)简称BFC 开启元素的BFC后,元素会有如下特性: 1.父元素的垂直外边距不会和子元素重叠. 2.开启BFC的元素不会被浮动的元素所覆盖. 3.开启BFC的元素可以包含浮动的子元素. 在以下情况下,会自动开启BFC: 1.设置元素浮动(此方法,虽然可以撑开父元素,但是会导致父元素的宽度丢失,也会导致下边的元

通过汇编揭开String中数据结构神秘面纱

String(字符串),是编程语言中表示文本的数据类型.接触编程的你一定每天都会见到.那看似渺小的string(字符串),里面到底还隐藏着多少的秘密?大家平时天天使用的东西,你真的了解它吗?可能平时很多人并不会深入研究它,如果你的能力还不错,不妨看看下面几个问题.要是对他们还存在困惑,那恭喜你,你找到了你要提升的方向.一.思考 在 Swift 开发使用字符串的过程中,你是否有思考过以下问题? 1 个字符串变量占用多少内存? 字符串 str1.str2 的底层存储有什么不同? 如果对 str1.s

CSS中块级格式化上下文(BFC)的特性与应用

一.何为BFC 块级格式化上下文(Block Formatting Context)是网页CSS视觉渲染的一部分,并用于决定盒子的布局.在定位体系中属于常规流(Normal Flow)(另外两种定位体系为浮动(Floats)和绝对定位(Absolute Positioning)). 二.BFC如何形成 BFC的形成,根据W3C所言: 浮动.绝对定位元素(position 为 absolute 或 fixed).行内块元素 display:inline-block.表格单元格display:tab

是的,是你的BFC - CSS中常用

是的,是你的BFC - CSS中常用 CFC 全称:(Block Formatting Contexts)含义是块级格式化上下文),就是一个块级元素的渲染显示规则 一.简易理解.定义 可以把 BFC 理解为一个封闭的大箱子,容器里面的子元素不会影响到外面的元素,同时外面的元素也不会影响我们容器内的子元素. 二.BFC布局规则 内部的盒子会在垂直方向,一个个地放置: 属于同一个BFC的 两个相邻Box的 上下margin会发生重叠 : 每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此

深入理解CSS中的层叠上下文和层叠顺序(转)

by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=5115 零.世间的道理都是想通的 在这个世界上,凡事都有个先后顺序,凡物都有个论资排辈.比方说食堂排队打饭,对吧,讲求先到先得,总不可能一拥而上.再比如说话语权,老婆的话永远是对的,领导的话永远是对的. 在CSS届,也是如此.只是,一般情况下,大家歌舞升平,看不出什么差异,即所谓的众生平等.但是,当发生冲突发生纠葛的时

深入理解CSS中的margin

1.css margin可以改变容器的尺寸 元素尺寸 可视尺寸--标准盒子模型中盒子的宽度是不包括margin值的,clientWidth 占据尺寸--包括margin的宽度 outWidth不在标准之中,jquery中有相对应的方法 margin与可视尺寸 1.1使用那个与没有设定width/height的普通block水平元素 2.2只适用于水平方向尺寸 <body style="background-color:#1a2b3c"> <div style=&quo

深入理解CSS中的层叠上下文和层叠顺序

零.世间的道理都是想通的 在这个世界上,凡事都有个先后顺序,凡物都有个论资排辈.比方说食堂排队打饭,对吧,讲求先到先得,总不可能一拥而上.再比如说话语权,老婆的话永远是对的,领导的话永远是对的. 在CSS届,也是如此.只是,一般情况下,大家歌舞升平,看不出什么差异,即所谓的众生平等.但是,当发生冲突发生纠葛的时候,显然,是不可能做到完全等同的,先后顺序,身份差异就显现出来了.例如,杰克和罗斯,只能一人浮在木板上,此时,出现了冲突,结果大家都知道的.那对于CSS世界中的元素而言,所谓的“冲突”指什

深入理解css中的margin属性

转载自  http://www.cnblogs.com/zhuzhenwei918/p/6124263.html 深入理解css中的margin属性 之前我一直认为margin属性是一个非常简单的属性,但是最近做项目时遇到了一些问题,才发现margin属性还是有一些"坑"的,下面我会介绍margin的基本知识以及那些"坑".这篇博文主要分为以下几个部分: margin--基础知识 margin--在同级元素(非父子关系)之间应用 margin--在父元素和子元素之间