前端 & AI 面试题库
Css

CSS 定位方式

CSS 中的定位方式有哪些?

核心答案

CSS 定位(Positioning)用于控制元素在页面中的位置。position 属性有五个值:staticrelativeabsolutefixedsticky

五种定位方式

1. static(静态定位,默认值)

  • 特点:元素按照正常文档流排列
  • 定位属性无效toprightbottomleftz-index 无效
  • 使用场景:默认状态,无需特殊定位
.element {
  position: static; /* 默认值,可省略 */
}

2. relative(相对定位)

  • 特点:相对于自身原始位置进行偏移
  • 文档流:保留原始空间,不影响其他元素
  • 定位参考:使用 toprightbottomleft 相对于原位置偏移
.element {
  position: relative;
  top: 10px;    /* 向下移动 10px */
  left: 20px;   /* 向右移动 20px */
}

应用场景

  • 微调元素位置
  • 作为 absolute 定位的参考点

3. absolute(绝对定位)

  • 特点:相对于最近的已定位祖先元素(非 static)定位
  • 文档流:脱离文档流,不占据空间
  • 定位参考:如果没有已定位祖先,则相对于 <body> 定位
.parent {
  position: relative; /* 作为定位参考 */
}
.child {
  position: absolute;
  top: 0;
  right: 0;         /* 定位到父元素右上角 */
}

应用场景

  • 弹出层、下拉菜单
  • 图标、标签定位
  • 复杂布局中的元素定位

4. fixed(固定定位)

  • 特点:相对于浏览器视口定位,滚动时位置不变
  • 文档流:脱离文档流,不占据空间
  • 定位参考:始终相对于视口
.header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;      /* 固定在顶部 */
  z-index: 1000;
}

应用场景

  • 固定导航栏、侧边栏
  • 返回顶部按钮
  • 固定提示框

5. sticky(粘性定位)

  • 特点:在滚动到阈值前是 relative,之后变为 fixed
  • 文档流:正常占据空间
  • 定位参考:相对于最近的滚动祖先
.sticky-header {
  position: sticky;
  top: 0;           /* 滚动到顶部时固定 */
  z-index: 100;
}

应用场景

  • 表格标题行固定
  • 导航栏滚动时固定
  • 分类标题固定

定位属性

  • top:距离顶部的距离
  • right:距离右侧的距离
  • bottom:距离底部的距离
  • left:距离左侧的距离
  • z-index:控制层叠顺序(仅对定位元素有效)

延伸追问

1. 相对定位和绝对定位的区别是什么?

回答:核心区别:

特性relativeabsolute
定位参考自身原始位置最近的已定位祖先
文档流保留空间脱离文档流
影响其他元素不影响不影响(占据空间消失)
使用场景微调位置精确定位

示例

/* relative:保留空间,相对于原位置偏移 */
.relative {
  position: relative;
  top: 10px;  /* 向下移动,但原位置仍占据空间 */
}

/* absolute:脱离文档流,相对于父元素定位 */
.absolute {
  position: absolute;
  top: 10px;  /* 定位到父元素顶部 10px 处 */
}

2. z-index 的工作原理是什么?

回答z-index 控制元素的层叠顺序,值越大越在上层。

规则

  1. 仅对定位元素(非 static)有效
  2. 在同一层叠上下文中比较
  3. 创建新的层叠上下文:position + z-indexopacity < 1transform

示例

.layer1 { position: relative; z-index: 1; }
.layer2 { position: relative; z-index: 2; }  /* 在上层 */
.layer3 { position: relative; z-index: 3; }  /* 最上层 */

3. 如何实现元素居中?

回答:多种方法:

方法1:绝对定位 + transform

.center {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

方法2:绝对定位 + margin

.center {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  width: 200px;
  height: 100px;
}

方法3:Flexbox(推荐)

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}

4. position: sticky 不生效的原因?

回答:常见原因:

  1. 父元素 overflow:父元素设置了 overflow: hiddenoverflow: auto
  2. 没有设置 top/bottom/left/right:必须设置至少一个定位属性
  3. 父元素高度不够:sticky 元素需要在滚动容器内
  4. 浏览器兼容性:旧浏览器不支持

解决方案

.sticky {
  position: sticky;
  top: 0;              /* 必须设置 */
  z-index: 100;
}

.parent {
  /* 确保父元素可以滚动 */
  height: 100vh;
  overflow-y: auto;
}

(注:文档部分内容可能由 AI 生成)