CSS布局 -- 定位布局
1.定位布局
1.1 静态定位(Static positioning)
静态定位是所有元素的默认定位方式。
格式:
position:static;
1.2 相对定位(Relative positioning)
- 什么是相对定位?
相对定位就是相对于自己以前在标准流中的位置来移动。
格式:
position:relative;
/*使用top,right,bottom,left来控制。*/
- 注意点:
- 相对定位是不脱离标准流的,会继续在标准流中占用一份空间。
- 在相对定位中同一个方向上的定位属性只能使用一个。
- 由于相对定位是不脱离标准流的,所以在相对定位中是区分块级元素 / 行内元素 / 行内块级元素。
- 由于相对定位是不脱离标准流的,并且相对定位的元素会占用标准流中的位置,所以当给相对定位的元素设置
margin / padding
等属性时会影响到标准流的布局。
- 应用场景:
- 用于对元素进行微调。
- 配合后面学习的绝对定位来使用。
1.3 绝对定位(Absolute positioning)
- 什么是绝对定位?
绝对定位就是相对于body来定位
格式:
position:absolute;
- 绝对定位参考点
- 规律:默认情况下所有的绝对定位的元素,无论有没有祖先元素,都会以body作为参考点。
- 如果一个绝对定位的元素有祖先元素,并且祖先元素也是定位流,那么这个绝对定位的元素都会以定位流的那个祖先元素作为参考点。
- 只要是这个绝对定位元素的祖先元素都可以
- 指的定位流是指绝对定位/相对定位/固定定位
- 定位流中只有静态定位不行
- 如果一个绝对定位的元素有祖先元素,并且祖先元素也是定位流,而且祖先元素中有很多个元素都是定位流,那么这个绝对定位的元素会以离它最近的那个定位流的祖先元素作为参考点。
- 注意点:
- 绝对定位的元素是脱离标准流的。
- 绝对定位的元素是不区分块级元素 / 行内元素 /行内块级元素。
- 如果一个绝对定位的元素是以body作为参考点,那么其实是以网页首屏的宽度和高度作为参考点,而不是以整个网页的宽度和高度作为参考点。
- 一个绝对定位的元素会忽略祖先元素的padding。
- 绝对定位 – 子绝父相
- 相对定位弊端:相对定位不会脱离标准流,会继续在标准流中占用一份空间,所以不利于布局界面。
- 绝对定位弊端:默认情况下绝对定位的元素会以body作为参考点,所以会随着浏览器的宽度高度的变化而变化。
- 子绝父相:子元素用绝对定位,父元素用相对定位。
- 绝对定位水平居中
只需要设置绝对定位元素的
left:50%;
然后再设置绝对定位元素的margin-left: -元素宽度的一半px;
1.4 固定定位(Fixed positioning)
- 什么是固定定位?
格式:
position:fixed;
固定定位可以让某个盒子不随着滚动条的滚动而滚动。
注意点:
- 固定定位的元素是脱离标准流的,不会占用标准流中的空间。
- 固定定位和绝对定位一样不区分行内 / 块级 / 行内块级。
1.5 粘滞定位(Sticky positoning)
格式:
position:sticky;
- 结合了
position:relative;
和position:fixed;
两种定位功能于一体的特殊定位,适用于一些特殊场景。- 元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。
- 设置了
position:sticky;
的元素并不脱离文档流,仍然保留元素原本在文档流中的位置。
当元素在容器中被滚动超过指定的偏移值时,元素在容器内固定在指定位置。- 如果设置了
top:50px;
,那么在sticky元素到达距离相对定位的元素顶部 50px 的位置时固定,不再向上移动(此时相当于fixed定位)。- 设置
position:sticky
同时给一个(top,bottom,right,left)
之一即可。
- 使用条件
1.父元素不能有
overflow: hidden;
或者overflow: auto;
属性。
2. 必须指定top、bottom、left、right
4个值之一,否则只会处于相对定位。
3. 父元素的高度不能低于sticky元素的高度。
4. sticky元素仅在其父元素内生效。
1.6 z-index
- 什么是
z-index
属性?
- 默认情况下所有的元素都有一个默认的
z-index
属性, 取值是0
.z-index
属性的作用是专门用于控制定位流元素的覆盖关系的。
- 默认情况下定位流的元素会盖住标准流的元素
- 默认情况下定位流的元素后面编写的会盖住前面编写的
- 如果定位流的元素设置了z-index属性, 那么谁的z-index属性比较大, 谁就会显示在上面
注意点:
从父现象
- 如果两个元素的父元素都没有设置z-index属性, 那么谁的z-index属性比较大谁就显示在上 面。
- 如果两个元素的父元素设置了z-index属性, 那么子元素的z-index属性就会失效, 也就是说 谁的父元素的z-index属性比较大谁就会显示在上面。