认识和理解css布局中的BFC

认识和理解css布局中的BFC

BFC的定义

是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用

Block Formatting Context 的元素的特点

  • 其子元素会一个接一个地放置。垂直方向上他们的起点是一个包含块的顶部,两个相邻的元素之间的垂直距离取决于 ‘margin’ 特性。
  • 相邻的块级元素的垂直边距会折叠(collapse)。
  • 每一个元素左外边(margin)与包含块的左边相接触(对于从右到左的格式化,右外边接触右边), 即使存在浮动也是如此(尽管一个元素的内容区域会由于浮动而压缩),除非这个元素也创建了一个新的 Block Formatting Context 。
    例如:
    <div class="con">
      <img class="headImg floatLeft" src="mm.jpg" />
      <div class="mainCon">many text and pic here</div>
    </div>

.headImg 和 div.mainCon的左外边框是与div.con左边框接触的,当div.mainCon内容较多时,表现为围绕浮动的.headImg元素,触发div.mainCon元素的BFC即避免围绕浮动元素,从而实现2列布局.

触发元素的BFC的方式:

  1. 设置浮动 则div.mainCon的宽度会自适应内容多少,div.con剩余宽度不够容纳div.mainCon的内容时会出现换行,要确保2列布局需要指定div.mainCon的宽度
  2. 设置overflow:hidden 2列布局,div.mainCon自适应容器剩余宽度,但设置溢出隐藏,限制了不能在div.mainCon外布局其他元素(如 箭头 浮动菜单...), 注意(设置 overflow:hidden; 或 overflow:auto; 元素都是隐藏溢出的 test in chrome)
  3. ** display:inline-block 或 display:table-caption 效果同float** , div.mainCon 宽度自适应内容多少 内容多会换行,要设定宽度才能确保2列布局
  4. display:table-cell 效果同float ,宽度自适应内容多少 内容多不会换行,不用设定宽度确保2列布局,但是 ie6-7不支持display:table-cell
  5. position:absolute; 效果同 display:table-cell, 兼容性好一点

BFC到底是什么?

当涉及到可视化布局的时候,Block Formatting Context提供了一个环境,HTML元素在这个环境中按照一定规则进行布局。BFC环境中的元素不会影响到其它环境中的布局。比如浮动元素会形成BFC,浮动元素内部子元素的主要受该浮动元素影响,两个浮动元素之间是互不影响的。这里有点类似一个BFC就是一个独立的行政单位的意思。

怎样才能形成BFC

  • float的值不为none。
  • overflow的值不为visible。
  • display的值为table-cell, table-caption, inline-block中的任何一个。
  • position的值不为relative和static。

BFC的作用

不和浮动元素重叠,实现两列布局

如果一个浮动元素后面跟着一个非浮动的元素,那么就会产生一个覆盖的现象,很多自适应的两栏布局就是这么做的。比如下图的效果,参考例子

<div style="float:left; border: 2px solid red"><img src="user-img" /></div>
<p style="border: 2px solid blue;display:block;overflow:hidden;*zoom:1">
    The quick brown fox jumped over the  4seohunt.com lazy  dog‘s back.
    The quick brown fox jumped over the lazy dog‘s back.
    The quick brown fox jumped over the lazy dog‘s back.
    The quick brown fox jumped over the lazy dog‘s back.
    The quick brown fox jumped over the lazy dog‘s back.
</p>

清除子元素浮动影响 clearfix

只要把父元素设为BFC就可以避免子元素的浮动导致父元素的高度塌陷的问题,最常见的用法就是在父元素上设置overflow: hidden样式,对于IE6加上zoom:1就可以了(触发IE Haslayout)。

子元素和父元素同属一个BFC,子元素的Margin边距穿透父元素与其他元素margin折叠问题的修复

按照BFC的定义,只有同属于一个BFC时,两个元素才有可能发生垂直Margin的重叠,这个包括相邻元素,嵌套元素,只要他们之间没有阻挡(例如边框,非空内容,padding等)就会发生margin重叠。(子元素和父元素margin重叠,子元素和父元素的兄弟元素margin重叠)

因此要解决垂直margin重叠问题,只要让它们不在同一个BFC就行了,但是对于两个相邻元素来说,意义不大,没有必要给它们加个外壳,但是对于嵌套元素来说就很有必要了,只要把父元素设为BFC就可以了。这样子元素的margin就不会和父元素的margin发生重叠了。

<div class="prev">prev div</div>
<div class="next mt10 h100 bg-darkred">
    <h2 class="mt100 h10 bg-darkblue">i am title</h2>
</div>

div.pre 和 div.next的垂直间距为100px; 因为 div.next 和它内部的h2属于同一个BFC,所以垂直margin重叠了(h2的垂直margin穿透了父元素 影响了父元素和其他元素的关系)

