更加直观地了解hasLayout和BFC

网络上有很多关于hasLayout和BFC相关的文章,但是大部分都显得有些晦涩难懂。所以想用一些比较直观的例子来说明hasLayout和BFC给平时的布局带来的影响。

基础知识

在讲hasLayout和BFC之前,先简单地过一下元素布局的一些基本知识。

元素本身的布局方式可以从display上表现出来

  • block,对应块级元素
  • inline,对应行内元素
  • inline-block
  • none

当然,还有更多的一些属性,我们只提及主要部分。

块级元素,在浏览器中通常是垂直布局,然后可以用margin来控制块级元素之间的间距,并列和嵌套的块级元素都存在外边距,也就是margin合并的问题。

而行内元素是以水平的方式布局,垂直方向的margin,padding都是无效的,并且设置的宽高也是无效的。

BFC的全名是block formatting context,转成中文就是块级元素格式上下文,听起来有些别扭,字面上的意思大概就是一个元素的布局上下文类型。

而大家应该对hasLayout已经很熟悉了,更多可能是因为IE5.5/6/7上一些奇怪的bug(还有处于quirks模式下的IE8)。

BFC和hasLayout是作为元素的一种隐藏属性存在,并且一旦触发之后就不可逆转。他们之间有很多共同点。(注:没有办法设置hasLayout=false, 除非把一开始那些触发hasLayout的CSS属性去除,此处是我没有表达好,谢谢@貘吃馍香指正)

共同点

1.不和浮动元素重叠

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

这里我们使用msdn上的一个例子,来说明haslayout和BFC对这个情况的影响。

<div style="float:left; border: 2px solid red"> 123</div> <span style="border: 2px solid blue">      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.       The quick brown fox jumped over the lazy dog‘s back. </span>​

我们可以看到,文字环绕着浮动元素进行布局。

但是如果我们用overflow:hidden和zoom:1,分别触发BFC和hasLayout,那么,结果会是如何呢?

加上触发条件的代码如下

<div style="float:left; border: 2px solid red"> 123</div> <span style="border: 2px solid blue;display:block;overflow:hidden;*zoom:1">      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.       The quick brown fox jumped over the lazy dog‘s back. </span>​

结果如下图,点此查看demo

那么,实际开发中,这个特性可以用于解决什么问题呢?

