对hasLayout和BFC的实践思考

  先说BFC|haslayout的应用场景:
  1>触发BFC | haslayout可以包含内部元素的浮动(闭合浮动);
  2>触发BFC | haslayout可以阻止元素被浮动元素覆盖;
  3>触发BFC | haslayout可以阻止垂直外边距折叠(合并)。

  再说BFC | haslayout的触发方式:

  触发BFC常用方式:
    float: left | right;
    position: absolute | fixed;
    display: inline-block | table-cell | table-caption 
    overflow: auto | scroll | hidden
  触发haslayout常用方式:
    float: left | right
    position: absolute
    display:inline-block
    height: (任何值除了auto)
    width: (任何值除了auto)
    writing-mode: tb-rl
    zoom: (除normal 外任意值)
    Internet Explorer 7 还有一些额外的属性(不完全列表):     min-height: (任意值)     max-height: (除 none 外任意值)     min-width: (任意值)     max-width: (除 none 外任意值)     position: fixed     overflow: (除 visible 外任意值)

 

  说明:在上面标注橙色的部分是既能触发BFC,也能触发haslayout的属性。

  当然,我们能够利用BFC | haslayout能够解决很多在实际项目中碰到的bug问题,在这里,我主要针对一个典型的应用对BFC | haslayout作以深入的应用说明。

  向大家引入三个常见模型(自己总结)——图标模型、操作模型、列表模型

  

  会发现,图标模型”无非是作图右文的常见模型。接下来引入“操作模型”——

  

  之所以起名为“操作模型”,源于这个模型多用于显示用户对内容的相关操作。接下来引入“列表模型”——

  

  这里的“列表模型”,基本上指代的是ul/li的应用了,不要仅仅局限于普通列表应用ul/li(或者dl/dt/dd等),凡是循环显示相同内容或同类型的内容的时候均可应用“列表模型”。

  三个模型介绍完了,我们应用BFC | haslayout对第一个模型(图标模型)的实现做以简要分析,下面我简略概括之——

左部(block
右部(block
说明(推荐指数最大额:5
左浮
右浮(BFChaslayout
父元素限定宽度或右部元素需要限定宽度
  
推荐分析:源于float:left|right既能触发BFC,也能触发haslayout

推荐指数:4
左浮
左浮(BFChaslayout
父元素限定宽度或右部元素需要限定宽度
  
推荐分析:源于float:left|right既能触发BFC,也能触发haslayout
  
推荐指数:4.5
左浮
对于现代浏览器,需要触发BFC(不被左部的浮动元素所覆盖);
  
对于IE6/IE7,需要触发haslayout(不被左部的浮动元素所覆盖);
  
思考——我们该用怎样的属性去触发这里的BFChaslayout呢?
  
1>先说overflow系列,它的auto/croll/ hidden三个属性值,都有一定的表现限制,该采用哪个值需应用而定。最主要的是,它既能够触发现代浏览器的BFC,也能够触发IE7haslayout。这种方式确实比较暴力。对于IE6的话,我们还需要用_zoom:1;这个hack来触haslayout
  
2>再说display:inline-block;它既能够触发IE系列的haslayout,也能够触发非IE系列的BFC,但是,一旦右部分元素使用了这样属性,对于IE系列和非IE系列的表现是不一致的,IE系列自适应了宽度,而非IE系列没有,所以最好对该部分元素进行宽度限制。另外,还有需要解决IE63像素文本偏移bug,对左部元素写个hack——margin-right:-3px;
  
概括一下:
  
1>整合起来,我们可能要用到  
overflow:hidden;(触发现代浏览器BFC,并触发IE7haslayout  
_zoom:1;(触发IE6的haslayout)这个组合来限定右部元素。这样,右部元素就可以自适应宽度了,这一点是对比前两点的优势所在。不过,多了个hack还是很不爽,overflow系列的应用具有一定限制,我们最好避免之。
  
推荐指数:4
  
2>如果用了display:inline-block; 能够触发IE系列的haslayout,也能够触发现代浏览器BFC,看起来不错,但是还是要写点儿hack的,右部还是需要限定宽度的。
  
推荐指数:4
  
3>其他的触发BFC |  haslayout的组合就不谈了。不常用。
  
左浮
margin-left:左部元素的宽度;  
这个方式是我个人比较喜欢的,除了3像素文本偏移bug外,其他都不用考虑,何乐而不为呢。
推荐指数:4.5
display:inline-block
右浮(BFChaslayout
推荐指数:3
display:inline-block
display:inline-block;
  这所导致的空白间隙,解决起来真是令人头痛,我可不希望通过通过改变文档结构来解决这个问题(一切以牺牲结构来兼容表现的行为都是耍流氓)。
推荐指数:2
position: absolute
position: absolute; BFChaslayout
  
不常用
  
推荐指数:1
……
……
……

   如果你看懂了这篇文章,希望你对BFC和haslayout有更加深刻的认识。

posted @ 2012-11-01 16:28  金广国  阅读(292)  评论(1编辑  收藏  举报