CSS8:到底什么是BFC?

news/2023/12/1 12:23:20

现在有flex布局等新技术,bfc的效果比如包住元素,进行自适应布局等已经不需要了。现在只有免式的事后才需要知道BFC!

看不懂的定义

CSS规范中对 BFC 的描述

9.4.1 块格式化上下文

浮动,绝对定位元素,非块盒的块容器(例如,inline-blocks,table-cells和table-captions)和'overflow'不为'visible'的块盒会为它们的内容建立一个新的块格式化上下文

在一个块格式化上下文中,盒在竖直方向一个接一个地放置,从包含块的顶部开始。两个兄弟盒之间的竖直距离由'margin'属性决定。同一个块格式化上下文中的相邻块级盒之间的竖直margin会合并

在一个块格式化上下文中,每个盒的left外边(left outer edge)挨着包含块的left边(对于从右向左的格式化,right边挨着)。即使存在浮动(尽管一个盒的行盒可能会因为浮动收缩),这也成立。除非该盒建立了一个新的块格式化上下文(这种情况下,该盒自身可能会因为浮动变窄)

MDN 对 BFC 的描述

一个块格式化上下文(block formatting context) 是Web页面的可视化CSS渲染出的一部分。它是块级盒布局出现的区域,也是浮动层元素进行交互的区域。

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

根元素或其它包含它的元素
浮动元素 (元素的 float 不是 none)
绝对定位元素 (元素具有 position 为 absolute 或 fixed)
内联块 (元素具有 display: inline-block)
表格单元格 (元素具有 display: table-cell,HTML表格单元格默认属性)
表格标题 (元素具有 display: table-caption, HTML表格标题默认属性)
具有overflow 且值不是 visible 的块元素,
display: flow-root
column-span: all 应当总是会创建一个新的格式化上下文,即便具有 column-span: all 的元素并不被包裹在一个多列容器中。
一个块格式化上下文包括创建它的元素内部所有内容,除了被包含于创建新的块级格式化上下文的后代元素内的元素。

块格式化上下文对于定位 (参见 float) 与清除浮动 (参见 clear) 很重要。定位和清除浮动的样式规则只适用于处于同一块格式化上下文内的元素。浮动不会影响其它块格式化上下文中元素的布局,并且清除浮动只能清除同一块格式化上下文中在它前面的元素的浮动。

张鑫旭对 BFC 的描述

http://www.zhangxinxu.com/wor...

BFC全称”Block Formatting Context”, 中文为“块级格式化上下文”。啪啦啪啦特性什么的,一言难尽,大家可以自行去查找,我这里不详述,免得乱了主次,总之,记住这么一句话:BFC元素特性表现原则就是,内部子元素再怎么翻江倒海,翻云覆雨都不会影响外部的元素。所以,避免margin穿透啊,清除浮动什么的也好理解了。

看不懂定义!记不住定义!举例回答BFC

不要试图记忆他的定义。
应该举例回答:

功能1:爸爸管儿子

用 BFC 可以包住浮动元素。(这不是清除浮动,.clearfix 才是清除浮动)

例如如果儿子浮动了,那么爸爸包不住儿子,只有BFC才可以包住儿子。例如设置爸爸为float:left就包住了儿子。什么才算一个bfc?定义里bfc写的

浮动,绝对定位元素,非块盒的块容器(例如,inline-blocks,table-cells和table-captions)和'overflow'不为'visible'的块盒会为它们的内容建立一个新的块格式化上下文

现在有点理解定义了

.baba{
  border: 10px solid red;
  min-height: 10px;
 display: flow-root; /* 只触发BFC  */
  /* display: float;*/ /*触发BFC */
  /* position: absolute; *//*触发BFC */
/*  display: inline-block; 触发BFC */
  /*  overflow:auto; 触发BFC */
/*  display:table-cell;触发BFC */
}
.erzi{
  background: green;
  float:left;
  width: 300px;
  height: 100px;
}
display: flow-root; /* 触发BFC  */
  /* display: float;*/ /*触发BFC */
  /* position: absolute; *//*触发BFC */
  /*  display: inline-block; 触发BFC */
  /*  overflow:auto; 触发BFC */
  /*  display:table-cell;触发BFC */

上面几个属性都会触发BFC

