浅谈BFC

BFC全称为:Block Formatting Contexts(块级格式化上下文),通俗一点讲的话,如果我们使用的规则是一所所大学,那么BFC就是一个985或者211的高校。

一. 触发BFC

只要满足以下任意一点,就可以触发BFC

1.根元素,比如html标签就是一个BFC

2.float的值不是none

3.overflow的值不是visible

4.display的值为inline-block/table-cell/table-caption/flex/inline-flex

5.position的值为absolute/fixed

二. BFC的特性

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

应用:这种方法可以解决为什么margin上下会发生重叠,而我们使用了一系列方法解决它。

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

应用:可以解释为什么高度塌陷可以用overflowhidden等方法解决。

  1. BFC的区域不会与float box发生重叠。

应用:自适应两栏布局或者三栏布局<圣杯布局和双飞翼布局>

4、BFC内部的Box会在垂直方向,一个接一个的放置。

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

6BFC就是页面上的一个独立容器,容器里面的元素不会影响到外面的元素。

 

.应用

 

通俗一点的说,BFC可以看成父子关系和兄弟关系。

1.父子关系

 

<style type="text/css">

body,ul{margin: 0; padding: 0;}

ul{border: 3px solid red;/* overflow: hidden; */}

ul li{float: left; list-style: none; border: 1px solid yellow;}

</style>

</head>

<body>

<ul>

<li>111</li>

<li>222</li>

<li>333</li>

<li>444</li>

<li>555</li>

</ul>

</body>

由于li设置了浮动,而li的父元素并没有设置高度,从而引起了高度塌陷。 

 

为了解决这一问题,我们可以给父元素ul添加属性overflow:hidden;触发了BFCBFC规定了浮动的元素也会计算高度,效果如图。 

 

2.兄弟关系

 

应用:自适应两栏布局或者三栏布局<圣杯布局和双飞翼布局>

 

1)我们可以在例1的基础上,添加overflow/display/position,要求满足BFC,就可以实现边距300px的现象了。

 

2)自适应三栏

 

大概结构为:

 

<body>

<div class="left">1111</div>

<div class="center">2222</div>

<div class="right">3333</div>

</body>

<style>内添加以下样式,.left .right .center都添加了浮动,满足了BFCBFC规定:不会与浮动元素发生重叠,从而实现了自定义三栏的效果,后面两种方法的原理也是如此。

 

.left{width: 100px;height: 200px;background: red;float: left;}

.center{height: 400px;background: yellow;width: calc(100% - 300px); float: left;}

.right{width: 200px;height: 300px;background: deeppink;float: left;}

 

 

(3)圣杯布局

 

首先,了解一下什么是圣杯布局,如图,为了实现一个两侧宽度固定,中间宽度自适应的三栏布局,中间部分在DOM结构上优先,以便先行渲染。

 

 

 

<style type="text/css">

body{ margin: 0; padding: 0;}

.box{ border: 5px solid red; overflow: hidden;padding: 0 200px 0 100px;}

.left{float:left;width:100px;height:200px;margin-left: -100%;position: relative; left: -100px;}

.right{float:left;width:200px;height:300px;margin-left:-200px;position:relative; right: -200px;}

.center{ float: left;height: 350px;width: 100%;}

</style>

</head>

<body>

     <div class="box">

 <div class="center">中间的区域</div>

 <div class="left">左边</div>

 <div class="right">右边</div>

 </div>

</body>

圣杯模式的特点是:

 

1.结构上先解析center

 

2.三块之间没有重叠的部分

 

3.给最大的盒子添加了padding挤进去的

 

(4)双飞翼布局

 

双飞翼的布局大致是和圣杯布局相同的,它的结构图如下。

 

 

 

<style type="text/css">

body{ margin: 0; padding: 0;}

.box{ border: 5px solid red; overflow: hidden;}

.left{float:left;width: 100px;height: 200px;background: yellow;margin-left: -100%;}

.right{float: left;width: 200px;height: 300px;background: blue;margin-left: -200px;}

.center{ float: left;height: 350px;width: 100%;}

.bg{margin: 0 200px 0 100px;background: deeppink;height: 320px;}

</style>

</head>

<body>

 <div class="box">

 <div class="center">

 <div class="bg">中间的盒子</div>

 </div>

 <div class="left">左边</div>

 <div class="right">右边</div>

 </div>

</body>

双飞翼布局的特点是

 

1.结构上先解析center

 

2.三大块上,最大的中间是和左右重叠的

 

3.center里面包了一个小盒子,小盒子给margin挤进去的

 

.总结

 

BFC只是一个容器,他并不会影响外部的其他元素,同时,也可以解决我们常见的浮动、外边框合并等现象。有了它,我们的布局就不会出现意外啦。

 

posted @ 2020-02-25 12:33  小心小欣  阅读(71)  评论(0)    收藏  举报