对CSS中的Position、Float属性的一些探讨

Position属性:

由于Position属性可以很好的体现HTML普通流这个特征。重点在于应用了不一样的position值以后是否有脱离普通流和改变Display属性这两点。Position的属性值共有四个static、relative、absolute、fixed。 css


Static

全部元素在默认的状况下position属性均为static,而咱们在布局上常常会用到的相对定位和绝对定位经常使用的属性top、bottom、left、right在position为static的状况下无效。其用法为:在改变了元素的position属性后能够将元素重置为static让其回归到页面默认的普通流中。 html


Relative

俗称的相对定位,重点在于对相对理解。咱们此前说过每一个元素在页面的普通流中会有“占用”一个位置,这个位置能够理解为默认位置,而相对定位就是将元素偏离元素的默认位置,普通流中依然保持着原有的默认位置,并无脱离普通流,只是视觉上发生的偏移。
咱们先用块状元素来作个示例: 浏览器


<style type="text/css">
div{ width: 100px; height: 50px; line-height: 50px; text-align: center; color: #fff; }
</style>
<div style="background: blue">A</div>
<div style="background: red; position: relative; top: 20px; left: 20px;">B</div>
<div style="background: green">C</div>




咱们再来看看行内元素(在这里用你们最经常使用的span来作示例) 布局


<style type="text/css">
strong { background: #808080; }
em { background: #ffd800; }
span { background: #b6ff00; position: relative; top: 10px; left: 10px; width: 100px; }
</style>
<strong>strong</strong><em>em</em><span>span</span>




请注意看,在这里我是有对span进行width属性的赋值(为100px)。可是咱们能够看到span在运用了relative这个position属性值后,依然对width属性无效,换而言之,position: relative并无改变行内元素的Display属性,这个概念很是重要(注意与接下来的absolute的区别) 性能


Absolute

俗称的绝对定位,绝对定位是相对而言的,怎么理解呢?应用了position: absolute的元素会循着节点树中的父(祖)元素来肯定“根”,而后相对这个“根”元素来偏移。若是在其节点树中全部父(祖)元素都没有设置position属性值为relative或者absolute则该元素最终将对body进行位置偏移。应用了position: absolute的元素会脱离页面中的普通流并改变Display属性(重点)spa

咱们先用一个默认嵌套的DIV来作示例: code


<body style="background: yellow;">
    <div style="background: #fff">
        A
        <div style="background: #81b6ff">
            A - 1
            <div style="background: #b6ff00;">
                A - 2
            </div>
        </div>
    </div>
</body>




能够看到(A-2)最终是根据body来产生了位移,让咱们对比分别设置一下父元素position。 htm


从上面的图,咱们能够总结如下几个结论。 图片

1)块状元素在position(relative/static)的状况下width为100%,可是设置了position: absolute以后,会将width变成auto(会受到父元素的宽度影响)。 it

2)元素设置了position: absolute以后,若是没有设置top、bottom、left、right属性的话,浏览器会默认设置成auto,而auto的值则是该元素的“默认位置”。即设置position: absolute先后的offsetTop和offsetLeft属性值不变。
特殊状况:

  • Firefox的话会直接将top、left设置成offsetTop和offsetLeft的值而非auto。
  • IE7下的表现更相似于float,会附加到父元素的末尾。



一些的position小知识

1)应用了position: relative/absolute的元素,margin属性仍然有效,以position:relative来举例。若是设置了left、top、bottom、right的属性,建议你们不要设置margin数据,由于很难精确元素的定位,尽可能减小干扰因素。


2)position: absolute忽略根元素的padding。


<div id="a" style="background: #fff; width: 200px;">A
    <div id="b" style="background: #81b6ff; width: 150px; position: relative; padding-top: 100px;">A - 1
        <div id="c" style="background: #b6ff00; position: absolute; left: 0; top: 0">A - 2
        </div>
    </div>
</div>





<!-- 解决方案,父元素设置一个更大的z-index值便可 -->
<div style="z-index: 2;">
  a
    <div style="position: relative; z-index: 1;">
      b
    </div>
</div>



4)行内元素在应用了position:absolute以后会改变display。



<span style="position: absolute; width: 100px; height: 100px; top: 10px; left: 10px; background: #fff;">
        个人display属性由inline变成了block
</span>




所以,要注意到relative是并无改变行内元素的呈现模式,而absolute是会改变行内元素的呈现模式,若是设置了absolute并不须要显式的的将元素display改为block。

5)应用了position: absolute / relative以后,会覆盖其余非定位元素(即position为static的元素),若是你不想覆盖到其余元素,也能够将z-index设置成-1。


Fixed

在很长的时间里,这个属性值由于兼容性问题,并无获得很是普遍的应用(IE6未实现该属性值)。fixed和absolute有不少共同点:

  1. 会改变行内元素的呈现模式,使display之变动为block。
  2. 会让元素脱离普通流,不占据空间。
  3. 默认会覆盖到非定位元素上。

fixed与absolute最大的区别在于:absolute的”根元素“是能够被设置的,而fixed则其”根元素“固定为浏览器窗口。即当你滚动网页,其元素与浏览器窗口之间的距离是恒定不变的。



Float属性

float的属性值有none、left、right,有几个要点:

  1. 只有横向浮动,并无纵向浮动。
  2. 当元素应用了float属性后,将会脱离普通流,其容器(父)元素将得不到脱离普通流的子元素高度。
  3. 会将元素的display属性变动为block。
  4. 浮动元素的后一个元素会围绕着浮动元素(典型运用是文字围绕图片),与应用了position的元素相比浮动元素并不会遮盖后一个元素。
  5. 浮动元素的前一个元素不会受到任何影响(若是你想让两个块状元素并排显示,必须让两个块状元素都应用float)




与position的兼容性问题

1)元素同时应用了position: relative、float、(top / left / bottom / right)属性后,则元素先浮动到相应的位置,而后再根据(top / left / bottom / right)所设置的距离来发生偏移。


<div style="position:relative; float:right; left:50px; top:10px;">div</div>






左图中的div是没有设置top、left值的,而右边则设置了50px的偏移。

2)元素同时应用了position: absolute及float属性,则float失效

<div style="position: absolute; right:10px; top: 10px; float: left;"> 我是一个应用了position:absolute和float:left的DIV,不过我仍是在浏览器的右边,没有浮动到左边。 </div>


3)第一个元素应用了position以后会覆盖着接下来的float元素(若是两个元素所处的位置相同)


<div style="position: absolute; left:10px; top: 10px;"> 我是一个应用了position:absolute的DIV。 </div> <div style="float:left; background: red; width: 300px; height: 150px; "> 我是float:left的DIV </div>


回顾:若是你不将float的元素的position设置成relative的话,你想经过设置float元素的z-index来的达到覆盖position:absolute是无效的。同理,float元素下面存在position: absolute的子元素,若是你不将float的元素的position设置成relative的话,absolute元素是不会定位到float元素的。

4)同时应用position: absolute和float: left会致使清除浮动无效(position: relative则能够清除浮动)。
经常使用的清除浮动的方法有两种:

  1. 经过在容器中添加一个标签,设置该标签的样式为 clear: both
  2. 容器设置overflow: hidden
<div style="background: #fff; width: 100%; overflow: hidden;"> <div style="float: left; position: absolute;">我是DIV</div> <div style="clear: both;"></div> <div>
相关文章
相关标签/搜索