存在一个问题:元素变成BFC之后,还会出发其他效果,比如position: absolute;会绝对定位。解决问题的方法就是使用display: flow-root;,它只有一个效果,让当前元素变成BFC。没有副作用。
http://js.jirengu.com/winozoc...

还有一个作用,课可以归功于爸爸管儿子,如果一个div不是bfc,他其中的子元素的margin-top和margin-bottom会伸到父div外面。
例子:
clipboard.png

clipboard.png
爸爸和儿子一样高,没有受到外边距影响。

变成BFC之后:
clipboard.png

clipboard.png

外边距也算了进去。

这个问题buyongbfc也可以解决,margin无法穿透border,只需要加一个border-top,margin就在.baba内部了。
可见没有任何情况完全需要BFC。

总结一下BFC功能1:一旦一个元素有上面那几个属性,那么他就是一个BFC,BFC会把内部的元素包起来,不管内部元素是否浮动。且内部元素的边距也不会突破这个父BFC的范围。

功能2:兄弟之间划清界限

既:让两个相邻的BFC界限分明
举个例子:
两个div是是兄弟关系,把哥哥浮动了,那么哥哥会叠在弟弟上面,会遮盖弟弟。这时候如果把弟弟也变成BFC,那么哥哥和弟弟之间就会界限分明,谁都不会遮挡谁。
例子如下:

clipboard.png

http://js.jirengu.com/woduniq...

总结BFC功能

内部元素完全包起来(float等),外部元素界限分明,不重叠。

面试官问的时候就说:

  1. 首先一个BFC可以包住浮动元素,不让他超过边界(但这不是清除浮动,清除浮动用clearfix),即使是子元素的margin也可以包住,不冲出父元素。比如举一个代码的例子,儿子是浮动元素,那么只要在爸爸上写overflow:hidden;或者overflow:auto;或者diaplay:flow-root;那么爸爸就会包住儿子,且margin也会在爸爸里面)
  2. 一个浮动元素会和另一个不是浮动的元素重叠,浮动元素会浮在两一个元素上面,如果把另一个元素写成bfc,那么这两个元素就不会互相重叠。

记录一下上下margin合并问题

注释:只有 普通文档流中 块框 的垂直外边距才会发生外边距合并。 行内框 、浮动框绝对定位之间的外边距 不会合并。值为大的边距。

既:两个块级元素一般情况下上下边距会合并,行内元素,浮动元素,绝对定位之后不会合并。
http://js.jirengu.com/rihoxab...


http://www.niftyadmin.cn/n/3366836.html

相关文章

css如何将div画成三角形

首先了解一下盒模型: 盒模型 先看一段代码:#div1{height: 100px;border-style: solid;border-width: 100px 100px 100px 100px;border-color: red forestgreen blue cyan;width: 100px;}根据代码渲染,显示效果如下(边框颜色border…

java service wrapper 中文_Java Service Wrapper实践

很久前就使用JAVA写了一个后台服务器,基于MINA框架的。并且一直部署运行于服务器中,当然有一个黑框框。就正常运行而言,此种运行方式没有任何问题。但是就这运行期间出现的一些问题:1,服务器问题重启后,每次…

css中“~”(波浪号)、“,”(逗号)、“+”(加号)和“”(大于号)详解

