zoukankan      html  css  js  c++  java
  • 对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)
         (任何值除了auto)
        writing-mode: tb-rl
        zoom: (除normal 外任意值)
        Internet Explorer 7 还有一些额外的属性(不完全列表):     min-height: (任意值)     max-height: (除 none 外任意值)     min- (任意值)     max- (除 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有更加深刻的认识。

  • 相关阅读:
    轻松构建微服务之分布式事物
    Java和操作系统交互细节
    网络内核之TCP是如何发送和接收消息的
    最全的微服务知识科普
    【译】TCP Implementation in Linux
    轻松构建微服务之分库分表
    OSX的一些基本知识
    Delphi中使用比较少的一些语法
    热烈祝贺我的博客开通
    Windows 服务快捷启动命令
  • 原文地址:https://www.cnblogs.com/jinguangguo/p/2749864.html
Copyright © 2011-2022 走看看