网上看了很多 BFC 的概念,发现都说得不是很完整和深入,刚好最近看了一些视频教程说到了 BFC 概念所以记录一下。

BFC 的概念:

  BFC 全称:Block format context 块级格式化上下文。

BFC 的特性:

  BFC 的垂直外边距会和兄弟节点的外边距发生重叠

  BFC 内部的元素不会影响外部的元素,同样,外部的元素不会影响 BFC 内部的元素

  BFC 不会与浮动元素发生重叠

  BFC 元素的高度计算会包括元素内的浮动元素的高度

如何创建 BFC:

  1. float 的值不为 none

  2. overflow 的值不为 visible

  3. position 的值不为 static 或 relative

  4. display 的值为 inline-block, table, table-cell

下面是结合代码分析 BFC 的特性

1. BFC 的垂直外边距会和兄弟节点的外边距发生重叠

<section class="bfc-wrap">
<style type="text/css">
.child-1{
height: 100px;
margin-bottom: 30px;
background-color: #333;
overflow: auto;
}
.child-2{
height: 100px;
margin-top: 5px;
background-color: #666;
overflow: auto;
}
</style>
<article class="child-1"></article>
<article class="child-2"></article>
</section>

效果图:

由效果图可见,两个 BFC 的元素垂直的外边距依然会发生合并,这很符合标准。但是网上一些教程所说的利用 BFC 元素让垂直相邻的元素外边距不发生外边距合并又是什么原理呢?

其实我个人认为与 BFC 第二点的特性相关,那就是:

2. BFC 元素内部的内容不影响外部内容,相反,外部的内容不会影响 BFC 内部的内容

这话怎么说呢。说一个另外的知识点。

肯定都有遇到过这样一个情况:一个父元素里面包含着一个子元素(假设他们都是div)当子元素设置了margin-top 的时候,向下偏移的不是子元素本身而是父元素。如下代码所示:

<style type="text/css">
*{
padding: 0;
margin: 0;
}
.father{
background-color: #ccc;
}
.child{
width: 300px;
height: 300px;
margin-top: 50px;
background-color: #333;
}
</style> <div class="father">
<div class="child"></div>
</div>

效果图:

相信大家都司空见惯,但是可曾明白里面的原理。

css 权威指南里面说到了这个原理点,意思就是:如果父元素没有设置 padding 同时也没有设置 border 的话,它的高度值等于第一个子元素的 border-top 到 最后一个子元素的 border-bottom 的这段距离。

如果设置了padding  或 border其中一个值的时候,那么父元素高度值就等于第一个子元素的 margin-top 到 最后一个子元素的margin-bottom 的这段距离

通俗的说,如果父元素没有设置padding 同时也没有设置 border 的话,它是不会把第一个子元素的 margin-top 和 最后一个子元素的 margin-bottom 包含在内的,这就演变成子元素的 margin 外露导致影响到了父元素外部的其他元素的排版,最要命的是这些外露的 margin 还会和父元素外边的元素发生边距合并。

如果父元素自己有 margin-top 或者 margin-bottom 但是它比它的子元素外露的 margin-top 或 margin-bottom 的值小的话,会被子元素外露的 margin-top 或 margin-bottom 覆盖掉

所以我们之前所用到的解决办法 —— 设置父元素的 padding-top = 1px 实际上是让父元素的高度计算包含了第一个子元素的 margin-top 和 最后一个子元素的 margin-bottom

因此关联回我们现在所说的 BFC 模型其实道理也一样,第一个子元素的margin 外露影响元素外部内容,但是BFC 本身的规则就是一个独立的容器,内部的内容不会影响到外面的元素,所以为了达到目的,它把自身的高度计算包含了内部第一个子元素的 margin-top 和 最后一个子元素的 margin-bottom 。

于是这就达到了网上所说的,利用在 BFC 内部再建立一个BFC 容器包裹一些不需要边距合并的元素达到目的。

我们可以在这个司空见惯的例子中运用 BFC ,表现出来的效果和为父元素增加 padding 或者 border 效果一样的:

用 BFC 的解决方案:

*{
padding: 0;
margin: 0;
}
.father{
background-color: #ccc;
overflow: auto;
}
.child{
width: 300px;
height: 300px;
margin-top: 50px;
background-color: #333;
} <div class="father">
<div class="child"></div>
</div>

效果图:

用 padding,border 老方法解决

<style type="text/css">
*{
padding: 0;
margin: 0;
}
.father{
background-color: #ccc;
padding-top: 1px;
}
.child{
width: 300px;
height: 300px;
margin-top: 50px;
background-color: #333;
}
</style> <div class="father">
<div class="child"></div>
</div>

------------------------------------------------    分割线    ----------------------------------------------

好了说了那么多还是要回到 BFC 这个正题上,继续 BFC 的第3 个特性

3. BFC 元素不与浮动元素重

       <style type="text/css">       
     *{

       padding: 0;
margin: 0;
}
.father{
background-color: #ccc;
padding-top: 1px;
}
.float{
float: left;
width: 180px;
height: 120px;
background-color: #333;
       color: #fff;
}
.content{
height: 200px;
background-color: red;
}
</style> <div class="father">
<div class="float">我是一个浮动元素</div>
<div class="content">lalalalalalal</div>
</div>

效果图:

可以看出,没有浮动部分的红色背景色元素包围着浮动元素。其实这只是因为浮动元素脱离了文档流,而没有浮动的红色背景色元素侵占了其位置,但是浮动元素又在红色背景元素上面遮挡住了,给出一种错觉就是围绕,而真正围绕的其实是红色背景元素的文字内容。(很多浮动的原理还没搞清除只能先这样理解了,还望指教)

