css的postition

59 阅读6分钟

文档流

块级元素独占一行,从上到下依次排列。

行内元素 在 块级元素里从左到右依次排列。知道行尾才换行。

postition (改变元素在文档流中的默认行为

position有五个值

postion:static (静态定位)

元素的默认值 遵循 文档流

position: relative (相对定位)

  • 行为:

    1. 不脱离文档流: 元素仍然占据它在文档流中的原始空间。其他元素会认为它还在老地方,不会去占据它的位置。
    2. 可以进行位移: 设置 top, right, bottom, left 属性后,元素会相对于其原始位置进行移动。例如,top: 20px; 会让元素从其原始位置的顶部向下移动 20px。
  • 核心用途 (关键!) : 为其后代元素创建一个定位上下文 (Positioning Context) 。当一个子元素的 position 设置为 absolute 时,它会相对于最近的、position 值不为 static 的祖先元素进行定位。relative 是最常用来创建这个“容器”的属性,因为它本身对布局的破坏最小。

postion:absolute(绝对定位)

  • 行为:

    1. 完全脱离文档流: 元素会从文档流中被“抽离”出来。它原来的位置会被后面的元素占据,就好像它从来不存在一样。
    2. 相对于“定位祖先”定位: 它的位置由 top, right, bottom, left 决定,但这个位置是相对于最近的、已定位的(position 不为 static)祖先元素的。
    3. 如果没有定位祖先: 如果它的所有祖先元素都是 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 (固定定位)

常用于创建不随页面滚动的元素。

  • 行为:

    1. 完全脱离文档流: 和 absolute 一样,元素不占据任何空间
    2. 相对于视口 (Viewport) 定位: 它的定位始终是相对于浏览器窗口的。这意味着即使用户滚动页面,这个元素也会固定在屏幕的同一个位置。
  • 用途: 固定的顶部导航栏、侧边栏、返回顶部按钮、Cookie 同意横幅。

position: sticky (粘性定位)

这是 relative 和 fixed 的混合体,非常实用。

  • 行为:

    1. 初始状态像 relative: 在正常情况下,元素遵循文档流,就像一个 relative 元素一样。
    2. 滚动到阈值时像 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 元素会在这个容器内“粘在”顶部;
  • 当整个容器滚出屏幕,它就跟着消失了(不会粘在浏览器顶部)。

⚠️ 四、常见误区

  1. 父元素设置了 overflow: hidden / auto / scroll

    • 如果不是用于滚动 sticky 元素本身,这会让 sticky 失效。
  2. 没有设置偏移方向(比如 top-0

    • 不指定偏移,浏览器不知道何时触发粘附。
  3. 父元素高度不足

    • 如果父容器的高度不超过 sticky 元素的高度,也不会触发“粘性”效果。

🧠 小总结

阶段表现参照对象
没滚到 top 之前relative正常文档流
滚动到 top 时“固定住”滚动容器的可视区域
滚出滚动容器后“消失”不再固定