1、HASLAYOUT

  首先,haslayout翻译成中文就是:有布局。

  所谓布局,指的是一个元素可以对本身和里边的元素进行尺寸计算和定位。这里只是谈IE6/7,据说微软之所以不是对所有元素默认有布局,是为了浏览器的性能和简洁--!

  常见的哪些元素在ie6/7上是有布局的呢?常见的列举下:

body,html,table/tr/th/td,img,input/button/file/select/textarea,frame

  所以对于div、span、p等等元素就可能会出现没有布局的情况,就是没对对自身和里边元素进行相应的定位计算,而是靠的其他一些或是继承或是默认的方式进行定位。对于这种情况,就要触发该元素的haslayout属性了,触发的的手段有:

// 对以下属性设值可触发haslayout
zoom: (除 normal 外)
float: (非空)
position: absolute
display: inline-block
//块级元素的触发 
width/height: (除auto外)

  ie7还有其他的一些触发方法,没必要一一列举了。

  最常用的是zoom:1;因为设置这个一般不会影响其他属性,当然,有时候比如对块级你用width或是height属性已经触发了haslayout,就没必要多此一举的设zoom了。

  举个常见的例子,e.g:

  比如要设个内联元素为inline-block,ie6、7的原理是触发haslayout让内联元素可以设宽高和计算布局等,所有用zoom也是一样可以代替的。注意的是width/height属性只是块级元素才有的属性,内联元素会直接忽视他们,所有会触发不了。所以可以这么说,ie6/7本身是没有对inline-block设置特有的属性,只是把这个属性增加到触发haslayout的行列而已。这就是为什么block设个inline-block是没有效果的,只是触发haslayout而已,并不会内联。因此对于ie6/7的做法是先设为内联,再触发布局,模拟出inline-block的效果,不过还是有些许的区别,这样模拟后元素之间是没有间隙的。代码如下:

//ie6/7的块级元素inline-block的实现
display: inline;
*zoom: 1;

  好像有点罗嗦,不知道讲清楚没有,要做到兼容各个浏览器,你就可以根据ie6/7的原理用最少的代码兼容实现inline-block的效果。具体代码想必没必要写了,要不自行google一下inline-block的兼容ie6/7的代码就知道了。记住则己所需。

2、BFC

  还是先翻译下,即是block formatting contexts的缩写,翻译过来是:块级格式化上下文。以下说的都是非ie6/7的,因为ie6/7已经有专属的haslayout了,是不支持BFC的。

  什么是BFC,从字面意义上不好理解,所以还是直白去理解就最好了。干脆了解下这个到底做什么用的吧,如下:

  1、阻止子元素与外界的边距叠加。e.g:

//去掉触发的overflow试试
<div style="margin-bottom:10px;">123</div>
<div style="/*overflow:hidden*/">
<div style ="margin-top:10px;">321</div>
</div>

  2、BFC包容浮动,不会让浮动子元素越界。e.g:

//去掉触发的overflow试试
<div style="backgroun:red;/*overflow:hidden;*/">
<img style="float:left;" src="123.jpg">
<p>your ... text</p>
</div>

  3、BFC本身不会与外界的浮动重叠。 e.g:

//去掉触发的overflow试试
<div class="clearfix">
<img style="float:left;" src="123.jpg">
<p style="width:200px; background:red;/*overflow:hidden;*/">your ... text</p>
</div>

  所以从特性上讲,BFC就是一个不让内部元素与外界相互影响,包容浮动子元素,并自身和外界的浮动盒子不重叠的盒子。就是爱其子,且又洁身自爱,不像正常的婊子。

  能触发BFC的属性不多,常见的如下:

//触发BFC
float:(非空)
overflow: (非visible)
position: (absolute/fixed)
display: (inline-block)

  最常用的是overflow:hidden;理由和之前的zoom一样,这样一般不会影响到其他属性。

  注意的是,设置diplay:table就可以产生anonymous boxes,其中有可触发的display:table-cell属性,从而间接触发BFC。

  总结:ie6/7的haslayout和其他的BFC各显神通,不免会引起对比,通过触发的常用条件,不难发现,以下是可以同时触发haslayout和BFC的:float(非空)/position(absolute)/inline-block,区别肯定也是有的,比较明显的是haslayout是可以设置width/height的,BFC则不一定了,其他一些细微之处就不一一深究了,毕竟不同的浏览器渲染的方式总是不太一样的。

  最后,举个最最常用的例子做个结尾吧,刚好都有haslayout和BFC的使用,它就是我们可爱的清除浮动,细细看下吧:

