文档流
块级元素独占一行,从上到下依次排列。
行内元素 在 块级元素里从左到右依次排列。知道行尾才换行。
postition (改变元素在文档流中的默认行为)
position有五个值
postion:static (静态定位)
元素的默认值 遵循 文档流
position: relative (相对定位)
-
行为:
- 不脱离文档流: 元素仍然占据它在文档流中的原始空间。其他元素会认为它还在老地方,不会去占据它的位置。
- 可以进行位移: 设置 top, right, bottom, left 属性后,元素会相对于其原始位置进行移动。例如,top: 20px; 会让元素从其原始位置的顶部向下移动 20px。
-
核心用途 (关键!) : 为其后代元素创建一个定位上下文 (Positioning Context) 。当一个子元素的 position 设置为 absolute 时,它会相对于最近的、position 值不为 static 的祖先元素进行定位。relative 是最常用来创建这个“容器”的属性,因为它本身对布局的破坏最小。
postion:absolute(绝对定位)
-
行为:
- 完全脱离文档流: 元素会从文档流中被“抽离”出来。它原来的位置会被后面的元素占据,就好像它从来不存在一样。
- 相对于“定位祖先”定位: 它的位置由 top, right, bottom, left 决定,但这个位置是相对于最近的、已定位的(position 不为 static)祖先元素的。
- 如果没有定位祖先: 如果它的所有祖先元素都是 static (默认值),那么它将相对于初始包含块(通常是 元素,也就是整个浏览器窗口的边缘)进行定位。
-
用途: 图标覆盖在图片上、模态框(弹窗)、下拉菜单、工具提示(Tooltips)。 经典组合:父相子绝 (Parent Relative, Child Absolute)
这是最常见、最重要的布局模式之一。
<div class="parent">
我是父容器 (相对定位)
<div class="child">
我是子元素 (绝对定位)
</div>
</div>
.parent {
position: relative; /* 创建定位上下文,但不影响自身布局 */
width: 300px;
height: 200px;
background-color: lightblue;
border: 1px solid blue;
}
.child {
position: absolute; /* 脱离文档流,相对于 .parent 定位 */
top: 10px; /* 距离 .parent 顶部 10px */
right: 10px; /* 距离 .parent 右侧 10px */
width: 100px;
height: 50px;
background-color: lightcoral;
}
position: fixed (固定定位)
常用于创建不随页面滚动的元素。
-
行为:
- 完全脱离文档流: 和 absolute 一样,
元素不占据任何空间。 - 相对于视口 (Viewport) 定位: 它的定位始终是相对于浏览器窗口的。这意味着即使用户滚动页面,这个元素也会固定在屏幕的同一个位置。
- 完全脱离文档流: 和 absolute 一样,
-
用途: 固定的顶部导航栏、侧边栏、返回顶部按钮、Cookie 同意横幅。
position: sticky (粘性定位)
这是 relative 和 fixed 的混合体,非常实用。
-
行为:
- 初始状态像 relative: 在正常情况下,元素遵循文档流,就像一个 relative 元素一样。
- 滚动到阈值时像 fixed: 当页面滚动,元素到达了由 top, right, bottom, left 定义的阈值时,它就会“粘”在那个位置,表现得像 fixed 一样,相对于其最近的滚动容器固定。
-
注意: sticky 的粘性效果只在其父元素(或更上层的滚动容器)的区域内有效。如果父元素滚出屏幕,粘性元素也会跟着消失。
-
用途: 网站文章中的粘性侧边栏、长表格的表头、按字母排序列表的标题。
类比: 你在参加一个游行队伍 (relative),当你走到主席台前时 (top: 0 的阈值),你会停下来,站在原地向主席台致意 (fixed),直到你的整个队伍都走过主席台,你才跟着队伍离开。
.sticky-header {
position: sticky;
top: 0; /* 当元素的顶部接触到视口顶部时,开始“粘住” */
background-color: white;
padding: 10px;
z-index: 100; /* 确保它在其他内容之上 */
}
辅助属性:top, right, bottom, left 和 z-index
-
top, right, bottom, left: 这些属性被称为偏移属性 (offset properties) 。它们只有在 position 值为 relative, absolute, fixed, sticky 时才生效。它们定义了元素边缘相对于其定位参考物的距离。
-
z-index: 当元素定位后(非 static),它们可能会发生重叠。z-index 属性用来控制这些重叠元素的堆叠顺序(Z 轴上的顺序)。
-
z-index 的值是一个整数,可以是正数、负数或 0。
-
值越大,元素越靠上。
-
只有定位元素(position 不为 static)的 z-index 才会生效。
-
z-index 也会受堆叠上下文 (Stacking Context) 的影响,这是一个更高级的概念,通常由设置了 position 和 z-index 的元素、或设置了 opacity、transform 等属性的元素创建。
🧩 一、核心定义
-
position: sticky元素会在 它的最近一个具有滚动容器的祖先元素(或视口) 内,根据设置的top / left / bottom / right偏移值进行“粘附”。
换句话说:
- 在还没到达指定偏移位置之前 → 它表现得像
position: relative; - 一旦滚动到指定位置后 → 它会像
position: fixed一样“固定”,但只在当前滚动容器中有效。
🧭 二、具体来说:
| 偏移方向 | 相对参考对象 |
|---|---|
top / bottom | 相对的是「最近的可滚动容器」的可视区域 |
left / right | 相对的是「最近的可滚动容器」的可视区域 |
🧱 三、例子说明
✅ 情况 1:默认页面滚动(相对于视口)
<div class="sticky top-0 bg-white">
我会吸在页面顶部
</div>
如果没有滚动容器(父级没有设置
overflow),那么它的参照物就是整个浏览器视口。
✅ 情况 2:滚动容器中粘附
<div class="h-[300px] overflow-y-scroll border">
<div class="h-[600px]">
<div class="sticky top-0 bg-gray-100">
我只会粘在这个容器顶部
</div>
</div>
</div>
📌 在这里:
- 外层
div是滚动容器; sticky元素会在这个容器内“粘在”顶部;- 当整个容器滚出屏幕,它就跟着消失了(不会粘在浏览器顶部)。
⚠️ 四、常见误区
-
❌ 父元素设置了
overflow: hidden / auto / scroll- 如果不是用于滚动 sticky 元素本身,这会让 sticky 失效。
-
❌ 没有设置偏移方向(比如
top-0)- 不指定偏移,浏览器不知道何时触发粘附。
-
❌ 父元素高度不足
- 如果父容器的高度不超过 sticky 元素的高度,也不会触发“粘性”效果。
🧠 小总结
| 阶段 | 表现 | 参照对象 |
|---|---|---|
| 没滚到 top 之前 | relative | 正常文档流 |
| 滚动到 top 时 | “固定住” | 滚动容器的可视区域 |
| 滚出滚动容器后 | “消失” | 不再固定 |