网站

正常流中的块和内联布局 | MDN

CSS display 属性

引入

网页中的元素默认就会按照一定规则排列,不写复杂布局代码时,浏览器也会自动把内容显示出来。

这个默认的排列规则,就是 CSS 中常说的文档流

正文

定义

定义

文档流也叫正常流,指的是 HTML 元素在页面中按照默认规则从上到下、从左到右排列的方式。

简单理解:

HTML 元素写在文档中,浏览器会按照它们出现的顺序,一个接一个地显示出来。

如果没有使用 positionfloatflexgrid 等特殊布局方式,大多数元素都会在文档流中正常排列。

基础表现

在文档流中,元素的排列方式主要和它的 display 类型有关。

常见情况:

  • 块级元素通常会从上到下排列
  • 内联元素通常会从左到右排列
  • 元素会占据自己的空间
  • 后面的元素会受到前面元素所占空间的影响

块级元素在文档流中

块级元素通常会独占一行。

<div class="box">第一个盒子</div>
<div class="box">第二个盒子</div>
<div class="box">第三个盒子</div>
.box {
  background-color: #e5e7eb;
  margin-bottom: 12px;
  padding: 16px;
}

这三个 <div> 会按照 HTML 中的顺序,从上到下排列。

因为 <div> 默认是块级表现,所以每个 <div> 都会独占一行。

常见块级元素:

  • <div>
  • <p>
  • <h1><h6>
  • <ul>
  • <ol>
  • <li>
  • <section>
  • <article>

内联元素在文档流中

内联元素通常不会独占一行,而是和其他内容排在同一行。

<p>
  这是一段文字,里面有
  <span class="mark">重点内容</span>
  和一个
  <a href="#">链接</a>。
</p>
.mark {
  color: red;
}

这里的 <span><a> 会跟文字一起在同一行显示。

如果一行放不下,内容会自动换到下一行。

常见内联元素:

  • <span>
  • <a>
  • <strong>
  • <em>
  • <label>
  • <img>

文档流中的空间关系

文档流中的元素会占据页面空间。

前面的元素变高,后面的元素就会被往下推。

<div class="card">卡片内容比较多,会占据更高的空间。</div>
<p>这段文字会出现在卡片下面。</p>
.card {
  padding: 24px;
  background-color: #f3f4f6;
}

如果 .card 的内容变多,高度增加,下面的 <p> 会自动往下移动。

这就是文档流很重要的地方:元素之间默认会互相影响位置。

脱离文档流

有些 CSS 写法会让元素脱离文档流

脱离文档流后,这个元素就不再占据原来的位置,后面的元素可能会当它不存在一样继续排列。

常见会影响文档流的写法:

写法是否脱离文档流说明
position: static;默认定位方式,元素在文档流中
position: relative;相对自身偏移,原位置还保留
position: absolute;绝对定位,通常脱离文档流
position: fixed;固定在视口中,脱离文档流
float: left;部分脱离会影响文字环绕和后续布局

position: relative;

position: relative; 不会让元素脱离文档流。

.box {
  position: relative;
  top: 20px;
}

这个元素看起来会向下移动 20px,但是它原来的位置还会被保留。

所以后面的元素不会自动占用它原来的位置。

position: absolute;

position: absolute; 会让元素脱离文档流。

<div class="card">
  <span class="badge">推荐</span>
  <p>这是一张卡片。</p>
</div>
.card {
  position: relative;
  padding: 24px;
  background-color: #f3f4f6;
}
 
.badge {
  position: absolute;
  top: 8px;
  right: 8px;
  background-color: red;
  color: white;
}

这里 .badge 使用了 position: absolute;,它会脱离文档流。

.card 里面的其他内容不会因为 .badge 占了空间而自动避开它。

float 和文档流

float 最早常用来做文字环绕图片,也会改变元素在文档流中的表现。

<img class="cover" src="cover.jpg" alt="封面">
<p>这是一段介绍文字,会围绕图片排列。</p>
.cover {
  float: left;
  width: 120px;
  margin-right: 16px;
}

图片会浮动到左侧,文字会在它旁边环绕。

现在做整体页面布局时,更常用 flexgrid,不太建议用 float 做大布局。

常见属性

属性作用
display控制元素的显示类型,例如 blockinlineinline-block
position控制元素的定位方式
top配合定位控制元素向下或向上偏移
right配合定位控制元素右侧位置
bottom配合定位控制元素底部位置
left配合定位控制元素左侧位置
float让元素浮动,常用于文字环绕
clear清除浮动对后续元素的影响

例子

普通文档流中的卡片

下面的卡片会按照顺序从上到下排列。

<div class="card">第一张卡片</div>
<div class="card">第二张卡片</div>
.card {
  padding: 16px;
  margin-bottom: 12px;
  background-color: #f9fafb;
  border: 1px solid #d1d5db;
}

每个 .card 都在文档流中,所以它们会互相占据空间,不会重叠。

绝对定位的角标

这个例子把角标放到卡片右上角。

<div class="product">
  <span class="tag">新品</span>
  <h3>商品标题</h3>
  <p>商品说明文字</p>
</div>
.product {
  position: relative;
  padding: 24px;
  border: 1px solid #d1d5db;
}
 
.tag {
  position: absolute;
  top: 8px;
  right: 8px;
  padding: 4px 8px;
  background-color: #ef4444;
  color: white;
}

.tag 脱离文档流后,可以放在卡片角落。

但它不占普通位置,所以要注意不要挡住其他文字。

特点

  • 文档流是浏览器默认的页面排列方式
  • 块级元素通常从上到下排列
  • 内联元素通常从左到右排列
  • 文档流中的元素会占据空间
  • 前面元素的大小会影响后面元素的位置
  • position: relative; 不会脱离文档流
  • position: absolute;position: fixed; 通常会脱离文档流
  • 脱离文档流的元素可能会和其他元素重叠
  • 做普通内容排版时,优先利用文档流,不要一开始就大量使用定位

注意事项

  • 不要把所有元素都用 position: absolute; 定位,这样页面会很难维护
  • 文档流适合普通文章、列表、卡片等自然排列的内容
  • 如果只是想让元素上下排列,通常不需要特殊布局
  • 如果想让元素横向排列,可以考虑 display: flex;
  • 脱离文档流后,要注意元素是否遮挡内容
  • 响应式页面中,依赖文档流通常比写死位置更稳定

理解

可以把文档流理解为网页的默认排队规则。

块级元素像一排一排往下站,内联元素像一行文字从左往右排。

只要元素还在文档流中,它就会占位置,也会影响后面的元素。

一旦元素脱离文档流,就像从队伍里拿出来单独摆放,位置更自由,但也更容易重叠和失控。

所以学习布局时,要先理解文档流,再去理解 CSS 内联元素与块级元素CSS 盒模型CSS 定位CSS Flexbox 这些更具体的布局方式。

引出

理解文档流之后,可以继续学习 CSS 盒模型,因为元素在文档流中占据多大空间,和 contentpaddingbordermargin 都有关系。