`

BFC详解

阅读更多

【主要内容】

用法规则,如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等)

 

【简介】

      BFC(Block Formatting Context块级格式化上下文),它规定了内部的块级元素的布局方式,默认情况下只有根元素(即body)一个块级上下文。通俗理解为页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素;外面的元素也不会影响到容器里面的子元素

 

1、BFC布局规则

①内部的块级元素会在垂直方向,一个接一个地放置;

②块级元素垂直方向的距离由margin决定。属于同一个BFC的两个相邻的块级元素会发生margin合并,不属于同一个BFC的两个相邻的块级元素不会发生margin合并;

③每个元素的margin box的左边,与包含border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此;

④BFC的区域不会与float box重叠(所以可以解决浮动造成的重叠覆盖问题);

⑤BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素;外面的元素也不会影响到容器里面的子元素;

⑥计算BFC的高度时,浮动元素也参与计算(所以可以消除浮动)

 

2、创建一个BFC

首先我们要知道怎样创建BFC。一个BFC可以被显式触发,只需满足以下条件之一:

float的值不为none;

overflow的值不为visible;

position的值为fixed / absolute;

display的值为table-cell / table-caption / inline-block / flex / inline-flex

 

3、BFC的应用

(1)消除margin合并

      在之前文章里我写过相邻兄弟元素、父元素与第一个和最后一个子元素、空块元素的margin合并情况。那么对于发生margin合并的元素,我们怎样消除margin合并?

      对于父子元素,我们可以通过设置padding、border、inline content、height、min-height、max-height等属性来消除;但是相邻的兄弟元素之间必出现margin合并,这时如果想要消除margin合并,又该怎么办?

      我们首先要搞清楚为什么会发生margin合并

这些元素(包括兄弟、父子元素等)之间之所以会发生margin合并,是因为它们属于同一个BFC。所以,我们就知道怎么办了,只要让它们不属于同一个BFC不就可以了?

我们来举个例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>css1</title>
    <style type="text/css">
        body {
            margin: 0;
            padding: 0;
        }
        .bro1 {
            width: 300px;
            height: 200px;
            background: #ddd;
            margin-bottom: 30px;
        }
        .bro2 {
            width: 200px;
            height: 100px;
            background: pink;
            margin-top: 20px;
        }
    </style>
</head>
<body>
<div class='bro1'></div>
<div class='bro2'></div>
</body>
</html>

   结果显示为:30px;即合并后取了较大值----bor1的下外边距

【方案】

  现在我们给.bro1新建一个BFC,并添加 overflow:hidden;

<div style="overflow:hidden">
    <div class='bro1'></div>
  </div>

 至此,margin合并消除了!

(2)包含浮动子元素

   这也是我们的主要议题——为什么"overflow:hidden"能清除浮动的影响?

   我们经常会在父元素里设置某个子元素浮动。浮动后,子元素脱离了文档流,使得父元素无法包住这个浮动的子元素。

   通常在父元素上设置一个clearfix的伪元素来清除浮动;同样,我们可以利用BFC可以包含浮动这一特性来清除浮动,例子已经在之前讲过

   我们对之前的例子作一个分析:当给父级设置"overflow:hidden"时,实际上创建了一个超级属性BFC,此超级属性反过来决定了"height:auto"是如何计算的

   因为在“BFC布局规则”中提到:计算BFC的高度时,浮动元素也参与计算。因此,父元素在计算其高度时,加入了浮动元素的高度,“顺便”达成了清除浮动的目标,所以父元素就包裹住了子元素

(3)解决由于浮动造成的重叠覆盖问题

     一般情况下,浮动元素会脱离文档流,即不占位置。它的兄弟元素会与它在左上角重叠。但是如果两个相邻元素都设置了浮动,那么意味着它们都是以BFC的规则渲染,根据上述第四条规则,BFC区域不会相互重叠,所以便能理解为什么设置浮动后元素能独占空间了

这里举个例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>css1</title>
    <style type="text/css">
        body {
            margin: 0;
            padding: 0;
        }
        .bro1 {
            width: 200px;
            height: 200px;
            background: #ddd;
            float: left;
        }
        .bro2 {
            width: 200px;
            height: 200px;
            background: pink;
            /*display: inline-block, table-cell, table-caption, flex, inline-flex;*/
            /*overflow: hidden;*/
        }
    </style>
</head>
<body>
<div class='bro1'></div>
<div class='bro2'></div>
</body>
</html>
  给元素添加以下属性,即可激活BFC(块级格式化上下文)

  float属性不为none;position为absolute或fixed;display为inline-block, table-cell, table-caption, flex, inline-flex;overflow不为visible

 

 

【注意】

   ①除了设置"overflow:hidden",我们还可以设置"display:inline-block"、"position:absolute"、"float:left"等方式来创建一个BFC,从而达到包裹浮动子元素的效果(具体使用哪种方法要看项目需求)

   ②IE6、7不支持伪元素,在IE6、7内有个hasLayout的概念,当元素的hasLayout属性值为true的时候会达到和BFC类似的效果。zoom:1 在IE6、7可以使hasLayout为true,所以如果清除浮动要兼容IE6、7,需要加上 zoom:1

    ③IE7及以下版本不支持BFC的,但有私有属性haslayout,于是我们可以通过触发元素的haslayout来达成bfc的相似效果

 

 

 

 【拓展】

 针对上面BFC布局规则第四条

 ④BFC的区域不会与float box重叠(所以可以解决浮动造成的重叠覆盖问题);

这里详细介绍下:

<div>元素A</div>
<div>元素B</div>

 代码效果如图:

 

 当你元素A添加float属性后,元素A脱离文档流

正常情况下,后面元素B会与前面的元素A重叠(因为float导致A元素脱离文档流不再占据原来的位置,后面元素会占据前面的位置,如图)

 

元素产生BFC的原因{

 

  根元素

 

  float属性不为none

 

  position为absolute或fixed

 

  display为inline-block, table-cell, table-caption, flex, inline-flex

 

  overflow不为visible

 

}

这个时候,我们任意选取上面一种原因加给元素B,比如加上overflow:hidden;

于是元素B 产生了BFC效果导致元素B收缩,不在占据元素A位置,如图

 

 

 

 

 

.

分享到:
评论

相关推荐

    诱发BFC的原因及处理方案

    【CSS定位方案与Block Formatting Contexts (BFC)详解】 在网页设计中,CSS布局扮演着至关重要的角色。本文将深入探讨三种常见的定位方案:普通流、浮动和绝对定位,以及与之相关的Block Formatting Contexts (BFC)...

    css布局之BFC模式(block formatting context)

    详解BFC【 block formatting context】 BFC这个东西说常见的话你可能不觉得,但是你肯定会常用到,也许你在用的时候也没想到BFC这东西。那它究竟是什么呢,我们来一起看一下。 官方给出的BFC解释是这样的,浮动元素...

    css-style:一些容易混淆的排版问题 附带例子的解释

    css-style一些容易混淆的排版问题 附带例子的解释1.BFC详解 2.CSS3详解 3.定位布局使用宽度为百分百超出屏幕宽度 4.水平垂直居中的方式 5.清除浮动 6.点击高亮模拟 7.版心布局 8.石老师的flex布局教程(实例篇) 9.石...

    Ghost 各种参数 详解

    Ghost 各种参数详解 Ghost 是一个功能强大且灵活的硬盘克隆和复制工具,由 Binary 公司推出,后被 Symantec 公司购并,故后续版本称为 Norton Ghost。Ghost 能够帮助用户升级、备份和恢复整个磁盘或所选的分区,...

    成都市青羊、金牛、锦江七年级下期末B卷汇总自测+详解.doc

    【知识点详解】 此文档标题和描述提及的是"成都市青羊、金牛、锦江七年级下期末B卷汇总自测+详解",这显然是一份针对七年级学生的数学复习资料,包含了不同区域(青羊、金牛、锦江)的期末考试B卷的题目和解答解析...

    SQL存储过程与C#的结合

    Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ex10_86", "Ex10_86\Ex10_86.csproj", "{0CB5928E-A757-4B63-B700-D3F0B9A5BFC6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = ...

    2024超全前端面试题

    ### BFC概念详解 #### 一、BFC基础定义 BFC(Block Formatting Context),即块级格式化上下文,是指在CSS布局中一个独立的渲染区域,它遵循一套独立的渲染规则。当一个元素创建了一个新的BFC时,其内部的子元素将...

    龙芯2H开发使用详解

    ### 龙芯2H开发使用详解 #### 龙芯2H开发板介绍 龙芯2H开发板是一款基于MIPS(Microprocessor without Interlocked Pipeline Stages)架构的国产微处理器开发平台,其核心处理器采用了龙芯2号系列芯片。这款开发板...

    INF文件格式参考

    **INF文件格式详解** INF文件是Windows操作系统中用于设备驱动程序和软件安装的重要脚本文件。这些文件包含了安装过程中所需的各种指令和配置信息,确保硬件或软件能够正确地与系统集成。本文将深入探讨INF文件的`...

    summary.docx

    【CSS知识点详解】 在面试中,CSS是必不可少的讨论话题,因为它在构建Web页面的视觉呈现和用户体验中扮演着核心角色。以下是对几个关键CSS概念的深入解释: 1. **WEB标准与W3C理解**: - **WEB标准**是指一系列...

    前端基础面试题,适合前端零基础同学

    ### 前端基础知识点详解 #### CSS布局与定位技巧 **一、左右布局与居中技巧** 在前端开发过程中,经常会遇到需要实现特定布局的需求,例如左侧固定宽度,右侧自适应;或者两侧固定宽度,中间自适应的情况。这里...

    HTML热门面试题及详细解析

    Position 属性详解: Position 属性有四个常见的属性值:relative, absolute, fixed, static。 1. Static:默认位置,设置为 static 的元素,它始终会处于页面流给予的位置(static 元素会忽略任何 top、bottom、...

    CSS3定位和浮动详解

    - 使用`overflow:hidden`,也可以创建BFC,但可能会影响布局。 - 利用`:after`伪元素,通过触发`hasLayout`(在IE6中)来清除浮动。 - 父元素也浮动,但这种方法并不常用。 - 使用`display`属性,如`display:...

    HTML 38 道面试题及答案.docx

    "HTML 面试题及答案详解" 本文档主要讲解了 HTML 中的一些常见问题和答案,涵盖了 HTML 的基本概念、CSS 属性、布局方式等方面。 一、垂直水平居中 如何让一个不定宽高的 DIV 垂直水平居中?可以使用 CSS 方法,...

    css浮动(float)详解

    - 使用`overflow:hidden`:在父元素上设置`overflow:hidden`可以触发块级格式化上下文(BFC),从而包含浮动子元素。 - 使用CSS Flexbox或Grid布局:这两种现代布局模型提供了更强大的控制力,可以避免许多与浮动...

    Linux运维共208讲(初级+中级+高级+必备软件+PPT)

    Linux运维共208讲(初级+中级+高级+必备软件+PPT) 百度网盘下载地址:https://pan.baidu.com/s/1uGW6WlFpT7bFC1m8vPI2GQ

    常见的前端开发面试题附答案经典精选汇总大全.docx

    【前端开发面试题详解】 1. **网络请求过程** 当用户输入网址并按下回车键,会经历以下步骤: a. **域名解析**:系统查找 DNS 服务器,将域名转换为 IP 地址。 b. **TCP 三次握手**:客户端向服务器发起连接请求...

    2018年中考数学专题复习卷四边形含解析

    【知识点详解】 1. 四边形性质: - 平行四边形的性质:对角线互相平分但不一定相等。选项A错误,因为对角线相等的四边形不一定是平行四边形,可能是矩形或等腰梯形。 - 矩形的性质:对角线相等且互相平分。选项B...

    详解CSS边距重叠与解决方案探究

    最近复习了一下CSS相关的知识点,对于CSS中经典的边距重叠问题进行了梳理总结,目的是检验复习效果,也希望对他人有所帮助,疏漏之处还请各位前端老鸟们不吝赐教。 提出问题:在使用CSS排版布局时,会发现兄弟或者...

    详解CSS盒子塌陷的5种解决方法

    通过设置`overflow:auto`或`overflow:hidden`,可以触发BFC(块格式化上下文),从而解决塌陷。`overflow:auto`可能会显示滚动条,影响视觉效果;而`overflow:hidden`则可能导致部分内容被隐藏,需谨慎使用。 4. *...

Global site tag (gtag.js) - Google Analytics