BFC与垂直外边距折叠

BFC

BFC是什么(Block formatting contexts)

Boxes in the normal flow belong to a formatting context, which may be block or inline, but not both simultaneously. Block-level boxes participate in a block formatting context. Inline-level boxes participate in an inline formatting context.

盒元素在正常文档流中属于一个上下文环境, 也许是BFC也许是IFC, 但只能唯一, 块级盒参与BFC的运算, 内联盒参与IFC的运算。 由此可以看出, BFC实为一种环境, 块级元素, 内联级元素参与到各自的formatting contexts中, 依据各自的规则排序。

Block formatting contexts 的规则以及为什么会发生外边距折叠

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 (althougha 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.浮动元素和绝对定位元素, 非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions), 以及overflow值不为“visiable”的块级盒子,
都会为他们的内容创建新的BFC(块级格式上下文)。
2.在BFC中, 盒子从顶端开始垂直地一个接一个地排列, 两个盒子之间的垂直的间隙是由他们的margin 值所决定的。在一个BFC中, 两个相邻的块级盒子的垂直外边距会产生折叠。(发生折叠的关键)
3.在BFC中, 每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说, 则触碰到右边缘)甚至对于浮动元素也是如此, (尽管其内部的lineboxes因浮动也许会塌陷)除非box形成BFC(对于float元素足够狭窄)=>此句不明所以。

发生条件

1.两margin相邻, 中间无任何间隔包括包含padding, boarder, line-box, clearance(clear属性); 2.在定位规则为正常文档流中的块级盒(非float, 绝对定位), 且在同一BFC
3.方向垂直(margin-top,margin-bottom);

  • 相邻的三种情况(兄弟, 父子, 自身);

1.兄弟:兄margin-bottom与弟margin-top;
2.父子:父margin-top与长子margin-top, 父margin-bottom, 幺子margin-bottom;
3.自身:margin,border,padding,width只有margin的情况, 且内部无间隔包括line-box,
margin-top与自己的margin-bottom;

折叠规则

同正, 同负取绝对值最大值。一正一负则正负相加。

  • 由发生条件推出的避免折叠方法

1.改变其盒模型, display:inline-block;
2.改变其定位方案, float, positon:absolute;
3.使其不在同一BFC下,如父创建BFC则父参与爷创建的BFC环境, 子参与由父创建的BFC环境,
使父子不在同一BFC环境下;但兄弟节点之间则无效, 因为即便兄创建BFC环境,
兄弟之间依然参与由父创建的BFC。 4.子元素添加clear属性。
5.添加padding,border,line-box...
总之,改变1,2,4,5可避免任何折叠, 而3只能避免与子元素发生折叠。

以下举例说明

