bfc布局

BFC(Block Formatting Contexts -- 块格式化布局)布局是需要其他属性值设置为某些特定的值方可触发BFC布局,也就是说这个bfc不像弹性布局一样,只要申明display:flex就可以申明一个flex的容器,bfc有一些特定的属性值,申明之后自动回触发bfc,能触发bfc布局的属性如下:

float的属性值不是none。
overflow的属性值不是visible
position的值不是static和relative的
display的值是table-cell,inline-block,table-caption中的一个;
bfc布局决定了父元素(块级元素)如何对它的子元素(块元素)进行布局以及和其兄弟元素的相互作用。同时bfc布局可以看做是和外面隔离的一个单独的渲染区域,他有自己的渲染规则,不会影响到bfc区域外的元素,反之,区域之外的元素也不会影响bfc区域元素的布局。

那bfc有哪些特性呢?或者说bfc有什么作用呢?下面从三个方面来描述bfc布局的特点:

1:阻止外边距折叠的现象:

这里先解释一下外边距折叠原则:块级元素的上下外边距(margin)在某些情况下会合并(折叠)起来,合并之后的大小为较大的margin。注意浮动和绝对定位的元素的margin从不折叠。

准确的应该是说垂直外边距折叠,因为水平方向上是不会发生折叠的。

哪些情况下会发生折叠呢。?或者说折叠外边距的条件是什么呢。?有两种情况,分别如下:

a:垂直相邻的垂直元素;这个很好理解,也比较常见,不过需要注意的是,这儿的相邻是指渲染之后元素位置相邻,而不是说dom结构上的相邻,代码如下:           

<style>
.container{

    }
    .item{
        margin: 20px;
        width: 300px;
        height: 50px;
        border: 1px solid red;
    }

<div class="container">
<div class="item">我是一个div,我设置了上下外边距20px</div>
<div class="item">我是一个div,我设置了上下外边距20px</div>
<div class="item">我是一个div,我设置了上下外边距20px</div>
</div>
效果如下:

可以看到下面的item的外边距发生了折叠

如果将上面的div结构改成如下:

可以发现在第二个item中嵌套了一个div外层,依旧会发生外边距折叠,这就是上面说的是渲染之后的元素相邻而不是dom结构上的相邻(嵌套了一个div之后第二个item与上下两个item在dom结构上不是相邻的了,不过渲染之后依旧上下相邻,因此还是会产生外边距折叠的。)        

<div class="container">
<div class="item">我是一个div,我设置了上下外边距20px</div>
<div>
<div class="item">我是一个div,我设置了上下外边距20px</div>
</div>
<div class="item">我是一个div,我设置了上下外边距20px</div>
</div>
效果如下:

b:父元素和第一个/最后一个子元素之间 代码如下:

<style>
.parent {
width: 600px;
margin-top: 30px;
margin-bottom: 30px;
background: #a6d5ec;
}

    .child {
        margin-top: 20px;
        margin-bottom: 20px;
        height: 50px;
        background-color: lightgray;
    }

</style>
<div class="parent">
<div class="child">我是一个div子元素,我设置了上下外边距20px,我的父元素设置了上下外边距30px</div>
<div class="child">我是一个div子元素,我设置了上下外边距20px,我的父元素设置了上下外边距30px</div>
<div class="child">我是一个div子元素,我设置了上下外边距20px,我的父元素设置了上下外边距30px</div>
<div class="child">我是一个div子元素,我设置了上下外边距20px,我的父元素设置了上下外边距30px</div>
</div>
此时就会发生外边距折叠:下图的第一个子元素和最后一个子元素都与父元素发生了外边距折叠,最后折叠结果表现为取大的那个值也就是父元素的30px;

有时候我么并不希望发生外边距折叠,那触发bfc就可以为我们轻松解决这个问题:

2:可以包含浮动的元素,防止“高度坍塌”。

其实这也是使用overflow:auto,和overflow:hidden来清楚浮动的原理。其实就是触发了浮动元素的父元素bfc的布局, 从而可以包含浮动元素,闭合浮动。也就是bfc 可以根据子元素的情况来自适应高度,即便子元素是浮动的元素。

这实际上是为我们解决浮动出现的高度“坍塌”实现了一种解决方案而且很优雅,当然也有其他方式来解决浮动出现的高度“坍塌”,后面我们在写一个专门解决浮动的文章。

code:

<style>
.fl{
float: left;
}
.cf{
overflow: auto;
}
</style>

<div class="container">
<div class="item fl">我是一个div,我设置了float: left;我父元素div的高度是0</div>
</div>
<div class="container cf">
<div class="item fl">我是一个div,我设置了float: left;但是我的父元素设置了overflow:aoto,触发了bfc,我父元素高度正常</div>
</div>
效果如下:

