想要理解BFC与IFC,首先要理解另外两个概念:BoxFC(即 formatting context)。

Box

一个页面是由很多个 Box 组成的,元素的类型和 display 属性决定了这个 Box 的类型。不同类型的 Box,会参与不同的 Formatting Context。

Block level的box会参与形成BFC,比如display值为block,list-item,table的元素。

Inline level的box会参与形成IFC,比如display值为inline,inline-table,inline-block的元素。

参考:W3C文档block-level

FC(Formatting Context)

它是W3C CSS2.1规范中的一个概念,定义的是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用

常见的Formatting Context 有:Block Formatting Context(BFC | 块级格式化上下文) 和 Inline Formatting Context(IFC |行内格式化上下文)。

下面就来介绍IFC和BFC的布局规则。

IFC布局规则:

在行内格式化上下文中,框(boxes)一个接一个地水平排列,起点是包含块的顶部。水平方向上的 marginborderpadding在框之间得到保留。框在垂直方向上可以以不同的方式对齐:它们的顶部或底部对齐,或根据其中文字的基线对齐。包含那些框的长方形区域,会形成一行,叫做行框。

BFC布局规则:

W3C原文:

Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with 'overflow' other than 'visible' (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.

In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.

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).

整理为中文:

  1. 内部的Box会在垂直方向,一个接一个地放置。

  2. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠

  3. 每个元素的左外边缘(margin-left), 与包含块的左边(contain box left)相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。除非这个元素自己形成了一个新的BFC。

  4. BFC的区域不会与float box重叠。

  5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

  6. 计算BFC的高度时,浮动元素也参与计算

参考:
W3C文档inline-formatting
W3C文档block-formatting

怎样形成一个BFC?

块级格式化上下文由以下之一创建:

  1. 根元素或其它包含它的元素

  2. 浮动 (元素的 float 不是 none)

  3. 绝对定位的元素 (元素具有 positionabsolutefixed)

  4. 非块级元素具有 display: inline-block,table-cell, table-caption, flex, inline-flex

  5. 块级元素具有overflow ,且值不是 visible

整理到这儿,对于上面第4条产生了一个small small的疑问:为什么display: inline-block;的元素是inline level 的元素,参与形成IFC,却能创建BFC?

后来觉得答案是这样的:inline-block的元素的内部是一个BFC,但是它本身可以和其它inline元素一起形成IFC。

BFC用处

1. 清除浮动

<div class="wrap">
<section>1</section>
<section>2</section>
</div>
.wrap {border: 2px solid yellow;width: 250px;
}
section {background-color: pink;float: left;width: 100px;height: 100px;
}

可以看到,由于子元素都是浮动的,受浮动影响,边框为黄色的父元素的高度塌陷了。

解决方案:为 .wrap 加上 overflow: hidden;使其形成BFC,根据BFC规则第六条,计算高度时就会计算float的元素的高度,达到清除浮动影响的效果。

2. 布局:自适应两栏布局

<div>
<aside></aside>
<main>我是好多好多文字会换行的那种蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤</main>
</div>
div {width: 200px;}
aside {background-color: yellow;float: left;width: 100px;height: 50px;
}
main {background-color: pink;
}

可以看到右侧元素的一部分跑到了左侧元素下方。

解决方案:为main设置 overflow: hidden; 触发main元素的BFC,根据规则第4、5条,BFC的区域是独立的,不会与页面其他元素相互影响,且不会与float元素重叠,因此就可以形成两列自适应布局

3. 防止垂直margin合并

<section class="top">1</section>
<section class="bottom">2</section>
section {background-color: pink;margin-bottom: 100px;width: 100px;height: 100px;
}
.bottom {margin-top: 100px;
}

可以看到,明明.top.bottom中间加起来有200px的margin值,但是我们只能看到100px。这是因为他们的外边距相遇发生了合并。

怎样解决:为其中一个元素的外面包裹一层元素。并为这个外层元素设置 overflow: hidden;,使其形成BFC。因为BFC内部是一个独立的容器,所以不会与外部相互影响,可以防止margin合并。

<section class="top">1</section>
<div class="wrap">
<section class="bottom">2</section>
</div>
.wrap {overflow: hidden;
}

