脱离文档流之 float 和 position:absolute的区别

  • 下面一篇文章很详细的讲解了浮动和定位脱离文档流的方式http://www.tuicool.com/articles/IBJvyy7
所谓的文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列。并最终窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素。脱离文档流即是元素打乱了这个排列,或是从排版中拿走。脱离文档流的元素有个标志:没有实际高度。 脱离文档流的元素都是块级元素。
A.定位position
脱离文档流之 float 和 position:absolute的区别_第1张图片
结论:
1.static定位不脱离文档流,设置left/top/right/bottom没有作用(别人也不能相对他进行top/left/right/bottom定位),对margin/padding敏感。
【证据:#bigest定位left没有其作用】可以点击链接看文章中的例子
2.父子节点都是没有脱离文档的两种定位(static、relative)的外边距(margin)会合并(垂直外边距合并) ,显示效果以最大的那个外边距为准。
2.1: 当然,这是在没有内边距影响的情况下。如果有内边距影响,那么子元素的外边距会基于父元素的内边距来偏移。如我们设置#big{ padding-top:  10px;}属性后,#nomal的margin-top是在#big的padding-top开始偏移的.
2.2: 块级元素的垂直相邻外边距会合并,而 行内元素实际上不占上下外边距。行内元素的的左右外边距不会合并。同样地,浮动元素的外边距也不会合并。允许指定负的外边距值,不过使用时要小心。 可见行内元素对定位top/right/bottom/left、宽高width/height、外边距margin不敏感,对边框border和内边距padding敏感。
  
块级元素,块级行内元素
行内元素
浮动之后
padding 内边距 留白
border 边框
margin外边距  
无(如果设为float或者absolute就当做块级行内元素处理,所以可以有)
margin外边距是否会合并(选取最大外边距)
否,因为无margin(对其不敏感)
否,
宽高
无(如果设为float或者absolute就当做块级行内元素处理,所以可以有)
2.3:还有一点:脱离文档流的元素都是块级元素。
2.4: 在使用脱离文档流的定位的时候最好使用 "left", "top", "right" 以及 "bottom" 属性对元素的位置进行规定。否则可能出现不良情况
设置了top,top相对于body元素定位,可以预期。
3.absolute生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。static是定位的默认值
因为static定位是无法使用left/top/right/bottom设置位置的,static定位的元素应当和他们的父节点的边重合(在不考虑其他因素的情况下,比如外边距margin)。

第一种,元素的某条边 没有 设置定位属性(left/top/right/bottom)的时候(默认值为auto),这一边就会将absolute块(包括外边距)按流式布局来排列(如实验1结果所示),当然这个流式布局就会受到内边距padding的影响了。
第二种,元素的某条边 设置了 定位属性(left/top/right/bottom)的时候(默认值是auto),这一边就会被作为脱离文档流的边来处理,会相对于 static 定位以外的第一个父元素(的边框)进行定位,如果这时候设置了外边距,那么这一边相对于基准元素的偏移=定位值(left/top/right/bottom)+ 外边距。效果如实验2所示。作为脱离文档流来处理的边是基于那个基准元素的边框来定位的,当然不受内边距padding的影响。
4.fix定位可以看成一种特殊的绝对定位,absolute的基准元素是 static 定位以外的第一个父元素,而fix的基准元素是浏览器窗口。absolute定位结果分两种情况对于fix来说同样适用。

5.因为absolute相对于 static 定位以外的第一个父元素进行定位,所以一般要对某个元素absolute定位,则设置其父元素为relative即可。避免无法预知的基准元素。

6.强烈建议脱离文档流的定位absolute的元素不要在其内部包含有脱离文档流(fixed,absolute)的元素存在。
举一个例子,某个iframe中内容会不断增高或缩小,但是iframe不能有自己的滚动条,需要同步增高或减少父窗口和iframe的高度使得滚动父窗口滚动条滚动显示iframe的内容。这个时候,需要计算iframe中body内容真实的高度(这个高度不能使用$(document).height()来获得, 看这篇文章最后总结中document总结的IE部分 ,获取的不一定是body内容的真实高度),对于脱离文档流的元素需要自己计算高度,而脱离文档流的元素a中还包含脱离a的元素b,咋搞哦。所以才有这里的建议。

7. 对使用absolute脱离文档流的的元素如果做到让absolute元素后面的元素自适应布局?一般使用margin定位后面的元素来处理。
 
   


这个东东是position:absolute
#left绝对定位宽度是100,那么只要使#right  margin-left: 110px; 这样空出#left的显示空间即可。#right的自适应照常使用。
8. relative没有脱离文档流
如果原来不明白为什么,就有必要看这个例子。relative:相对定位,参造物是其本身,并不脱离文档流,不管你怎么移动,它原有的位置还是会留着。不仅如此,脱离文档流的元素相当于自身生成了一个新的文档流,父容器对其没有布局上的影响(最多是定位的影响)。但是relative却不是,父容器对其布局影响照旧。
relative在堆叠优先级上和fixed、absolute一样,要比兄弟节点中static节点要高 。
  
B.float
float 属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使 文本围绕 在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。文字之所以会环绕含有float属性的图片时因为浮动破坏了正常的line boxes以下对于lines boxes理解,参考http://www.zhangxinxu.com/wordpress/?p=583
在目前的CSS的世界中,所有的高度都是有两个CSS模型产生的,一个是box盒状模型,对应CSS为”height+padding+margin”,另外一个是line box模型,对应样式为”line-height”。前者的height属性分为明显的height值和隐藏的height值,所谓隐藏的height值是指图片的高度,一旦载入一张图片,其内在的height值就会起作用,即使您看不到”height”这个词。而后者针对于文字等这类inline boxes的元素(图片也属于inline boxes,但其height比line-height作用更凶猛,故其inline boxes高度等于其自身高度,对line-height无反应),inline boxes的高度直接受line-height控制(改变line-height文字拉开或重叠就是这个原因),而真正的高度表现则是由每行众多的inline boxes组成的line boxes(等于内部最高的inline box的高度),而这些line boxes的高度垂直堆叠形成了containing box的高度,也就是我们见到的div或是p标签之类的高度了。所以,对于line box模型的元素而言,没有inline boxes,就没有高度了,而浮动却恰恰做了这么龌龊的事情,其直接将元素的inline boxes也破坏了,于是这些元素也就没有了高度。
  1. 如果浮动非替换元素(这些是替换元素