跳至正文
来两杯美式
返回

CSS 基础(四):定位

By 来两杯美式
发布于

CSS 定位(Position)

适用人群:前端基础薄弱、目标用 T3 Stack 写生产项目的开发者 学完收获:搞定所有精确定位 UI 场景,不再出现元素乱跑、父容器塌陷、层级错乱问题


一、前置基础概念

1. 什么是文档流?

浏览器默认的排版规则,相当于排队规则

2. 什么是脱离文档流?

元素不遵守默认排队规则,相当于从队伍里跑出去

脱离方式脱离程度表现
float部分脱离后面的块元素会补位,但文字会环绕浮动元素
absolute/fixed完全脱离其他元素完全无视它的存在,不会补位

二、5 种定位方式全解(含 Tailwind 对应写法)

定位核心作用:给元素装 GPS,精准放到页面任意位置。

1. static(默认定位)

2. relative(相对定位)

{
  /* 相对于原位置向右偏移10px,向下偏移5px */
}
<div className="relative top-5 left-10 bg-blue-100 p-4">相对定位元素</div>;

3. absolute(绝对定位)

{
  /* 父元素加relative当参考 */
}
<div className="relative h-40 w-40 bg-gray-100">
  {/* 子元素相对于父元素放在右下角 */}
  <span className="absolute right-2 bottom-2 rounded bg-green-500 px-2 py-1 text-white">
    绝对定位
  </span>
</div>;

4. fixed(固定定位)

{
  /* 固定在页面右下角的回到顶部按钮 */
}
<button className="fixed right-5 bottom-5 flex h-10 w-10 items-center justify-center rounded-full bg-blue-500 text-white">

</button>;

5. sticky(粘性定位)

<div className="h-[200px] overflow-y-auto border">
  <div className="h-10 bg-gray-100">顶部内容</div>
  {/* 滚动到顶部就固定住 */}
  <div className="sticky top-0 bg-orange-500 p-2 text-white">
    粘性标题,滚动到顶部就停住
  </div>
  <div className="h-[300px] p-2">大量内容...</div>
</div>

三、核心组合:relative + absolute 黄金搭档

90% 的定位场景都是这个组合:

{
  /* T3项目里常用的消息徽标 */
}
<button className="relative rounded bg-gray-100 p-2">
  消息中心
  {/* 红色小圆点徽标,相对于按钮放在右上角 */}
  <span className="absolute -top-1 -right-1 flex h-4 w-4 items-center justify-center rounded-full bg-red-500 text-xs text-white">
    3
  </span>
</button>;

四、易混淆区分:定位 vs 浮动

维度浮动(float)定位(position)
移动方向只能左/右上下左右任意位置
参考对象父元素边界自己/祖先元素/浏览器窗口
用途文字绕排、老旧布局(已被 Flex 取代)精确定位、悬浮元素
脱离程度部分脱离部分/完全脱离

T3 项目开发准则:布局用 Flex/Grid,精确定位才用 position,完全不用 float 做布局。


五、高频踩坑避坑指南

1. absolute 父元素高度塌陷

问题:子元素用 absolute 完全脱离文档流,父元素没有内容撑开,高度变成 0 解决:给父元素加 min-h-[xx] 指定最小高度,或者加 padding 预留位置

2. z-index 不生效

问题:设置了 z-index 但是层级还是不对 原因:只有非 static 定位的元素 z-index 才生效,层级是相对于父级的堆叠上下文 解决:给需要调整层级的元素加定位(relative 即可),不要乱加超大 z-index,统一管控全局层级:

层级用途推荐值
普通悬浮元素z-10
下拉菜单z-30
固定导航z-40
全局弹窗z-50

3. sticky 不生效

常见原因:


六、T3 项目实战常用代码片段

1. 固定顶部导航栏

<nav className="fixed top-0 right-0 left-0 z-40 flex h-16 items-center bg-white px-4 shadow-sm">
  导航栏内容
</nav>;
{
  /* 给下面的内容加padding,避免被导航栏挡住 */
}
<main className="pt-16">页面内容</main>;

2. 居中弹窗

{
  /* 遮罩层 */
}
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50">
  {/* 弹窗内容 */}
  <div className="w-[400px] rounded-lg bg-white p-6">弹窗内容</div>
</div>;

3. 粘性侧边栏

<div className="flex gap-4">
  <aside className="sticky top-16 h-fit w-64">
    侧边栏,滚动时固定在顶部16px位置
  </aside>
  <main className="flex-1">主内容</main>
</div>

七、速查表

定位类型CSS 写法Tailwind 写法参考对象常用场景
默认position: staticstatic重置定位
相对position: relativerelative自己原位置做 absolute 参考容器
绝对position: absoluteabsolute最近非 static 父元素徽标、下拉菜单
固定position: fixedfixed浏览器窗口固定导航、弹窗
粘性position: stickysticky滚动父元素表头、粘性侧边栏

分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
所属专题
CSS
第 4 / 7 篇
查看系列全部文章
  1. 01.CSS 基础(一):元素类型与 display 属性
  2. 02.CSS 基础(二):盒模型
  3. 03.CSS 基础(三):浮动
  4. 04.CSS 基础(四):定位
  5. 05.CSS 基础(五):Flex 弹性布局
  6. 06.CSS 基础(六):Grid 网格布局
  7. 07.CSS 基础(七):响应式设计与媒体查询

上一篇
CSS 基础(五):Flex 弹性布局
下一篇
CSS 基础(三):浮动