文档流、display 与定位

串起文档流、display、position、float 和 BFC,帮助理解元素为什么会出现在页面中的某个位置。

#type / synthesis #status / growing #resource / css #tech / dev / frontend

[!info] related notes

文档流、display 与定位

很多人学不会 CSS,不是因为属性太多,而是没有搞清楚元素为什么会出现在那里。这个主题要回答的就是这个问题。

一句话主线

先理解默认文档流,再理解 display 如何改变元素的参与方式,再理解 positionfloat、BFC 如何局部打破或隔离默认规则。

文档流是什么

文档流是浏览器默认的排版规则:

  • 块级元素通常从上到下排
  • 行内元素通常从左到右排,放不下就换行

如果你什么都不写,页面就是按文档流排的。

display 决定元素以什么方式参与布局

最常见的几种:

  • block:独占一行,宽度通常撑满父容器
  • inline:不独占一行,宽高更多由内容决定
  • inline-block:不独占一行,但可以设置宽高
  • none:不显示,也不占空间

因此 display 回答的是:

这个元素在布局里扮演什么角色?

position 决定元素是否偏离默认流

static

默认值,完全按照文档流排。

relative

相对自己原来的位置偏移,但原本占的空间还在。

absolute

脱离普通文档流,相对于最近的已定位祖先定位。

fixed

相对于视口定位,滚动页面时位置不随内容移动。

sticky

在阈值前像普通流中的元素,滚动到某个位置后像固定定位一样吸附。

为什么 absolute 容易让人混乱

因为它同时改变了两件事:

  1. 脱离文档流,不再占据原来的布局位置
  2. 改为相对于最近的已定位祖先计算偏移

所以排查绝对定位问题时,要先问:

  • 它相对谁定位?
  • 它脱离文档流后,对兄弟元素造成了什么影响?

float 是旧时代的重要布局机制

float 的原始目的不是做整页布局,而是让文本环绕图片。

它的特点是:

  • 元素会向左或向右浮动
  • 会部分脱离普通文档流
  • 后面的文本可能环绕它

现代页面主布局通常优先用 Flex 和 Grid,但理解 float 仍然重要,因为它能帮助你理解:

  • 为什么父元素会高度塌陷
  • 为什么文字会绕着某个元素排
  • 为什么 BFC 能解决某些老问题

BFC 为什么总和布局问题一起出现

BFC 可以粗略理解为一个相对独立的块级布局区域。

它常用来解决三类问题:

  • 包裹内部浮动
  • 阻止外边距塌陷
  • 做局部布局隔离

所以很多看起来杂乱的技巧,本质上是在“新建一块独立布局区域”。

这一组概念之间的关系

最推荐的理解顺序是:

  1. 默认先按文档流排
  2. display 先决定元素以什么形式参与文档流
  3. position 再决定元素是否偏离默认流、相对谁定位
  4. float 是旧布局体系里的一种特殊偏移方式
  5. BFC 用来隔离布局影响和解决典型副作用

为什么现代布局还要学这一套

因为即使你已经会 Flex 和 Grid,页面里仍然会遇到:

  • 弹窗和角标为什么要绝对定位
  • 吸顶栏为什么要用 sticky
  • 为什么某个元素高度塌陷
  • 为什么 overflow: hidden 会“顺手解决”布局问题

这些都离不开文档流、定位和 BFC。

最短记忆方式

  • display:决定“怎么参与排版”
  • position:决定“是否偏离默认流、相对谁定位”
  • float:旧式偏移与环绕机制
  • BFC:局部布局隔离机制
创建于 2026/3/25 更新于 2026/5/27