p~ul{background:#8e8e8e;}<p>段落P</p><ul><li>列表项1</li><li>列表项2</li><li>列表项3</li></ul>p~ul选择前面有<p>元素的每个<ul>元素&#xff0c;即选择p之后出现的所有ul&#xff0c;两种元素…

JS/atan2 pow

Math.atan2 返回其参数比值的反正切值。 返回一个 -pi 到 pi 之间的数值&#xff0c;表示点 (x, y) 对应的偏移角度。这是一个逆时针角度&#xff0c;以弧度为单位&#xff0c;正X轴和点 (x, y) 与原点连线 之间。注意此函数接受的参数&#xff1a;先传递 y 坐标&#xff0c;然…

怎么更改java存的地方_java安装目录里有没有能修改JVM分配内存的地方?

用java命令查看。用java -option进行修改参数。还有tomcat&#xff0c;eclipse启动时通过配置文件加载的。详细如下&#xff1a;安装Java开发软件时&#xff0c;默认安装包含两个文件夹&#xff0c;一个JDK(Java开发工具箱)&#xff0c;一个JRE(Java运行环境&#xff0c;内含JV…

CSS属性选择器*=,|=,^=,$=,*=的区别

要求value是完整单词类型的比较符号&#xff1a;~,| 拼接字符串类型的比较符号&#xff1a;*,^,$1.attribute属性中包含value: [attribute~value] 属性中包含独立的单词为valuee.g:[title~flower] --> <img src"/i/eg_tulip.jpg" title"tulip flower&q…

ApacheCN 学习资源汇总 2018.11

首页地址&#xff1a;http://www.apachecn.org关于我们&#xff1a;http://www.apachecn.org/about 我们不是 Apache 的官方组织/机构/团体&#xff0c;只是 Apache 技术栈&#xff08;以及 AI&#xff09;的爱好者&#xff01; Java 基础 Java 编程思想Java Web 和大数据 Spar…

java8学习:通过行为参数化传递代码

内容来自《 java8实战 》&#xff0c;本篇文章内容均为非盈利&#xff0c;旨为方便自己查询、总结备份、开源分享。如有侵权请告知&#xff0c;马上删除。书籍购买地址&#xff1a;java8实战如下一段代码请看 Test public void test() throws Exception {List<Apple> lis…

HTML特殊字符的html、js、css写法汇总

⇠ 箭头类 符号UNICODE符号UNICODEHTMLJSCSSHTMLJSCSS⇠&#8672\u21E0\21E0⇢&#8674\u21E2\21E2⇡&#8673\u21E1\21E1⇣&#8675\u21E3\21E3↞&#8606\u219E\219E↠&#8608\u21A0\21A0↟&#8607\u219F\219F↡&#8609\u21A1\21A1←&#8592\u2190\21…

7-2 堆栈操作合法性 (20 分)

输入格式: 输入第一行给出两个正整数N和M&#xff0c;其中N是待测序列的个数&#xff0c;M&#xff08;≤50&#xff09;是堆栈的最大容量。随后N行&#xff0c;每行中给出一个仅由S和X构成的序列。序列保证不为空&#xff0c;且长度不超过100。 输出格式: 对每个序列&#xff…

伪类选择器和伪元素

伪类选择器 什么是伪类&#xff1f;伪类就是与类一样能够定义样式&#xff0c;但却不是真正意义上的类。 不是真正意义上的类&#xff1f;也就是说你可以在css中定义它的样式&#xff0c;就像定义类一样&#xff0c;但是你在HTML中不能找到该伪类的踪影。 HTML中没有伪类的踪影…

CentOS6下防火墙(iptables)的配置方法详解

CentOS6系统是基于linux中的&#xff0c;它的防火墙其实就是iptables了。 下面我来介绍在CentOS防火墙iptables的配置教程&#xff0c;希望此教程对各位朋友会有所帮助。 iptables是与Linux内核集成的IP信息包过滤系统&#xff0c;其自带防火墙功能&#xff0c;我们在配置完服务…

CSS清除浮动的几种方式

1.为父元素添加overflow&#xff1a;hidden <div style"overflow:hidden"> <img src"images/search.jpg"/> <img src"images/tel.jpg"/> <img src"images/weixin.png"/> <img s…

2.两数相加(Add Two Numbers) C++

第一想法是顺着题目的原因&#xff0c;将两链表分别转化为一个数字&#xff0c;再将数字相加&#xff0c;然后把结果转化为字符串&#xff0c;存到答案链表中。但是数据太大会溢出&#xff01; 所以&#xff0c;要在计算一对数字的过程当中直接存储一个结果&#xff0c;注意结果…

JSON 和 JS 对象(通俗易懂)

区别 JSON&#xff08;JavaScript Object Notation&#xff09;仅仅是一种数据格式&#xff08;或者叫数据形式&#xff09;。数据格式其实就是一种规范&#xff0c;按照这种规范来存诸和交换数据。就好像 XML 格式一样。 区别JsonJavascript对象含义仅仅是一种数据格式对象的实…

JSON(JavaScript object notation)(很详细,值得一读)

我们先来看一个JS中常见的JS对象序列化成JSON字符串的问题&#xff0c;请问&#xff0c;以下JS对象通过JSON.stringify后的字符串是怎样的&#xff1f;先不要急着复制粘贴到控制台&#xff0c;先自己打开一个代码编辑器或者纸&#xff0c;写写看&#xff0c;写完再去仔细对比你…
最新文章