[布局概念] 关于CSS-BFC深刻理解;javascript
深刻理解 BFC; - 页面内可演示
css
通俗理解:BFC就是css布局的一个概念,是一块区域,一个环境。能够简单的理解为某个元素的一个 CSS 属性,只不过这个属性不能被开发者显式的修改,拥有这个属性的元素对内部元素和外部元素会表现出一些特性,这就是 BFC。html
较官方概念:块级格式化上下文。它是一个独立的渲染区域,只有 Block-level box 参与(在下面有解释), 它规定了内部的 Block-level Box 如何布局,而且与这个区域外部绝不相干。java
咱们常说的文档流其实分为定位流、浮动流和普通流三种。而普通流其实就是指 BFC 中的 FC - formatting 。是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其余元素之间的关系和做用。ide
常见的 FC 有 BFC、IFC(行级格式化上下文)、GFC(网格布局格式化上下文)和FFC(自适应格式化上下文)。
布局
下列条件只需知足其一便可:post
【1】根元素,即HTML元素;spa
【2】float的值不为none;
3d【3】overflow的值不为visible;code
【4】display的值为inline-block、table-cell、table-caption;
【5】position的值为absolute或fixed;
1.内部的Box会在垂直方向,一个接一个地放置。
2.Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
3.每一个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,不然相反)。即便存在浮动也是如此。
4.BFC的区域不会与float box重叠。
5.BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
6.计算BFC的高度时,浮动元素也参与计算。
除了耳熟能详的清除内部浮动外,还能进行页面布局、阻止某些状况下发生的 margin 重叠等等,下面依次根据布局规则进行解释。
规则1:就是咱们日常div一行一行块级放置的样式,很少说;
规则2:同一个BFC的两个相邻Box的margin会发生重叠,见下例:
// html <div class="aside"></div> <div class="text"> <div class="main"></div> </div> // css .aside { margin-bottom: 100px; width: 100px; height: 150px; background-color: #f66; } .text { overflow: hidden; } .main { background-color: #fcc; margin-top: 100px; height: 200px; }
在按照如上写法, .aside 与 .main 之间的空白区域高度是 200px,而把 .text 的样式注释掉,空白区域变成 100px,见下图;
规则3:左浮是子div的左边接触父 div 的 borderbox 的左边,右浮是子 div 接触父 div 的 borderbox 右边,除非设置margin来撑开距离,不然一直是这个规则。见下例:
// html <div class="par"> <div class="child"></div> <div class="child"></div> </div> // css .par { width: 300px; border: 10px solid #fcc; overflow: hidden; } .child { float: left; width: 100px; height: 100px; border: 10px solid #f66; }
所以,一般使用的 overflow: hidden; 方法来清除浮动就是利用的 BFC 的触发条件 3 来实现的。
规则4:BFC的区域不会与float box重叠:首先看下例子 - 自适应两栏布局:
// html <div class="aside"></div> <div class="text"> <div class="main"></div> </div> // css .aside { width: 100px; height: 150px; float: left; background: #f66; } .text { width: 500px; } .main { height: 200px; /* 触发 .main 盒子的 BFC 规则 */ overflow: hidden; background: #fcc; }
上面盒子 .aside 左浮动,所以 .main 盒子在没有触发 BFC 的状况下会被覆盖。然后来 .main 盒子触发 BFC ,根据规则 4 ,就会显示成两栏布局的样子。
// html <div class="par"> <div class="child"></div> <div class="child0">123</div> </div> // css .par { width: 200px; border: 10px solid #fcc; } .child { float: left; width: 100px; height: 100px; border: 3px solid #f66; } .child + div { border: 3px solid #000; }