而将 红色背景元素变成 BFC 就不会出现这种情况

<style type="text/css">
*{
padding: 0;
margin: 0;
}
.father{
background-color: #ccc;
}
.float{
float: left;
width: 180px;
height: 120px;
background-color: #333;
color: #fff;
}
.content{
height: 200px;
background-color: red;
overflow: auto;
}
</style> <div class="father">
<div class="float">我是一个浮动元素</div>
<div class="content">lalalalalalal</div>
</div>

效果图:

红色背景元素和浮动元素分开了~

4. BFC 元素的高度计算会包含浮动元素的高度值

其实这个特性是用作清除浮动的,浮动具有破坏性,会使父元素高度塌陷,但是将父元素设置为 BFC 那么它的高度就会包含浮动元素的高度,从而不会发生高度塌陷的情况了

<style type="text/css">
*{
padding: 0;
margin: 0;
}
.father{
background-color: #ccc;
}
.float{
float: left;
width: 180px;
height: 120px;
background-color: #333;
color: #fff;
}
</style> <div class="father">
<div class="float">我是一个浮动元素</div>
</div>

效果图:

声明为 BFC 后

【笔记】BFC 模型知识整理的更多相关文章

  1. 前端笔记(关于css盒模型知识整理)

    我以前整理的文章可能也不是特别深入.所以现在开始尝试即使多花点时间收集整理,也不只发浅层知识,这样对技术的深入理解是很有帮助的. 废话不多说,我们现在开始. 说到css盒模型,这是大多面试基础中会经常 ...

  2. UnityShader学习笔记1 — — 入门知识整理

    注:资料整理自<Unity Shader入门精要>一书 一.渲染流程概念阶段:  应用阶段:(1)准备好场景数据:(如摄像机位置,物体以及光源等)   (2)粗粒度剔除(Culling): ...

  3. django 笔记9 分页知识整理

    感谢老男孩 自定义分页 XSS:攻击 默认字符串返回 {{page_str|safe}} 前端 from django.utils.safestring import mark_safe page_s ...

  4. js事件(Event)知识整理

    事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下   鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemo ...

  5. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  6. js事件(Event)知识整理[转]

    事件注册 平常我们绑定事件的时候用dom.onxxxx=function(){}的形式 这种方式是给元素的onxxxx属性赋值,只能绑定有一个处理句柄. 但很多时候我们需要绑定多个处理句柄到一个事件上 ...

  7. 【OGG】OGG基础知识整理

    [OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...

  8. Redis知识整理

    Redis知识整理 转自:https://www.cnblogs.com/rjzheng/p/9096228.html 1.单线程模型 Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返 ...

  9. Linux系统基础知识整理

    一.说明 本篇文章,我将结合自己的实践以及简介,来对linux系统做一个直观清晰的介绍,使得哪些刚接触Linux的小伙伴可以快速入门,也方便自己以后进行复习查阅. 二.基本知识整理 1.Linux文件 ...

随机推荐

  1. vue:简单方法替代vuex或者bus

    兄弟组件,隔代组件传值很麻烦,方法虽然多,但都各有缺点. vuex: 适合数据量大,并且函数集中处理. bus:适合数据虽少,却不得不用的时候,维护困难. root:这儿指将值挂在root组件上,需要 ...

  2. vuex 基本用法、兄弟组件通信,参数传递

    vuex主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟组件间传值,需要先将值传给父组件,再传给子组件,异常麻烦. vuex大概思路:a=new Vue(),发射数据'msg':a.$emit ...

  3. Python day02 三元运算

     type  查看数据类型.2 **32  :2的32次方 .浮点的表示类型是小数,但是小数不仅仅包括浮点 浮点数用来处理实数,即带有小数的数字 三元运算:  result = 值1 if 条件 el ...

  4. 模拟uClinux系统调用

    这篇文章原来放在CU上的,现在挪过来了.CU上设置不可见了. 1.  目标 这里主要是实验一下uclinux的系统调用. 2.   环境 OS                :vmware + red ...

  5. [转]C#异步的世界【上】

    阅读目录   APM EAP TAP 延伸思考 新进阶的程序员可能对async.await用得比较多,却对之前的异步了解甚少.本人就是此类,因此打算回顾学习下异步的进化史. 本文主要是回顾async异 ...

  6. JavaScript基础知识(对象、函数与对象)

    17.对象 属性:描述对象的信息  方法:描述对象的行为  封装:只关心输入和输出(不管过程如何实现) ü 对象的分类: 内置对象(原生对象): 就是JavaScript语言预定义的对象(如Strin ...

  7. windbg指定SOS版本,执行扩展命令报错

    调试dump文件,加载相匹配版本的sos/clr时,绝大多数都是可以正常使用的. 然而凡事都有例外,今天在做类似工作时,遇到了错误: CLRDLL: Consider using ".cor ...

  8. 微信小程序--合法域名校验出错

    第一次做小demo的时候遇到一个问题,合法域名校验出错: 第一步:登陆微信公众号平台--个人中心--设置--开发设置--服务器域名(一个月只有5次修改机会一定要珍惜) 第二步 打开微信开发者工具,有个 ...

  9. C#要点补充

    1字符串与时间的互转 DateTime.TryParse将空字符串.为null或格式不正确,则转换为的DateTime所代表的值为:0001/1/1 0:00:00,此为DateTime.MinVal ...

  10. LoadRunner 中实现MD5加密

    最近在用loadrunner做一个压力测试,在编写脚本的时候发现传递参数的时候需要一个sign值,这个值是将参数进行MD5加密生成的,所以下面就说一说怎么对参数进行MD5加密. 1.首先我们需要一个加 ...