面试题:CSS 的 position 有哪些属性值,区别是什么?

position 是 CSS 中控制元素定位的核心属性,它决定了元素如何在页面中放置。共有 5 个标准属性值,每个都有独特的定位行为。


1. static (默认值)

  • 行为
    • 元素按照正常的文档流(Normal Document Flow)进行布局。
    • top, right, bottom, left, z-index 等偏移和层叠属性完全无效
    • 元素在文档中占据其应有的空间。
  • 特点
    • 这是所有元素的默认定位方式
    • 不脱离文档流。
  • 使用场景:绝大多数普通内容元素。
.element {
    position: static; /* 通常不需要显式声明 */
}

2. relative (相对定位)

  • 行为
    • 元素仍在正常的文档流中,占据原有空间。
    • 可以通过 top, right, bottom, left 属性相对于其自身原本的位置进行偏移。
    • 偏移后,元素原来的位置仍然被占据,不会影响其他元素的布局(可能会造成重叠)。
  • 特点
    • 不脱离文档流。
    • absolute 定位的参照物(如果祖先元素是 relativeabsolute 元素会相对于它定位)。
  • 使用场景
    • 微调元素位置。
    • absolute 子元素创建定位上下文。
.relative {
    position: relative;
    top: 10px; /* 向下移动 10px */
    left: 20px; /* 向右移动 20px */
}

3. absolute (绝对定位)

  • 行为
    • 元素完全脱离文档流,不占据任何空间。
    • 通过 top, right, bottom, left 相对于最近的已定位祖先元素(即 positionrelative, absolute, fixed, sticky 的祖先)进行定位。
    • 如果没有这样的祖先,则相对于初始包含块(通常是 <html> 元素或视口)。
  • 特点
    • 脱离文档流。
    • 后续元素会“上移”填补其位置。
    • 会创建新的层叠上下文(配合 z-index)。
  • 使用场景
    • 模态框(Modal)、下拉菜单、工具提示(Tooltip)。
    • 精确定位的装饰元素。
.absolute {
    position: absolute;
    top: 50px;
    left: 50px; /* 相对于最近的已定位祖先 */
}

4. fixed (固定定位)

  • 行为
    • 元素完全脱离文档流,不占据任何空间。
    • 通过 top, right, bottom, left 相对于浏览器视口 (Viewport) 进行定位。
    • 元素固定在屏幕的某个位置不随页面滚动而移动
  • 特点
    • 脱离文档流。
    • 定位参照物是视口,不受任何祖先元素影响(现代浏览器中即使祖先有 transform 也如此)。
  • 使用场景
    • 固定导航栏(Sticky Header)。
    • 返回顶部按钮。
    • 固定侧边栏或广告。
.fixed {
    position: fixed;
    top: 0;
    right: 0; /* 固定在视口右上角 */
}

5. sticky (粘性定位)

  • 行为
    • 表现为 relativefixed 的结合体。
    • 在元素位于其父容器内时,表现为 relative(随页面滚动)。
    • 当滚动到特定阈值(由 top, bottom 等指定)时,表现为 fixed“粘”在视口的指定位置
    • 当父容器即将滚出视口时,元素会停止“粘住”,随父容器一起滚动。
  • 特点
    • 必须设置 top, bottom, left, 或 right 才能生效。
    • 父容器不能有 overflow: hiddenoverflow: auto(可能阻止生效)。
    • 不脱离文档流(在“粘住”前)。
  • 使用场景
    • 表格表头随滚动而固定。
    • 导航选项卡“吸顶”效果。
.sticky {
    position: sticky;
    top: 0; /* 滚动到距顶部 0px 时开始“粘住” */
}

对比总结表

属性值脱离文档流定位参照物是否随滚动移动常见用途
static默认布局
relative自身原位置微调、创建定位上下文
absolute最近的已定位祖先弹窗、下拉菜单
fixed浏览器视口固定导航、返回按钮
sticky❌ (部分)视口 (触发后)部分吸顶标题、表头

面试加分点

  1. position: sticky 的陷阱:父元素的 overflow 属性会阻止 sticky 生效。
  2. transformfixed:在旧版浏览器中,transform 会改变 fixed 的参照物,但现代浏览器已修正。
  3. 层叠上下文absolute, fixed, sticky(配合 z-index)都会创建新的层叠上下文。
  4. float 的关系absolutefixed 会忽略 float,且会强制修改 display 的计算值。

掌握这 5 个值的区别,是精通 CSS 布局的基础。

THE END
喜欢就支持一下吧
点赞14 分享