当前位置: 首页 > Web前端 > HTML

CSS的Position属性

时间:2023-04-02 13:38:23 HTML

CSS参考手册对position属性的解释:static:对象遵循正常流向。此时,4个定位偏移属性将不会被应用。relative:对象遵循正则流,指的是自身在正则流中的位置,被top、right、bottom、left四个定位偏移属性偏移时,不会影响正则流中的任何元素。absolute:对象不在常规流中。此时,offset属性指的是最近定位的祖先元素。如果没有定位的祖先元素,它将返回到body元素。框的偏移位置不会影响正常流中的任何元素,并且它的边距不会与任何其他边距重叠。fixed:与absolute一致,但offset定位是基于window的。出现滚动条时对象不滚动。对于上面的描述,下面通过几个例子来说明一下,但是你对正则流的第一认识是什么?常规流也称为文档流。常规流程是指元素根据其在HTML中的位置进行排列的过程。主窗体是自上而下,一行一行,每行从左到右。就像搭积木一样,10%到10%,从下到上搭积木(从上到下有规律的流动),很容易理解,它脱离了常规流动,即搭积木不占原来的位置。以下示例的html布局:

默认CSS样式:.div{border:2pxsoliddarkgrey;宽度:400px;高度:400px;margin-top:50px;}div{宽度:100px;高度:100px;border:1pxsoliddarkgreen;}static定位(static):static,没有特殊定位,是html元素默认的定位方式,不会应用4个定位偏移属性。而在上面设置top,right,bottom,left是无效的。相对定位(relative):relative属性跟随正常流,即设置relative属性不会使其脱离文档流。例如,相对于第一个框添加:.d1{border:1pxsolidred;位置:相对;顶部:20px;left:20px;}可以看到下面的框还在原来的位置,第一个框也占据了原来的位置(虚线所在的位置),top和left的位置是相对于parent的容器。好吧,既然我们知道了这个效果,那么如果我们给第一个盒子加上margin/padding会怎样呢?.d1{边框:1px纯红色;位置:相对;边距:10px;填充:10px;顶部:20px;left:20px;}可以看出第一个盒子在加上margin属性后偏离父容器10px,加上之前的top,就是30px,padding属性会让盒子打开10px,位置下面的其他盒子d2和d3也受到影响,它们向下移动了40px!!为什么是40px?可以看到图中的蓝色实线。假设盒子d1没有相对,那么当margin:10px;padding:10px;,整个盒子是否呈现蓝色实线的状态,margin会让d1盒子上下增加10px,padding会让d1盒子的内容上下打开10px,总的d1框偏离40px。这样做的原因是relative属性遵循常规流,并没有脱离文档流,所以margin和padding会影响前后元素的位置。绝对定位(absulte):absolute:对象脱离正常流。给框添加属性:.d1{border:1pxsolidred;位置:绝对;顶部:20px;左:20px;}嗯?d1盒子是怎么跑到父容器外面的,d2和d3盒子的位置也受到了影响,向上移动了d1的高度。原来是我没有给父容器添加position:属性,这也导致了一个absolute的规则:使用absolute定位的元素脱离文档流后,只能根据祖先类元素定位(在父类之上),而这个祖先类也必须以非静态的方式定位。比如a元素使用绝对定位,它会从父类开始,寻找以非静态方式定位的祖先类元素(注意必须是直接祖先),直到标签。所以这个:.div{border:2pxsoliddarkgrey;宽度:400px;高度:400px;顶部边距:50px;position:relative;}.d1{border:1px纯红色;位置:绝对;顶部:20px;left:20px;}这就是框与文档流分离的现象。如果脱离了文档流,就不再占据原来的位置,后面的元素会被推上去填补空白!同理,当给box添加absolute属性,再添加margin/padding,会发生什么?.d1{边框:1px纯红色;位置:绝对;边距:10px;填充:10px;顶部:20px;left:20px;}可以看出d2和d3的盒子先不受影响,而d1的盒子margin:10px;距离父容器10px远,加上之前的top和left是30px,padding会将d1框扩展10px。但是对下面的盒子没有任何影响,原因是绝对的:对象脱离了正常流。固定定位(fixed):fixed:与absolute一致,但offset定位是基于window的。出现滚动条时对象不滚动。所以:.d1{border:1pxsolidred;位置:固定;顶部:20px;left:20px;}顶部和左侧参考窗口!。出现滚动条时对象不滚动。还在原来的位置。最后要注意的一点:如果使用absolute或者fixed定位,必须至少指定left,right,top,bottom属性中的一个,否则left/right/top/bottom属性会使用默认值auto,即相当于相对状态。