为什么需要BFC?

<style>
.red {
background: red;
}
.blue {
background: #1890ff;
}
.green {
background: green;
}
p {
margin: 20px 0;
}
</style>
<body>
<p class="red">1</p>
<p class="blue">2</p>
<p class="green">3</p>
</body>

最常见的问题就是margin折叠。div1和div2之间的间距是20px,而不是预想的40px。该问题创建BFC就可以解决,因为BFC不会影响其他元素的布局。

BFC是什么?

BFC:Box Formatting Context,直译为块级格式化上下文。在CSS2.1规范中定义的一个关于css渲染定位的概念。BFC是一个独立的渲染区域,规定该区域内部的box 如何布局,并且与这个区域的外部毫不想干。

在CSS2.1规范中,还定义了Inline formatting context(IFC)。CSS3中添加了G(grid)FC和F(flex)FC

如何创建BFC?

详情请看CSS2.1规范 https://www.w3.org/TR/CSS2/visuren.html#block-formatting

这里写个总结,满足以下条件之一的元素便会生成BFC。

  • 根元素
  • 浮动元素: float的值不为none
  • 绝对定位元素: position的值为absolute或fixed
  • 行内块元素: display: inline-block
  • 表格单元格: display的值为table-cell,table-caption
  • overflow的值不为visible的元素
  • 弹性盒子 display:flex或inline-flex

BFC的规则是什么?

  1. 内部的box会在垂直方向上一个接一个放置。
  2. 垂直方向的距离有margin决定,属于同一个BFC的两个相邻box的margin会发生重叠,与方向无关。
  3. 每个元素的margin box的左边与包含块border box的左边相接触。存在浮动也是如此。
  4. BFC的区域不会与float的元素区域重叠。
  5. 计算BFC的高度时,浮动子元素也参与计算。
  6. BFC就是页面上的一个隔离的独立容器,容器里的子元素不会影响到外面元素,反之亦然

回归问题

文章开头的问题?

三个div同属于一个BFC(此处是body)中,所以根据规则第二点,margin会发生重叠。

解决方案:

p标签外在添加一个容器,并设置属性overflow:hidden。这样就产生了3个BFC,3个p在3个不同的BFC中,就不会产生margin重叠的问题。

<style>
.red {
background: red;
}
.blue {
background: #1890ff;
}
.green {
background: green;
display: flex;
}
p {
margin: 20px;
}
.wrap {
overflow: hidden;
}
</style>
<body>
<div class="wrap">
<p class="red">1</p>
</div>
<div class="wrap">
<p class="blue">1</p>
</div>
<div class="wrap">
<p class="green">1</p>
</div>
</body>

除了margin重叠还有其他的作用吗?

  1. 清除浮动
<style>
.par {
border: 5px solid #fcc;
width: 300px;
/* display: inline-block; */
} .child {
border: 5px solid #189ff0;
width:100px;
height: 100px;
float: left;
}
</style>
<body>
<div class="par">
<div class="child">1</div>
<div class="child">2</div>
</div>
</body>

参考规则第五点,计算BFC的高度时,浮动子元素也参与计算。形成BFC后,par就会把浮动子元素的高度也计算进去。

  1. 不和浮动元素重叠
<style>
body {
width: 100%;
position: relative;
} .aside {
width: 100px;
height: 150px;
float: left;
background: #f66;
} .main {
height: 200px;
background: #fcc;
/* overflow: hidden; */
} </style>
<body>
<div class="aside"></div>
<div class="main">
</div>
</body>

形成自适应两列布局。应用了BFC规则第四点。

