css中position的四中属性

130 阅读3分钟

1.static

无特殊定位,对象遵循正常的文档流。top,right,bottom,left等属性不起作用

2.relative

对象遵循正常的文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。而其层叠通过z-index

3.absolute

对象脱离正常文档流,使用top,right,bottom,left等属性进行绝对定位。而其层叠通过z-index

4.fixed

对象脱离正常文档流,使用top,right,bottom,left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。而其层叠通过z-index

什么是文档流?

将窗体自上而下分成一行行,并在每行中按从左至右的顺序排放元素,即为文档流。 只有三种情况会使得元素脱离文档流,分别是:浮动,绝对定位和相对定位。

静态定位(static)

它是html元素默认的定位方式,即使我们不设定元素的position属性是默认的position值就是static,它遵循正常的文档流对象,对象占用文档空间,该定位方式下,top,right,bottom,left,z-index等属性是无效的。

相对定位(relative)

从字面上看,其主要特性:相对。但是它相对的是什么呢,这是个重点,做个测试,大家就会明白了:

<style type="text/css"> 
#first { width: 200px; height: 100px; background: red; position: relative; top: 20px; left: 20px;} 
#second{ width: 200px; height: 100px; background: blue;} 
</style> 
<body> 
    <div id="first"> first</div> 
    <div id="second">second</div> 
</body>

相对定位相对的是它原本在文档流中的位置而进行的偏移,而我们也知道relative定位也是遵循正常的文档流,它没有脱离文档流,但是它的top/left/right/bottom属性是生效的,可以说它是static到absolute的一个中间过渡属性,最重要的它还占有文档空间,而且占据的文档空间不会随top/right/left/bottom等属性的偏移而发生变动 top/right/left/bottom属性是不会对relativ定位的元素所占据的文档空间产生偏移,那么margin/padding会让该文档空间产生偏移吗?答案是一定的,自己动手试一下

绝对定位(absolute)

使用absolute定位的元素脱离文档流后,就只能根据祖先类元素(父类以上)进行定位,而这个祖先类还必须是position非static方式定位的,eg:p元素使用absolute定位,它会从父类开始找起,寻找以position非static方式定位的祖先类元素(注意,一定要是直系祖先才算)直到html为止,这里还需要注意的是,relative和static方式在最外层是以body标签为定位原点的而absolute方式在无父级是position非static定位时是以html作为原点定位

<html> 
<style type="text/css"> 
    html{border:1px dashed green;} 
    body{border:1px dashed purple;} 
    #first{ width: 200px;height: 100px;border: 1px solid red;position: relative;} 
    #second{ width: 200px;height: 100px;border: 1px solid blue;position: absolute;top :0;left : 0;} 
</style> 
<body> 
    <div id="first">relative</div> 
    <div id="second">absoult</div> 
</body> 
</html> 

在absolute定位中添加margin/padding属性:

祖先类的margin会让子类的absoulte跟着偏移,而padding却不会让子类的absoulte发生偏移。总结一下,就是absoulte是根据祖先类的border进行的定位