面试积累——BFC

什么是BFC

BFC就是“块级格式化上下文”的意思,创建了 BFC的元素就是一个独立的盒子,不过只有Block-level box可以参与创建BFC, 它规定了内部的Block-level Box如何布局,并且与这个独立盒子里的布局不受外部影响,当然它也不会影响到外面的元素。

BFC有一下特性:

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

如何触发BFC

那么我们该怎么使用BFC呢,如何触发BFC呢?:

  • float 除了none以外的值
  • overflow 除了visible 以外的值(hidden,auto,scroll )
  • display (table-cell,table-caption,inline-block, flex, inline-flex)
  • position值为(absolute,fixed)
  • fieldset元素
  • 绝对定位元素(position:absolute 或fixed)
  • 行内块inline-block(元素的display:inline-block)
  • 表格单元格(元素的display:table-ceil,HTML表格默认属性)
  • 弹性盒flex boxes(元素地display:flex或inline-flex)

在以上的情况里可以创建BFC。

哪些场景可以使用BFC

1.解决margin叠加问题

<head>
    <title></title>
    <style type="text/css">
        p{
            margin: 50px;
        }
    </style>
</head>

<body>
    <p>hello world</p>
    <p>hello world</p>
    <p>hello world</p>
</body>

这里写图片描述
三P每个p之间的距离为50px,发生了外边距叠加。 要解决这个叠加问题即让每个P之间是100px,我们可以新建一个BFC,怎么建呢?可以给p元素添加一个父元素,让它触发BFC。如下:

    <style type="text/css">
    p {
        margin: 50px;
    }
    .bfc{
        /*position: absolute;*/
        overflow: auto;
    }
    </style>
</head>

<body>
    <div class="bfc">
        <p>hello world</p>
    </div>
    <p>hello world</p>
    <p>hello world</p>
</body>

第一个盒子就和第二个盒子的边距为100px

这里写图片描述

不过虽然变成bfc,但是不同的方式也有所不同

.bfc{
        position: absolute;

}

这里写图片描述

2.用于布局

    <style type="text/css">
        body{
            width: 300px;
            position: relative;
        }
        .aside{
            width: 100px;
            height: 150px;
            float:left;
            background: blue;
        }
        .main{
            height: 200px;
            background: #f00;
        }
    </style>
</head>
<body>
<div class="aside"></div>
<div class="main"></div>

这里就会出现这种情况
这里写图片描述
从图中我们会发现上面BFC的第三个特性,就是元素的左外边距会触碰到包含块容器的做外边框,就算存在浮动也会如此。(这里不太理解)
看上面BFC第四个特性,就是BFC不会与浮动盒子叠加,那么我们是不是可以创建一个新的BFC来解决这个问题呢?来看看:

 .main {
        height: 200px;
                background: #f00;
                overflow:hidden;
}

就解决了上面的问题。发现我们用overflow:hidden触发main元素的BFC之后,效果立马出现了,

3.用于清除浮动,计算BFC高度.

因为上面第六个特性提到计算BFC高度时,浮动元素也会参与计算,我们先看一个例子:

<head>
    <title></title>
    <style type="text/css">
        .bfc{
            border: 5px solid #f00;
            width: 300px;
        }
        .box{
            border: 5px solid blue;
            width: 100px;
            height: 100px;
            float: left;
        }
    </style>
</head>
<body>
<div class="bfc">
    <div class="box"></div>
    <div class="box"></div> 
</div>
</body>
</html>

其实我一看这个代码,我就知道会出现bfc撑不起来的问题,因为box设置了float,其实就相当于脱离了流,如果理解正常情况下一个html其实就是一层平地,我们往这里面塞盒子。
先把float注释掉来看效果:

/*float: left;*/

bfc没有设置高度,它的高度是因装的东西而定的,如果就是浏览器默认的static,那么box和bfc在一个平面,就相当于我们往地上扔了一个纸箱子,这个箱子的高度是可以伸缩的。我们再往里面扔两个盒子,这个箱子就扩充起来了。
这里写图片描述

float: left;

一旦有了这句话就不一样了,这个时候两个盒子被放在了二楼,这个bfc箱子还在一楼,自然就是瘪的了
这里写图片描述
要如何将这个bfc也放到二楼呢?
那就需要将它变为bfc:就是上面提到的方式

overflow: hidden;
float: left;
position: absolute;
display: flex;

都可以实现,因为这样它就变成了BFC和box并列了,都放到二楼去了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值