前面两点都是bfc布局对于内部子元素的布局影响,第三点是和自己兄弟元素直接的影响了

3:浮动元素的块级兄弟元素会无视这个浮动元素,并且总想沾满一行,这样就会被浮动元素所遮蔽一部分。这时候为这个块级兄弟元素触发bfc就可以避免被浮动元素遮蔽了。

code:

<style>
.container{
width: 1000px;
background: #a6d5ec;
height: 170px;
margin-bottom: 20px;
}
.item{
margin: 20px;
width: 300px;
/height: 50px;/
border: 1px solid red;
}

    .bfc{
        overflow: hidden;
    }

    .fl{
        float: left;
    }
    .fl-item{
        background: red;
    }
    
    .brother{
        background: #2aabd2;
    }
    .brother1{
        width: 400px;
    }
    .brother2{
        width: 500px;
    }
</style>

<div class="container">
<div class="fl fl-item">我设置了float: left;挡在了部分(块级兄弟元素)的上面</div>
<div class="brother">我是浮动元素的(块级兄弟元素),我没有触发bfc,我占满了一行可是我前部分被浮动元素挡在上面了</div>
</div>
<div class="container">
<div class="fl fl-item">我设置了float: left;可还是挡不住触发了bfc的块级兄弟元素,但是宽度是多少我先占。</div>
<div class="brother bfc">我是浮动元素的块级兄弟元素,我设置了overflow: hidden;触发bfc,我的宽度没有设置,先让浮动元素占据父元素的宽度,然后剩下的宽度都是我的了(我的宽度是自适应的)。左边的浮动元素再也挡不住我了,oh yeah~</div>
</div>

<div class="container">
<div class="fl fl-item">我设置了float: left;挡不住触发了bfc的块级兄弟元素,但是宽度是多少我先占。</div>
<div class="brother1 bfc brother">我是浮动元素的块级兄弟元素而且我有自己的固定宽度400px,我设置了overflow: hidden;触发bfc,先让浮动元素占据父元素的宽度,然后看剩下的宽度如果足够我用我就不换行,我只有400宽度足够我用了,我就不换行了,不然我就会自己换行。左边的浮动元素再也挡不住我了,oh yeah~</div>
</div>

<div class="container">
<div class="fl fl-item">我设置了float: left;挡不住触发了bfc的块级兄弟元素,但是宽度是多少我先占。</div>
<div class="brother2 bfc brother">我是浮动元素的块级兄弟元素而且我有自己的固定宽度500px,我设置了overflow: hidden;触发bfc,先让浮动元素占据父元素的宽度,然后看剩下的宽度如果足够我用我就不换行,不然我就会自己换行(剩下的跨大怒不够500px,所以我换行了)。左边的浮动元素再也挡不住我了,oh yeah~</div>
</div>

可以看出bfc的第三个特点对浮动元素的 块级别元素的影响。

其中第二个块级别的兄弟元素不设置宽度,他的宽度是先让浮动元素占据父元素的宽度,然后自己自适应父元素的剩余宽度。这其实是一种经常用到的自适应布局技巧。父元素固定的情况下,浮动元素宽一点,那块兄弟元素就窄一点,浮动元素窄一点那么块兄弟元素就宽一点,两者的宽度相加始终等于父元素的宽度。

第三个,块兄弟元素有自己的固定宽度而且剩余的宽度够用,那么还有多余那剩下的就给外边距了。

第四个情况块兄弟元素哟自己的宽度而且剩余宽度不够自己用,那浏览器为了满足块兄弟元素所设置的宽度那就只能换行了。

总结:

BFC布局还是蛮有用的,触发bfc有若干方式,他能为我们解决一些问题,罗列出来的bfc的作用一共有三个,其中第一点第二点是合并外边距 和 解决浮动高度坍塌是对自己内部的渲染规则,而第三点阻止浮动元素遮蔽块兄弟元素则是bfc布局对外(对浮动的兄弟元素的渲染规则)。这三个特点特别是解决浮动元素的父元素高度“坍塌”和第三点自适应宽度布局是非常非常有用的。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,747评论 1 92
  • relative:生成相对定位的元素,通过top,bottom,left,right的位置相对于其正常位置进行定位...
    zx9426阅读 938评论 0 2
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,465评论 1 45
  • 1. 浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分别有什么影响? 特征:浮动元素不在普通的文档流中...
    在乎者也阅读 1,170评论 0 1
  • 什么是盒子? CSS处理网页时,它认为每个元素都包含在一 个不可见的盒子里。 我们只需要将相应的盒子摆放到网页中相...
    咻咻咻滴赵大妞阅读 914评论 0 0