.clearfix:before,
.clearfix:after {
  content: "";
  display: table; //here!
}
.clearfix:after {
  clear: both;
}
.clearfix {
  *zoom: 1;//here!
}

更多详情,可参考:http://www.smallni.com/haslayout-block-formatting-contexts/

以上是个人通过各个技术网站博客的探索实践中的一些总结,如有任何错误,还请务必指出。

实践中总结——理解haslayout和BFC的更多相关文章

  1. hasLayout与BFC的触发条件

    hasLayout与BFC是分别在IE和其他浏览器上的两个作用很相近的概念,在很多时候,我们需要触发它们去实现有些效果.例如清除浮动时需要触发hasLayout与BFC:很多自适应的两栏和三栏布局(两 ...

  2. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  3. 更加直观地了解hasLayout和BFC

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

  4. OpenStack实践系列⑦深入理解neutron和虚拟机

    OpenStack实践系列⑦深入理解neutron和虚拟机 五.深入理解Neutron 5.1 虚拟机网卡和网桥 [root@node1 ~]# ifconfig brq65c11cc3-8e: fl ...

  5. CSS学习(二)- 有关 hasLayout 和 BFC

    1. hasLayout 概念说明 ‘Layout’ 可以被某些 CSS property(特性)不可逆的触发,而某些 HTML 元素本身就具有 layout . ‘Layout’ 在 IE 中可以通 ...

  6. 03--(二)编程实践中C语言的一些常见细节

    编程实践中C语言的一些常见细节(转载) 对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所 ...

  7. 阿里巴巴 Kubernetes 应用管理实践中的经验与教训

    作者 | 孙健波(阿里巴巴技术专家).赵钰莹 导读:云原生时代,Kubernetes 的重要性日益凸显.然而,大多数互联网公司在 Kubernetes 上的探索并非想象中顺利,Kubernetes 自 ...

  8. .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结

    .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结 前言 本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一 ...

  9. Scrum 敏捷实践中的三大角色

    在我过去的近两年工作中,我们一直在应用 Scrum 敏捷项目管理方法来开展工作,今天,我先从它的角色划分来讲起,毕竟这可是它最鲜明的特征. 首先,为什么这种项目管理方法叫 Scrum ? Scrum ...

随机推荐

  1. IOS ARC和非ARC文件混用

    ARC在SDK4.0的时候增加的,因为要和曾经的项目融合,就会有arc和非arc文件的混合. 当然,也就这两种情况: 1.自己的旧项目没有使用ARC,可是引入的第三方库却是使用了ARC的. 2.自己的 ...

  2. AssetManager asset使用

    Android 该系统提供了一个程序为每个新的设计/assets文件夹.保存该文件在此文件夹可以在一个程序被打包./res 和/assets所不同的是,android不/assets下生成的文件ID. ...

  3. Dos命令将合并两个文本文件的内容

    当生产线的问题,有一个放b.txt的内容被添加到a.txt这需要采取.在考虑这个问题.我的第一感觉是敲代码.阅读b.txt内容,渐进写a.txt.想起昨天在加工处理生产线600M决的方法,我用java ...

  4. 1711 Number Sequence(kmp)

    Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...

  5. 关于system()的一些用法

    C语库函数 函数名: system  功  能: 发出一个DOS命令  用  法: int system(char *command);  它包含头文件<stdlib.h>  system ...

  6. Select与SelectMany的区别

    Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值. Select() 为每个源值生成一个结果值.因此,总体结果是一个与源集合具有相同元素数目的集合.与之相反,Se ...

  7. linux_ubuntu12.04 安装 svn

    sudo apt-get install subversion sudo mkdir /home/svn sudo svnadmin create /home/svn/repository cd /h ...

  8. 浅谈 js 数字格式类型

    原文:浅谈 js 数字格式类型 很多人也许只知道 ,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是 ...

  9. POJ3342——Party at Hali-Bula

    Party at Hali-Bula Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5418   Accepted: 192 ...

  10. HDU 5068 Harry And Math Teacher

    主题链接~~> 做题情绪:的非常高深,有种高大上的感觉. 解题思路: 两层之间的联通能够看成是一个矩阵  代表上下两层都能够联通,,代表下层第1个门与上层第一个门不联通,以此类推联通就能够用矩阵 ...