CSS BFC

原文:

  [布局概念] 关于CSS-BFC深入理解

  深入理解 BFC; - 页面内可演示

BFC的概念以及通俗理解

  通俗理解:BFC就是css布局的一个概念,是一块区域,一个环境。可以简单的理解为某个元素的一个 CSS 属性,只不过这个属性不能被开发者显式的修改,拥有这个属性的元素对内部元素和外部元素会表现出一些特性,这就是 BFC

  较官方概念:块级格式化上下文。它是一个独立的渲染区域,只有 Block-level box 参与(在下面有解释), 它规定了内部的 Block-level Box 如何布局,并且与这个区域外部毫不相干。

  我们常说的文档流其实分为定位流、浮动流和普通流三种。而普通流其实就是指 BFC 中的 FC - formatting 是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。

  常见的 FC 有 BFC、IFC(行级格式化上下文)、GFC(网格布局格式化上下文)和FFC(自适应格式化上下文)。

BFC 的触发条件:

  下列条件只需满足其一即可:

  【1】根元素,即HTML元素;

  【2】float的值不为none;

  【3】overflow的值不为visible;

  【4】display的值为inline-block、table-cell、table-caption;

  【5】position的值为absolute或fixed;

BFC 触发后的布局规则:

1.内部的Box会在垂直方向,一个接一个地放置。

2.Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。

3.每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。

4.BFC的区域不会与float box重叠。

5.BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

6.计算BFC的高度时,浮动元素也参与计算。

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 ,就会显示成两栏布局的样子。

附上一个关于 float 的案例:

// 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;
}

 

猜你喜欢

转载自www.cnblogs.com/cc-freiheit/p/10416645.html