BFC与IFC概念理解+布局规则+形成方法+用处相关推荐

  1. 小样本学习——概念、原理与方法简介(Few-shot learning)

    Few-shot learning (FSL) 在机器学习领域具有重大意义和挑战性,是否拥有从少量样本中学习和概括的能力,是将人工智能和人类智能进行区分的明显分界点,因为人类可以仅通过一个或几个示例就 ...

  2. BFC、IFC、GFC、FFC概念理解、布局规则、形成方法、用处浅析

    接着聊一下BFC.IFC,与FFC.GFC,GFC是一种二维度的布局方式,现在也蛮火,但是因为兼容性问题比较大,现在用的不多.其实这些布局方式经常会遇到,主要是想了解一下相关的各种概念和术语. 想要理 ...

  3. 深入理解BFC与IFC

    一.盒子模型 要理解BFC与IFC,首先要理解盒子模型,盒模型的结构如下: 从内到外依次为  content -> padding -> border -> margin 常见的盒模 ...

  4. 学习理解BFC、IFC、GFC、FFC

    一.盒子模型 要理解BFC与IFC,首先要理解盒子模型,盒模型的结构如下: 从内到外依次为  content -> padding -> border -> margin 常见的盒模 ...

  5. 深入理解 BFC、IFC、GFC、FFC

    1.定义 BFC全称 是 block formatting context,也就是 块级格式化上下文,是用于 布局块级盒子 的一块 渲染区域. IFC全称 是 inline formatting co ...

  6. 学前端的你了解这些知识吗?——BFC、IFC、GFC、FFC

    BFC.IFC.GFC 和 FFC 前言 想要了解BFC.IFC.GFC.FFC,就必须先要了解FC. FC的全称是:Formatting Contexts(格式化上下文),它是W3C规范中的一个概念 ...

  7. BFC、IFC、GFC、FFC

    BFC.IFC.GFC.FFC CSS2.1中只有BFC和IFC, CSS3中才有GFC和FFC. 那么到底什么是BFC.IFC.GFC和FFC呢? What's FC? 一定不是KFC,FC的全称是 ...

  8. CSS之BFC、IFC、GFC、FFC简述

    学习目标:BFC.IFC.GFC.FFC FC是什么? FC全称Formatting Contexts,是格式上下文.它是W3C CSS2.1规范中的一个概念,它是页面中的一块渲染区域,并且有一套渲染 ...

  9. CSS 7 CSS 层叠规则 BFC 和 IFC 机制

    CSS 文章目录 CSS 7 CSS 层叠规则 BFC 和 IFC 机制 7.1 BFC 7.1.1 常见的定位方案 7.1.2 BFC 理解 7.1.3 如何触发BFC [如何为元素添加BFC] 7 ...

最新文章

  1. 《机电传动控制》学习笔记03-1
  2. css字体相关样式的处理
  3. Handler(上)——Mars Andoird开发视频第二季第六集(重)
  4. docker开放的端口_关于docker自动开放端口解决方案
  5. Java统计做题正确率_ResNet:训练期间的准确率为100%,但使用相同数据的预测准确率为33%...
  6. springboot mongo查询固定字段_你真的会用索引么?[Mongo]
  7. 信息学奥赛一本通 1025:保留12位小数的浮点数 | OpenJudge NOI 1.1 05
  8. TypeScript学习(一):原始数据类型的定义
  9. python必背代码-Python中期学者必看:让你的python代码更高效灵活
  10. python中字典dict的方法fromkeys
  11. 微信H5页面自定义微信分享内容
  12. 中国省份、市区、地区县信息表
  13. 百度云个人服务器搭建
  14. 熊啸锋:在线生成个人网站,如何建立个人网站教程
  15. 分布式Redis集群解决方案
  16. 山西藏家捐献44幅明清寺观壁画在山西博物院展出(图)
  17. 第50节:初识搜索引擎_上机动手实战多搜索条件组合查询
  18. Kafka的安装与配置
  19. 从工具了解大数据之Kettle
  20. python 蒙特卡罗_python实现蒙特卡罗方法教程

热门文章

  1. mysql单库tps_MySQL数据库三个关键性能指标--TPS\QPS\IOPS
  2. {}是set类型还是dict类型呢
  3. 多于2个字符串的拼接,禁止使用“+”,而应该用join
  4. java加密方式有哪些_面完平安JAVA,他们说了这些
  5. python中del和remove的区别_Python列表删除元素del、pop()和remove()的区别小结
  6. android 判断是否正在扫描蓝牙_判断蓝牙是否连接
  7. 算法篇之-----滑动窗口(尺取法)
  8. 论文,采购管理(背诵)
  9. 笔记-信息化与系统集成技术-国务院关于印发新一代人工智能发展规划的通知...
  10. 信息系统项目管理师-信息系统综合测试与管理核心知识思维脑图