BFC对于布局的帮助

  前几天在园子里看文章的时候看到了BFC这个概念,对于小白的我来说那是相当的陌生,于是就百度了一下。结果还是有很多的,看来并不算是一个冷僻的知识。于是来总结一下搜索到的一些结果和理解。

  那么,什么事BFC呢?BFC是块级格式化上下文(Block Formatting Context)的简写,用来规范块级容器的布局方式。主要的特性是有以下几点:

    1.隔绝空间。使BFC内外的布局不会相互影响(个人猜测,在写一些ui控件的时候是不是应该将嘴歪层设置一个BFC,希望哪位大神给讲解一下)

    2.BFC内的元素从上至下一次排列,尽可能的高级上方(同级元素在垂直方向上的margin会存在塌陷,这个问题以前经常碰到,一直认为是个bug),水品方向的排列

       方向由你的水平对齐方式决定,子元素的margin和紧贴着BFC的border

    3.BFC的区域不会同浮动元素的区域叠加

    4.BFC的区域在计算高度时会计算其内浮动元素的高度

  说了这么多的特性,那么怎样去建立一个BFC呢?从w3c的介绍里可以得到:    

Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with ‘overflow’ other than ‘visible’ (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.

  大概的意思是:浮动元素,绝对定位元素,非块级盒子的块级容器(如inline-block,table-cells,以及table-caption)和overflow不为visible的块级盒子都会为其子元素建立一个BFC。用代码就是:

    float:left|right;

    position:absolute|fixed;

    display:inline-block|table-cells|table-captions;

    overflow:hidden;

  那么还有一个问题要注明是非块级盒子的块级容器呢?既然是块级格式化上下文,为什么不包含块级盒子?我的理解是,在一个页面中,以块级盒子居多,特别是div+css布局的时候,整个页面可能有上百个块级盒子,这样整个页面就被分成了上百个BFC。由于BFC有内外隔离的特性,反而会导致布局上更加困难?

  讲了一大堆的理论,到底BFC有什么用?能解决什么问题?这个才是我们最关注的东西(俗话说,不能解决问题的理论都是扯**蛋)。我知道的就是两个,其他的欢迎大家来补充:

  1.清楚浮动

    根据 BFC的区域在计算高度时会计算其内浮动元素的高度 以及 BFC隔绝内外布局 的特性(我猜的…)可以知道,当BFC内有浮动元素并且浮动元素的高度高于其他所有元素时,BFC的高度等于浮动元素的高度。为了方便说明,来上个图吧

  这张是在未创建BFC时的状态,对应的代码是:

<head>
  <meta charset="utf-8">
  <title>BFC</title>
  <style>
    .bfc{ margin: 100px 0;background: #777;overflow: hidden; }
    .float{ float: left;width: 100px;height: 200px;background: green;opacity: .6;color: white; }
    .default{ width: 300px;height: 100px;background: red; }
  </style>
</head>
<body>
  <div class="bfc">
    <div class="float">float</div>
    <div class="default">default</div>
  </div>
</body>

  可以看到,外层的.bfc的高度等于.default的高度,浮动元素并未被计算在内,导致了高度的塌陷。

  再来看看这张,在外层.fbc上创建了BFC之后的效果

.bfc{ margin: 100px 0;background: #777;overflow: hidden; }

  此时,浮动呗清除,.float的高度被计算在.bfc内。以前一直不明白为什么overflow可以清除浮动,其实就是因为BFC的帮助。

  2.解决子元素与父元素间margin失效的问题

  先看下面这段代码  

 1 <head>
 2     <meta charset="utf-8">
 3     <title>BFC</title>
 4     <style>
 5         .bfc{ width: 200px;height:200px;margin: 10px auto; background: #ddd}
 6         .bfc>div{ width: 100px;height:100px;margin:50px;background: green }
 7     </style>
 8 </head>
 9 <body>
10     <div class="bfc">
11         <div></div>
12     </div>
13 </body>

  你觉得效果是什么?这样吗?

  咋一看好像是的,但是结果呢?

  这个才是正确答案,为什么?我们从BFC的特性中去看看。BFC中的元素在垂直方向上会尽可能的往上方贴近,于是子元素的margin-top紧贴着父元素的border-top,导致父子元素之间的margin消失了。这个问题我在以前经常碰到,当时的解决方案是用padding代替margin,但是还是会有一些小问题,比如我想给子元素一个border-bottom,但是border-bottom的宽度会贯穿整个父元素。最后的替代解决方案是父元素使用用margin和padding,而子元素什么都不设置。在看完BFC之后明白,只要在父元素上设置overflow:hidden为其创建BFC之后问题就解决了。

  好了。我所了解的BFC就是这样的,可能还有很多特性我不知道,再次欢迎高手指正。

  看一下时间… 写了1个多小时,看看文章好像并不长的样子。应该是第一次写的原因吧!!休息一会,可以吃午饭了。

时间: 2024-08-01 15:32:57

BFC对于布局的帮助的相关文章

css盒模型与bfc与布局与垂直水平居中与css设计模式等

一.css盒子与布局相关 盒子内部的布局 盒子之间的布局visual formatting 脱离正常流normal flow的盒子的布局 absolute布局上下文下的布局 float布局上下文下的布局 flow下的盒子的布局 BFC布局上下文下的布局 IFC布局上下文下的布局 FFC布局上下文下的布局 table布局上下文下的布局 css grid布局上下文下的布局 1.css盒模型 页面上显示的每个元素(包括内联元素)都可以看作一个盒子,即盒模型( box model ) 盒模型有4部分组成

BFC自适应布局

BFC(Block Formatting Context)块级格式化上下文.它是一个独立的渲染区域. 它决定了块级元素如何对它的内容进行布局,以及与其他元素的关系和相互关系. 块级元素:父级(是一个块元素) 内容:子元素(是一个块元素) 其他元素:与内容同级别的兄弟元素 相互作用:BFC里的元素与外面的元素不会发生影响 触发条件或者说哪些元素会生成BFC: 满足下列条件之一就可触发BFC [1]根元素,即HTML元素 [2]float的值不为none [3]overflow的值不为visible

从块级元素和行内元素的分析到bfc的布局理解

接口和属性介绍 播放器提供了progressMakers属性,是一个数组类型,每一条记录包含offset时间和text打点的内容,还可以包含其他属性,此属性用于告诉播放器进度条打点记录,记录内容属性说明: 名称 类型 说明 offset Number 打点的视频偏移时间,单位:秒 text String 打点的文本信息,默认UI会使用 isCustomized Boolean 是否使用默认UI,不使用设置为true 事件 Aliplayer提供两个事件:鼠标进入进度条上的打点和鼠标离开进度条上的

CSS之bfc -- float布局

一.bfc布局 以下的代码加了子元素的上边距,为什么没有发生变化? <div class="wrapper"> <div class="content"></div> </div> * { padding: 0; margin: 0; } .wrapper{ position: relative; margin-left:100px; margin-top:100px; width: 100px; height: 10

BFC——一个我们容易忽视掉的布局神器

  今天给大家说说BFC这个概念,在说概念前,先给大家看个例子: 首先,定义三个div块元素   效果: 我们发现,块级元素的排列顺序是从上往下,一块接着一块,在w3c中,是这样解释block-level box的: 在一个块级排版上下文中,盒子是从包含块顶部开始,垂直的一个接一个的排列的. 相邻两个盒子之间的垂直的间距是被margin属性所决定的,在一个块级排版上下文中相邻的两个块级盒之间的垂直margin是折叠的 咱们看个例子: 代码如下: 在图中我们发现,在给两个块级元素设置同样的marg

【转】CSS深入理解流体特性和BFC特性下多栏自适应布局

这篇文章发布于 2015年02月12日,星期四,23:36,归类于 css相关. 阅读 30873 次, 今日 63 次 by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=4588 一.开篇之言 要说web上实现两栏自适应布局的方法,一双手都数不过来.不知大家有没有细想过,为什么这些方法可以实现自适应布局呢? 本文就将深入探讨下流体特性和BFC特性下的两栏自适应布局,还是

元素的BFC特性与自适应布局

一.BFC元素简介与基本表现. BFC全程"Block Formatting Context",中文为"块级格式化上下文".记住一句话:BFC元素特性表现原则就是,内部子元素再怎么翻江倒海,翻雨覆雨都不会影响外部的元素.所以,避免margin穿透.清楚浮动什么的也就好理解了. 什么时候出发BFC呢? 常见的情况如下: -> float 的值不为none ; -> overflow 的值为auto,scroll或hidden; -> display的

圣杯 双飞翼布局 多栏自适应布局BFC

七种实现左侧固定,右侧自适应两栏布局的方法 圣杯布局 双飞翼布局 圣杯布局和双飞翼布局 CSS深入理解流体特性和BFC特性下多栏自适应布局 块状元素的流体特性. 图片宽度一直width:100%,结果随着margin, padding, border的出现,其可用宽度自动跟着减小,形成了自适应效果.就像放在容器中的水流一样,内容区域会随着margin, padding, border的出现自动填满剩余空间(box-sizing:border box;感觉) 然而,利用块状元素流体特性实现的自适应

CSS 布局和 BFC

什么是 BFC 在一个Web页面的CSS渲染中,块级格式化上下文 (Block Fromatting Context)是按照块级盒子布局的.W3C对BFC的定义如下:浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文).BFC是一个独立的布局环境,其中的元素布局是不受外界的影响,并且在一个 BFC 中