从0开始学习BFC的更多相关文章

  1. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  2. 20145208 《Java程序设计》第0周学习总结

    20145208 <Java程序设计>第0周学习总结 阅读心得 读了老师推荐的几个文章,虽然第四个文章"为什么一定要自学"报告资源不存在而无法阅读,其他的三篇文章都言之 ...

  3. Json.Net6.0入门学习试水篇

    原文:Json.Net6.0入门学习试水篇 前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中 ...

  4. Bootstrap3.0入门学习系列

    Bootstrap3.0入门学习系列规划[持续更新]   前言 首先在此多谢博友们在前几篇博文当中给与的支持和鼓励,以及在回复中提出的问题.意见和看法. 在此先声明一下,之前在下小菜所有的随笔文章中, ...

  5. 自己从0开始学习Unity的笔记 I (C#字符串转换为数字)

    我基本上从0开始学习编程,运算符基本上跳过,因为知道了 “=”这个符号相当于赋值,然后“==”才是等于,其他和普通运算符号差不都,也就跳过了. 最基础的赋值那种,我看了下代码,似乎没什么难度,估计新手 ...

  6. 从0开始学习 GITHUB 系列之「向GITHUB 提交代码」【转】

    本文转载自:http://stormzhang.com/github/2016/06/04/learn-github-from-zero4/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...

  7. 从0开始学习 GITHUB 系列之「GIT 速成」【转】

    本文转载自:http://stormzhang.com/github/2016/05/30/learn-github-from-zero3/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...

  8. 从0开始学习 GITHUB 系列之「加入 GITHUB」【转】

    本文转载自:http://stormzhang.com/github/2016/05/26/learn-github-from-zero2/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...

  9. 20145328 《Java程序设计》第0周学习总结

    20145328 <Java程序设计>第0周学习总结 阅读心得 从总体上来说,这几篇文章都是围绕着软件工程专业的一些现象来进行描述的,但深入了解之后就可以发现,无论是软件工程专业还是我们现 ...

随机推荐

  1. C# Winform 获得下拉框 选中的值

    string PrintName = cmbPrinter.SelectedIndex.ToString(); PrintName = cmbPrinter.SelectedItem.ToString ...

  2. Python 之读取大文件readline与readlines的差别

    import time def get_all_lines(filename): start_time = time.time() try: f = open(filename, 'rb') exce ...

  3. CAD从二制流数据中加载图形(com接口VB语言)

    主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...

  4. FTP服务器访问主动模式、被动模式

    在公司里面,经常需要访问外网FTP取资料等情况.但是有时用windows界面访问经常遇到各种问题. 下面介绍两种客户端是如何访问ftp服务器. 首先我们需要说明:防火墙,是阻拦外界与内部的通讯的一道关 ...

  5. Java-Class-Miniprogram:com.common.utils.miniprogram.Auth

    ylbtech-Java-Class-miniprogram:com.common.utils.miniprogram.Auth 1.返回顶部 1.1. package com.ylbtech.com ...

  6. Centos7自动式脚本搭建jumpserver

    JumpServer脚本 这里需要安装阿里的yum源和epel源并解压: epel源地址https://mirrors.tuna.tsinghua.edu.cn/epel// 安装阿里互联网yum仓库 ...

  7. vmware 15安装破解及使用教程

    VMware Workstation Pro15虚拟机破解版(序列号+安装教程) VMware15已经推出,根据版本号名为VMware Workstation Pro 15是一款强大好用的桌面虚拟机软 ...

  8. STM32串口IAP实验笔记

    STM32的IAP功能确实方便,以前对此如何实现有所了解,但是一直没去测试,这两天来练了下,可谓困难重重,搞了两天问题也一一解决,下面做些简要的笔记 IAP就是在线应用编程,方便程序升级,可以不用打开 ...

  9. clock()函数的使用

    **clock()捕捉从程序开始运行到clock()被调用时所耗费的时间,这个时间单位是clock tick, 即"时钟打点." 常数CLK_TCK:机器时钟每秒所走的时钟打点数* ...

  10. Huawei-R&S-网络工程师实验笔记20190530-FTP上传下载、STelnet登录、SFTP登录

    >Huawei-R&S-网络工程师实验笔记20190530-FTP上传下载.STelnet登录.SFTP登录 >>实验开始,参考<Huawei-R&S-网络工程 ...