转载博客地址:http://www.jb51.net/web/77495.html
position:relative 对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。而其层叠通过z-index属性定义。
position:absolute:对象脱离正常文档流,使用top,right,bottom,left等属性进行绝对定位。而其层叠通过z-index属性定义。
position:fixed:对象脱离正常文档流,使用top,right,bottom,left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。而其层叠通过z-index属性定义。
文档流:将窗体自上而下分成一行行,并在每行中按从左到右的顺序排放元素,即为文档流。
使元素脱离文档流的情况:浮动 绝对定位
(1)静态定位(static)
无特殊定位,它是html元素默认的定位方式,即不设置元素的position属性时默认的position值就是static,它遵循正常的文档流对象,对象占据文档空间。该定位方式下,top,right,bottom,left,z-index属性是无效的。
(2)相对定位(relative)
首相要弄清楚相对定位的“相对”的意思,这里的相对是相对什么呢?用下面一个简单的例子来说明:
初始定位:
初始原图:
修改first元素的position属性
<span style="white-space:pre"> </span>.first{
width:200px;
height:100px;
border:1px solid red;
position:relative;
top:20px;
left:20px;
}
.second{
width:200px;
height:100px;
border:1px solid blue;
}
偏移20px后:
虚线是初始的位置
从图中可以看出,相对定位相对的是它原本在文档流中的位置而进行的偏移,relative定位也是遵循了正常的文档流,它没有脱离文档,但是它的top/right/bottom/left是生效的,它还占有文档空间,并且占据的文档空间不会随top/right/bottom/left等属性的偏移而发生移动,就是说它后面的元素是依据虚线位置(top/left/right/bottom)进行定位,这一点和很重要。
添加margin属性
<span style="white-space:pre"> </span>.first{
width:200px;
height:100px;
border:1px solid red;
position:relative;
top:20px;
left:20px;
margin:20px;
}
.second{
width:200px;
height:100px;
border:1px solid blue;
}
设置margin:20px后:
将first外边距设置为20px后,second就会向下偏移40px, 注意这里的second不受 first经过设置top和left的影响,只是受到了margin的影响,例如,将first 的top设置为30px,那么显示的效果如下:
(3)绝对定位
使用absolute定位的元素脱离文档流之后,就只能根据祖先元素(父类以上)进行定位,并且这个祖先的类必须是posiiton为非static方式定位的,例如,a元素使用absolute定位,它会从父类找起,寻找以position非static方式定位的祖先类元素(一定是直系祖先),直到<html>标签为止。注意,relative和static方式在最外层时是以<body>标签为定位远点的,而absolute方式在无父级是position非static定位时是以<html>作为远点的。<html>和<body>元素相差9px左右。
添加absolute属性
<span style="white-space:pre"> </span>.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;
}
效果图:
注意这里的::top:0; left:0;属性是必须添加的。
如果使用absoulte或fixed定位的话,必须指定 left、right、 top、 bottom 属性中的至少一个,否则left/right/top/bottom属性会使用它们的默认值 auto ,这将导致对象遵从正常的HTML布局规则,在前一个对象之后立即被呈递,简单讲就是都变成relative,会占用文档空间,这点非常重要,很多人使用absolute定位后发现没有脱离文档流就是这个原因,这里要特别注意。
不添加top:0; left:0;效果图如下:
在absolute定位中添加margin/padding属性
<span style="white-space:pre"> </span>first{
width:200px;
height:100px;
border:1px solid red;
position:relative;
margin:40px;
padding:40px;
}
.second{
width:200px;
height:100px;
border:1px solid blue;
position:absolute;
top:20px;
left:20px;
}
效果图:
祖先类的margin会让子类的absolute跟着偏移,而padding却不会让子类的absolute发生偏移。absolute是根据祖先类的border进行定位的。
注意 : 绝对(absolute)定位对象在可视区域之外会导致滚动条出现。而放置相对(relative)定位对象在可视区域之外,滚动条不会出现
(4)固定定位(fix)
它和absoult定位一样,都脱离了文档流,并且能够根据top、right、left、bottom属性进行定位,但不同的是fixed是根据窗口为原点进行偏移定位的,也就是说它不会根据滚动条的滚动而进行偏移。
z-index属性:
z-index,又称为对象的层叠顺序,它用一个整数来定义堆叠的层次,整数值越大,则被层叠在越上面,当然这是指同级元素间的堆叠,如果两个对象的此属性具有同样的值,那么将依据它们在HTML文档中流的顺序层叠,写在后面的将会覆盖前面的。需要注意的是,父子关系是无法用z-index来设定上下关系的,一定是子级在上父级在下。
注意:使用static 定位或无position定位的元素z-index属性是无效的。