解决方法:

  1. 让2个margin-top不相邻(div.next的margin-top:10px 和 h2的margin-top:100px),设置父元素的border 或padding
  2. 触发父元素的BFC, 形成独立的布局单元
时间: 2024-12-24 08:32:47

认识和理解css布局中的BFC的相关文章

CSS布局中应用BFC的例子

BFC是啥? BFC(Block Formatting Context),“块状格式化上下文”.简单地说,它提供一个独立的布局环境.在同一个BFC中,盒子会一个挨一个地排列,margin边距还会在垂直方向上叠加.float和clear:float也只会在同一个BFC内有效. 产生BFC的情况有? W3C标准中这样描述:Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cel

css布局中,什么是BFC

BFC的定义是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用.在创建了 Block Formatting Context 的元素中,其子元素会一个接一个地放置.垂直方向上他们的起点是一个包含块的顶部,两个相邻的元素之间的垂直距离取决于 ‘margin’ 特性.在 Block Formatting Context 中相邻的块级元素的垂直边距会折叠(collapse). 在 Block Formatting Context 中,每一个元素

理解 CSS 布局和块级格式上下文

前言 BFC 的概念始于 CSS2,是个蛮古老的 CSS 话题了,网上也到处能搜到 BFC 的介绍,但是都不够简洁.本文系翻译自 Rachel Andrew 女士的博文 Understanding CSS Layout And The Block Formatting Context,内容足够简洁明了. 本文的目的是介绍一些概念,来帮你增强 CSS 码力.如标题所示,这篇文章主要是讲块级格式上下文(BFC,Block Formatting Context).你可能没听过这个术语,但只要你曾经使用

关于css布局中margin,padding在整个布局中使用的一些细节

最近在学习写网页,在用html标记语言和css布局时,发现css布局中的margin,padding会使整个布局变大,最后在研究了css盒模型时找到了答案. 主要原因是margin定义了模块的外边距,padding定义了模块的内边距,如果在布局时没有把两块边距像素考虑到整个布局中,并且在父布局里宽高都设置为固定,此时会发生的事情就是:在整个父布局中如果宽度容纳不下子布局,那么子布局会撑出整个父布局,例如: <div id="container"> <div id=&q

div css布局中CSS图片大小自动按比例等比例缩小图片不变形解决技巧(转)

在DIV CSS布局中对于图片列表或图片排版时,图片不是固定宽度高度大小,但图片占位是固定宽度高度,这个时候如果使用CSS固定死图片大小(宽度 高度),这个时候如果图片相对于这个位置不是等比例大小,那么这张图片就会变形,让图片变的不清晰,这个时候想让图片不变形又按比例缩放,如何解决?CSS图片缩小不变形,图片自动缩小,图片按比例等比例缩小不变形解决. 解决方法有两种: 第一种,让图片和布局宽度高度成等比例,这样CSS设置死宽度和高度,图片也是等比例缩小,图片也不会变形. 比如淘宝,要求店铺主上传

DIV+CSS布局中主要CSS属性介绍

Float: Float属性是DIV+CSS布局中最基本也是最常用的属性,用于实现多列功能,我们知道<div>标签默认一行只能显示一个,而使用Float属性可以实现一行显示多个div的功能,最直接解释方法就是能实现表格布局的多列功能. Margin: Margin属性用于设置两个元素之间的距离. Padding: Padding属性用于设置一个元素的边框与其内容的距离. Clear: 使用Float属性设置一行有多个DIV后(多列),最好在下一行开始之前使用Clear属性清楚一下浮动,否则上面

安卓开发技巧一:深入理解Android布局中Layout_weight的属性

今天开始将要为大家介绍一些安卓开发过程将要用到的一些技巧,这些技巧全部来自网络搜集,或者自己在企业做项目的时候总结出来的,利用这些技巧将会对我们开发带来非常方便的便捷性. 先来记录一下这一段时间的技巧目录,方便大家以后方便查阅(大概有不到三十种的技巧总结,大概每周分享两个技巧,笔者将尽可能写的详细,以及提供实例源码): 安卓开发技巧一:深入理解Android布局中Layout_weight的属性 安卓开发技巧二:自定义日志工具类 安卓开发技巧三:Activity的启动模式 安卓开发技巧四:分享一

DIV+CSS布局中IE与FF浏览器之间重要的兼容性差异

IE与FF浏览器之间的一些重要差异: ·IE与FF的居中方式不一样. (1)如何让body体能够在IE与FF浏览器中都居中的例子: [html] view plaincopyprint? <html> <head> <title>让body容器在浏览器中居中</title> <link rel="stylesheet" type="text/css" href="body_center.css"

CSS规范中的BFC

一.什么是BFC 1.Formatting context:页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及其他元素的关系和相互作用. 2.Box:css布局的基本单位.元素的类型和display属性决定了这个box的类型.不同类型的box,会参与不同的Formatting Context(决定如何渲染文档). block-level box:display属性是block.list-item,table的元素,参与block Formatting context in