比如百度知道(http://zhidao.baidu.com/)首页右栏有一个本周知道之星

结构也很简单,就是

<img/> <div> <h4>天涯魔鬼训练营</h4> <p>大将军 十八级</p> </div>

他给img和div分别加了float:left来解决左右栏排版的问题。

但是,假设(仅仅是假设)描述部分多了几个字,就变成了这样

实际情况中不应该存在那么高的等级,但是至少,我们有办法提供布局的容错性。

那么,如果我们将img设置float,div不设置float,效果就变成了这样:

我多加了几个字,显得有些夸张,很明显,结果依然不是我们想要的。

我们想要的结果应该是这样。

怎么样才能在文字长度不可控的情况下,保证布局的稳定性呢?

再回到之前讲的共同点1,你应该知道怎么解决这个问题了。

点此查看demo

当然,还有更多应用的场景

例如一个简单的三栏布局,左右两栏定宽,中间部分自适应,点此查看demo

2.清除元素内部浮动

点此查看示例

在示例中,我们可以看到outer元素在设置overflow:hidden和zoom:1之后,元素内部浮动对外部的影响被清除。也就是我们最常用的清除浮动在IE5.5/6/7上生效的原理。

.k2-fix-float:after{  content:"\0020";  display:block;  height:0;  clear:both; } .k2-fix-float{ *zoom:1; }

3.嵌套元素边距折叠问题的解决

点此查看demo

不同点

1.hasLayout的元素被限制为一个矩形

触发haslayout的元素是可以设置宽高的,而触发BFC的元素不一定可以设置宽高,比如一个行内元素,设置float或者设置overflow都可以触发BFC,但是前者可以设置宽高,后者却不能,但是仔细考虑一下,给一个行内元素设置overflow:hidden还是一见比较扯蛋的事情。

点此查看demo

2.hasLayout的元素设置display:inline后与inline-block行为类似

该特性在IE6/7下解决inline-block问题时也有遇到

.k2-inline-block{  display:-moz-inline-stack;  display:inline-block; *display:inline; *zoom:1;  vertical-align:middle;  position:relative;/* 解决因为父容器{display:inline;}问题导致Firefox中li里面的链接不可点的bug */  _position:static;/* 解决因为IE6中因为上一行代码带来在{position:relative}容器中移位在bug */ }

这个状态下的元素和普通文字一样在水平方向连续排列,受vertical-align的影响,并且可以按照容器大小自适应调整。

更多补充

BFC和hasLayout在实际开发中还是要分为两个内容分别看待,特别是haslayout这个属性,按照现在的状况,它带来的困扰还是蛮大的。

hasLayout相关的问题列几个,更多可以看最后的参考文献:

1. 浮动元素的宽度自适应问题

2.相对定位元素本身不会触发hasLayout,但是在刷新页面,调整窗口,滚动页面,选中内容的时候,会出现内容消失或者错误,因为IE在设置相对定位元素之后,如果需要做偏移处理等等,会忘了告诉其子孙元素进行“重绘”。

3.绝对定位元素如果没有触发hasLayout带来的问题

4.滤镜是只适用于hasLayout的元素的

参考资料

本文所用到的CSS解决方案来自口碑网K2框架,详细可以访问https://github.com/f2e/k2,K2框架改进自YUI3,作为口碑网前端、前后端的解决方案。

更加直观地了解hasLayout和BFC,布布扣,bubuko.com

时间: 2024-10-25 16:43:34

更加直观地了解hasLayout和BFC的相关文章

更加直观地了解hasLayout和BFC(转)

网络上有很多关于hasLayout和BFC相关的文章,但是大部分都显得有些晦涩难懂.所以想用一些比较直观的例子来说明hasLayout和BFC给平时的布局带来的影响. 基础知识 在讲hasLayout和BFC之前,先简单地过一下元素布局的一些基本知识. 元素本身的布局方式可以从display上表现出来 block,对应块级元素 inline,对应行内元素 inline-block none 当然,还有更多的一些属性,我们只提及主要部分. 块级元素,在浏览器中通常是垂直布局,然后可以用margin

有关对hasLayout和BFC(Block Formatting Contexts)的理解

2014年1月26日 首先,hasLayout 和 Block Formatting Contexts 分别是什么? 1.hasLayout是IE内部的一个特有的隐形属性,属性值为true/false.元素一旦拥有了这个属性,就拥有了布局,也就是说该元素可以对自己及其子元素进行尺寸计算和定位(比起依赖父元素进行布局会花费更大的代价).由于这个元素是隐形的,不能通过CSS来设置hasLayout:true/false;可以通过js来检测元素是否拥有布局.hasLayout是只读属性,一旦触发,不可

hasLayout与BFC的触发条件

hasLayout与BFC是分别在IE和其他浏览器上的两个作用很相近的概念,在很多时候,我们需要触发它们去实现有些效果.例如清除浮动时需要触发hasLayout与BFC:很多自适应的两栏和三栏布局(两边固定宽度,中间自适应)需要触发hasLayout与BFC:很多奇形怪状的IE bug的解决需要触发hasLayout…至于详细的用法这里就不做详细说明了,这里说说触发hasLayout与BFC的条件: hasLayout Layout是 IE 的专有概念,它决定了元素如何对其内容进行定位和尺寸计算

HasLayout和BFC(Block Format Context)

HasLayout和BFC 1.什么是HasLayout HasLayout是IE浏览器的一个内部的特性,这个特性有两个是true和false,false表示没有开启布局,而true表示开启了. 在IE中一个元素要么根据父元素的大小进行布局,要么根据自身的内容大小来布局,而默认情况一般是前者.但是,当我们需要根据内容来确定元素大小时,就需要开启元素的HasLayout属性,换句话说就是将元素的HasLayout设置为true. 当一个元素有一个布局时,它会对自己和后代元素进行计算从而计算自身的尺

haslayout和BFC

感谢CSS涛的分享,参考文章: (1)haslayout:http://aibusy.com/blog/?p=53 (2)BFC 神奇背后的原理:http://aibusy.com/blog/?p=86, http://blog.melonhuang.gitpress.org/~docs/css/1formattingContext.md 作用: haslayout和BFC

(转)hasLayout与BFC的触发条件

hasLayout与BFC是分别在IE和其他浏览器上的两个作用很相近的概念,在很多时候,我们需要触发它们去实现有些效果.例如清除浮动时需要触发hasLayout与BFC:很多自适应的两栏和三栏布局(两边固定宽度,中间自适应)需要触发hasLayout与BFC:很多奇形怪状的IE bug的解决需要触发hasLayout…至于详细的用法这里就不做详细说明了,这里说说触发hasLayout与BFC的条件: hasLayout Layout是 IE 的专有概念,它决定了元素如何对其内容进行定位和尺寸计算

BFC 和 haslayout

在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的. 元素的类型和 display 属性,决定了这个 Box 的类型. 不同类型的 Box, 会参与不同的 Formatting Context(一个决定如何渲染文档的容器), 因此Box内的元素会以不同的方式渲染.让我们看看有哪些盒子: block-level box: disp

【转】关于Block Formatting Context--BFC和IE的hasLayout

转自穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为“块级格式化范围”. 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用.当涉及到可视化布局的时候,Block Formatting Context提供了一个环境,HTML元素在这个环境中按照一定规则进行布局.一个环境中的元素不会影响到其它环境中的布局.比如浮动元素会形成BFC,浮

关于Block Formatting Context--BFC和IE的hasLayout

本文--- 出处:穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为“块级格式化范围”. 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用.当涉及到可视化布局的时候,Block Formatting Context提供了一个环境,HTML元素在这个环境中按照一定规则进行布局.一个环境中的元素不会影响到其它环境中的布局.比如浮动元素会