30. 定位 {ignore}
[toc]
0. 前言
视觉格式化模型,大体上将页面中盒子的排列分为三种方式:
- 常规流
- 浮动:float
- 定位:position
定位是我们所要学习的视觉格式化模型的最后一个组成部分,学习完定位的相关知识,css基础部分也就结束了。
定位的作用:手动控制元素在包含块中的精准位置。
- 相关优质文章:CSS 定位详解 阮一峰:https://www.ruanyifeng.com/blog/2019/11/css-position.html
1. position属性
- 默认值:static,静态定位(不定位)
- relative:相对定位
- absolute:绝对定位
- fixed:固定定位
一个元素,只要position的取值不是static,认为该元素是一个定位元素。
定位元素会脱离文档流(相对定位除外)。
文档流,即:常规流,Normal Flow
一个脱离了文档流的元素:
- 文档流中的元素摆放时,会忽略脱离了文档流的元素
- 文档流中元素计算自动高度时,会忽略脱离了文档流的元素
2. 相对定位
不会导致元素脱离文档流,只是让元素在原来位置上进行偏移。
可以通过四个CSS属性对设置其位置:
- left
- right
- top
- bottom
原始位置依旧被占据,并不会因为偏移,而释放原来占的那块位置,即:盒子的偏移不会对其他盒子造成任何影响。
- 如果同时设置了 left 和 right,那么,以 left 为准;
- 如果同时设置了 top 和 bottom,那么,以 top 为准;
3. 绝对定位
- 如果不定义宽高的话,那么宽高为auto,适应内容。
包含块变化:找祖先中第一个定位元素,该元素的填充盒为其包含块。若找不到,则它的包含块为整个网页(整个网页,又称为:初始化包含块)。
- 定位元素:指的是 position 属性值不为 static 的元素。
- 填充盒:padding-box
绝对定位的关键:找包含块。
4. 固定定位
和绝对定位对比,只有包含块不同:固定为视口(浏览器的可视窗口)。其他情况和绝对定位完全一样。
视口和初始化包含块(整个网页)的区别:视口指的是整个网页中我们所能看到的部分,而初始化包含块指的是整个网页。
5. 定位下的居中
某个方向居中:
- 定宽(高)
- 将左右(上下)距离设置为0
- 将左右(上下)margin设置为auto
绝对定位和固定定位中,margin为auto时,会自动吸收剩余空间
6. 多个定位元素重叠时
设置z-index,通常情况下,该值越大,越靠近用户
注意:只有定位元素设置z-index才有效。
z-index可以是负数,如果是负数,则遇到常规流、浮动元素,则会被其覆盖。
这一部分还与 堆叠上下文 有关,堆叠上下文会放到拓宽课程来讲。
7. 补充
- 绝对定位、固定定位元素一定是块盒
绝对定位、固定定位元素一定不是浮动
- 盒子不可能即定位又浮动
- 没有外边距合并
- 目前 position 的属性值,又多了一个 sticky,具体内容可以查看 阮一峰老师的 CSS定位详解
小结
- 定位元素会脱离文档流(Normal Flow)。
- 文档流中的元素看不到定位元素。
相对定位的元素
- 是相对于自身进行偏移;
- 原始位置所占据的空间并不会释放;
绝对定位的元素
- 如果高度和宽度没有设置,那么将适应内容;
- 包含块是就近的定位祖先元素的填充盒;
- 若祖先元素中不存在定位元素,那么包含块是整个网页(初始化包含块);
固定定位的元素
- 包含块是视口区域
- 其他方面和绝对定位元素相同
定位元素居中显示
- 前提得是 absolute 或 fixed 定位;
- 尺寸固定,且 4 个方向都设置为 0;
- margin 设置为 auto
- 多个定位元素重叠时,可以使用 z-index 属性来设置它们的显示靠前还是靠后。