外边距折叠

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>外边距折叠</title><style>* {margin: 0;}div.up {width: 100px;height: 100px;background: #74B9A8;margin-bottom: 100px;/* overflow: hidden; *//* 不可以避免折叠 *//* display: inline-block; *//* 可以避免 *//* 不发生折叠的触发因素是浮动元素、inline-block 元素、绝对定位元素, 这个只是创建BFC因素的子集, 但并不能说明创建了BFC的元素就不会发生折叠, 因为BFC还可以用overflow:hidden来创建。相反如果父元素形成了BFC, 那么他的块级子元素之间反而会发生折叠。 */}div.down {width: 50px;height: 50px;background: #FCFBD0;margin-top: 50px;}div.outter {width: 200px;height: 200px;background: #685D6A;margin-top: 200px;/* overflow: hidden; *//* 可以避免 *//* 形成BFC既可避免与其子元素发生折叠。 */}div.inner {width: 100px;height: 100px;margin-top: 100px;background: #F4828C;}</style></head><body><!-- 什么时候会崩塌, 两个或多个毗邻的普通流中的块元素垂直方向上的 margin 会折叠 --><!-- 关键词「两个或多个」「毗邻」「块元素<垂直>方向」 --><!-- 折叠后的大小:全为正书或负数, 取绝对值最大的;一正一负取和 --><div class="up"></div><div class="down"></div><!-- div.up 和 div.down 互为兄弟元素(毗邻), 即使不在同一BFC中, 也会发生折叠。元素形成BFC之后只能避免父块级元素与其子块级元素发生折叠。 --><div class="outter"><div class="inner"></div></div><!-- outter与inner是父子关系, 再次强调outter形成BFC只可避免与子发生折叠, 但其子元素之间可能会发生折叠。 --></body>
</html>
复制代码

参考: CSS: 深入理解BFC和Margin Collapse (margin叠加或者合并外边距)

www.html-js.com/article/2882

转载于:https://juejin.im/post/5aa52dae6fb9a028c8127c83

BFC与垂直外边距折叠笔记相关推荐

  1. html清除浮动的那一块区域,CSS中的BFC,外边距折叠,清除浮动

    BFC是什么? BFC(Block Formatting Context)直译为"块级格式化范围 ". 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定 ...

  2. html盒子距离上边距50px,Margin的垂直外边距问题

    做练习的时候遇到一个margin的问题,代码结构如下,给父元素body中的子元素div设置了margin:50px auto;本来我是想让子元素div距离父元素上边拉开50个像素,结果却是子元素div ...

  3. CSS中的外边距折叠问题及其4种解决方法总结(完整版)

    外边距折叠 一.概念 二.兄弟元素 三.父子元素 四.四种解决方案 一.概念 一般是指垂直方向相邻的外边距会发生重叠现象,大多发生在兄弟元素和父子元素之间. 二.兄弟元素 box2是box1的兄弟元素 ...

  4. 详解css外边距折叠(margin collapsing)

    外边距折叠指的是毗邻的两个或多个外边距 (margin) 会合并成一个外边距,本文详细的介绍了一下css外边距折叠的实现,分为3种情况,非常具有实用价值,需要的朋友可以参考下 前文 这是的一个经典的老 ...

  5. 外边距折叠( Collapsing margins )详解

    外边距折叠( Collapsing margins )1 在介绍 margin 特性的时候,简单的介绍了外边距折叠. Collapsing margins,即外边距折叠,指的是毗邻的两个或多个外边距 ...

  6. CSS外边距折叠引发的问题

    CSS外边距折叠 第一种:两个块级元素的上下边距折叠 第二种:父元素和子元素(或者最后一个元素)的外边距 第三种:空的块级元素的上下外边距 折叠的根本原因: margin之间直接接触,没有阻隔 折叠后 ...

  7. CSS中盒子模型、嵌套盒子中垂直外边距塌陷问题解决方案、标准盒模型、怪异盒模型

    盒子模型(Box Model): 指把HTML页面中的元素看作是一个矩形的盒子,也称容器,这个盒子从内到外由:元素的内容(content).内边距(padding).边框(border).外边距(ma ...

  8. CSS: 深入理解BFC和Margin Collapse (margin叠加或者合并外边距)

    BFC的理解与应用 首先我们来看看w3c规范对BFC的解释,其实对于这种概念的学习上,我们总是建议首先寻找官方的定义,因为原则上来说官方的才是最权威和正确的,而且还比较详细,千万不要因为看到英文就畏惧 ...

  9. Web页面布局上的幽灵事件 -- 外边距合并折叠解惑

    最初的想法是准备写BFC的设计方面的一些考虑,当然这只是从一个使用者角度来理解的设计 虽然会跟实际有一定差距,但对于能更好的来理解记忆BFC还是有用处的. 现在确定了要写的东西跟最初有些不同,但是很典 ...

最新文章

  1. 报道称:Check Point正在洽谈收购CyberArk
  2. java使用集合存储过程_详解java调用存储过程并封装成map
  3. Apache Camel简化SOA实施进程
  4. ElasticSearch权威指南学习(结构化查询)
  5. 【UI插件】简单的日历插件(下)—— 学习MVC思想
  6. 数据结构与算法:实验一线性表(字符串分类统计)
  7. FTP服务学习笔记之基于MySQL+PAM的vsftpd虚拟用户
  8. 将本地项目上传到github详解
  9. 用OpenCV创建第一个图像
  10. Linux就这个范儿 第10章 生死与共的兄弟
  11. 大概都能懂的Eviews教程:二(转载)
  12. ad中按钮开关的符号_收藏:电路图形符号大全
  13. 三阶魔方还原 - 只需7步6个公式
  14. 在js中的瀑布流布局理解
  15. 一款开源的二维地图软件,在GMap.net基础上进行了有效的扩展,曾经产生过非常大的商业价值,里面含有升级日志,有助于再次开发
  16. Unity3D Content Size Fitter的坑
  17. 信息学奥赛对大学计算机专业,关于信息学竞赛学习的几大误区,你必须得知道!...
  18. 分布式服务框架 dubbo/dubbox 入门示例(2)
  19. 桥式整流电路原理;电感滤波原理;电容滤波原理
  20. GlobalProtect bupt for mac

热门文章

  1. 如何用SPY++工具查看窗体的句柄
  2. java中String的常用方法
  3. 关于 AppDelegate 、UIApplication 简单的用法
  4. Agile PLM Item Title Block Tab
  5. 送我Ta的一首歌!--《爱到底》
  6. mysql 与 oracle 的连表update
  7. SD-WAN:MSP连接
  8. Halcon算子翻译——while
  9. Android OTA在线升级二(升级包编译原理分析) 【转】
  10. perl5 第十章 格式化输出