我理解的BFC

---恢复内容开始---

 

what:

BFC:"Block Formatting Context"

“块及格式化上下文”,文档给出的定义很多,自己觉得就是一句话,无论内部子元素怎么变化,都不会影响外部的元素。

表现原则:

  1. 内部的盒子会在垂直方向,一个接一个地放置。
  2. 盒子垂直方向的距离由margin决定。属于同一个BFC的两个相邻盒子的margin会发生重叠
  3. 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  4. BFC的区域不会与float box重叠。
  5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  6. 计算BFC的高度时,浮动元素也参与计算

什么时候会触动BFC

  1.  float的值不为none
  2.  overflow的值为auto,scroll或hidden。
  3.  display的值为table-cell,table-caption,inline-block中的任何一个。
  4.  position的值为relative或static。

BFC作用:

***自适应两栏布局

(最简单的实现方式,大多人想到的应该是浮动,所以请看下面演示)

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .left {
            width: 100px;
            height: 150px;//此处为了说明right盒子会跑到left盒子底部,故高度设置150
            float: left;
            background: red;
        }

        .right {
            height: 200px;
            background: aqua;
        }
    </style>
</head>
<body>
<div class="left"></div>
<div class="right"></div>
</body>
</html>

 

此现象反映出(表现原则3)

由此可见,单单只靠浮动是不行的,要想实现自适应两栏布局,此时应让right盒子触动BFC(依据表现规则4),代码如下

.right {
            height: 200px;
            background: aqua;
            overflow:hidden;
        }

 

 

这样,当right盒子触发BFC后,新的BFC不会与left盒子重叠,便实现的两栏布局。

还没完,这样两个元素紧紧的挨在一起看起来很难受,这时需设置模块间的间距,那么这时问题来了,到底给那个盒子设置间距呢?

1,给浮动盒子设置间距。(可行方法)

<img src="1.png" alt="" style="width: 100px;height: 100px;
float: left;margin-right: 10px "/> <div style="overflow: hidden;border: 1px solid #000;">

成功.

2,给触发BFC的盒子设置。

由此,给BFC盒子设置外边距是没有效果的。

当然你也可以给BFC盒子设置padding,视觉上是可以出现相同效果的,但那是内边距,也反映出BFC的原则之一(BFC就是页面上一个独立的容器,容器里面元素的任何变化不会给外面元素带来影响)

 

***防止垂直margin重叠

首先来看看垂直margin重叠的效果

.test{
  width:250px;
  height:100px;
  text-align:center;
  line-height:100px;
  background-color:aqua;
  margin:100px;
 }
<body>
<p class="test">top</p>
<p class="test">bottom</p>
</body>

可以看到top盒子和bottom盒子之间的间距总共为100px,发生了margin重叠。

体现了BFC表现规则2。

一种解决办法:用一个盒子其中一个元素包起来,并触发该盒子的BFC,使例子中两个p元素处于不同的BFC块中。

    .box {
           overflow: hidden;

        }

        .test {
            width: 250px;
            height: 100px;
            text-align: center;
            line-height: 100px;
            background-color: aqua;
            margin: 100px;
        }
    </style>
</head>
<body>
<div class="box">
    <p class="test">top</p>
</div>
    <p class="test">bottom</p>
</body>

如此,便可以解决margin重叠的问题。

***清除内部浮动

首先来看下面的例子

 <style>
        .box {
            border: 5px solid aqua;
            width: 300px;
        }

        .test {
            border: 5px solid red;
            width:100px;
            height: 100px;
            float: left;
        }
    </style>
<body>
<div class="box">
    <div class="test"></div>
    <div class="test"></div>
</div>
</body>

怎么来清除浮动呢?

本文依据BFC的特性,让box盒子触动BFC。只需添加改变以下代码

  .box {
            border: 5px solid aqua;
            width: 300px;
            overflow: hidden;
        }

需要注意的是box在计算高度时,内部的浮动元素test也会参与计算。

总结:由上面的例子来看,所谓BFC,其实最主要就一句话,无论内部(触动BFC)子元素怎么变化,都不会影响外部的元素(反之亦如此),两栏自适应布局,margin重叠,还有清除浮动,都是这一原则的体现。

posted @ 2016-05-09 23:13  半截铅笔  阅读(278)  评论(0编辑  收藏  举报