CSS 盒模型

在 CSS 中,每个元素都被看作一个方形的盒子(box)。理解盒模型是掌握 CSS 布局的基础——它决定了元素的尺寸计算、间距和边框行为。

盒模型的四层结构

从内到外,每个 CSS 盒子由四部分组成:

plaintext
+----------------------------+
|         margin             |  ← 外边距(盒子与盒子之间的距离)
|   +--------------------+   |
|   |      border        |   |  ← 边框(盒子的边界线)
|   |   +------------+   |   |
|   |   |  padding   |   |   |  ← 内边距(内容与边框之间的留白)
|   |   | +--------+ |   |   |
|   |   | |content | |   |   |  ← 内容区(文字、图片)
|   |   | +--------+ |   |   |
|   |   +------------+   |   |
|   +--------------------+   |
+----------------------------+
  • content — 元素的实际内容(文字、图片等)
  • padding — 内边距,内容与边框之间的空白
  • border — 边框,包裹在内边距外面
  • margin — 外边距,盒子与其他元素之间的距离

标准盒模型(content-box)

默认情况下,widthheight 只设置内容区的尺寸:

css
.box {
  width: 300px;
  padding: 20px;
  border: 5px solid #2563eb;
  margin: 30px;
}

在这个例子中:

  • 内容宽度:300px
  • 实际占据宽度:300 + 20×2 + 5×2 = 350px(不含 margin)
  • 加上 margin 后占位:350 + 30×2 = 410px

盒子在页面上的实际可视宽度300 + 40 + 10 = 350px

替代盒模型(border-box)

box-sizing: border-box 改变了尺寸计算方式——width 包含了内容、内边距和边框:

css
*, *::before, *::after {
  box-sizing: border-box;
}

这个重置在几乎所有现代项目中都是标准配置。使用 border-box 后:

css
.box {
  box-sizing: border-box;
  width: 300px;
  padding: 20px;
  border: 5px solid #2563eb;
}
  • 设置的总宽度:300px
  • 内容区自动缩减:300 - 20×2 - 5×2 = 250px

border-box 让尺寸设置更直观——你设置 width: 300px,盒子的最终宽度就是 300px,不需要手动扣除 padding 和 border。这是为什么几乎所有 CSS 框架和 reset 都会全局设置它的原因。

两种盒模型对比

css
.element {
  width: 200px;
  height: 100px;
  padding: 20px;
  border: 5px solid #2563eb;
}

.content-box .element {
  box-sizing: content-box; /* 默认 */
  /* 可视宽度 = 200 + 20×2 + 5×2 = 250px */
  /* 可视高度 = 100 + 20×2 + 5×2 = 150px */
}

.border-box .element {
  box-sizing: border-box;
  /* 可视宽度 = 200px(内容被压缩为 150px) */
  /* 可视高度 = 100px(内容被压缩为 50px) */
}
html
<div class="content-box">
  <div class="element">content-box(可视宽 250px)</div>
</div>
<div class="border-box">
  <div class="element">border-box(可视宽 200px)</div>
</div>

margin 叠加(Margin Collapse)

垂直方向上,相邻盒子的外边距会叠加(取最大值而不是求和):

html
<div class="box1">盒子 1,margin-bottom: 30px</div>
<div class="box2">盒子 2,margin-top: 20px</div>

这两个盒子之间的间距是 30px(取 3020 中的较大值),而不是 50px

margin 叠加只在垂直方向发生,水平方向不会叠加。叠加规则适用于相邻兄弟元素、父子元素(如果父子间没有 border/padding 阻隔)以及空元素。

盒模型与浏览器 DevTools

所有浏览器的开发者工具都能直观展示盒模型。在 Elements 面板选中一个元素后,在 Styles/Computed 标签旁可以看到四层彩色示意图(蓝色=内容、绿色=内边距、黄色=边框、橙色=外边距)。这是调试布局问题最有效的工具。