Appearance
盒模型(Box Model)
盒模型是 CSS 布局的基石:每个元素本质上都是一个由内到外的矩形盒子。理解
content / padding / border / margin四层结构,以及box-sizing如何改变「宽高到底算哪一层」,是精确控制布局、避免尺寸计算失误的前提。本篇从结构、计算规则到实战示例,帮你彻底吃透盒模型。
导航目录
一、原理篇
二、实战篇
基本概念与四层结构
在 CSS 中,一个元素的「盒子」由内到外依次包含:内容(content)→ 内边距(padding)→ 边框(border)→ 外边距(margin)。
核心概念:谁属于「盒子本体」?
padding/border会影响盒子本体的尺寸:它们撑大元素占据的可视区域。margin不属于盒子本体:它是与其他元素/容器之间的间距,影响布局占位,但不改变盒子本体的边框大小。- 一句话记忆:margin 管「外部间隔」,padding/border 管「内部占位」。
盒模型的四层从内到外可视化如下:
text
┌─────────────────────────────────────────┐
│ margin(外边距·布局间隔) │
│ ┌───────────────────────────────────┐ │
│ │ border(边框) │ │
│ │ ┌─────────────────────────────┐ │ │
│ │ │ padding(内边距) │ │ │
│ │ │ ┌───────────────────────┐ │ │ │
│ │ │ │ content(内容区 │ │ │ │
│ │ │ │ width/height) │ │ │ │
│ │ │ └───────────────────────┘ │ │ │
│ │ └─────────────────────────────┘ │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘尺寸计算(content-box vs border-box)
box-sizing 决定 width/height 指的是哪一层的尺寸,这是盒模型最关键的分歧点:
| box-sizing | width/height 含义 | 边框盒总宽度 | 直觉性 |
|---|---|---|---|
content-box(默认) | 仅 content | content + padding + border | 较反直觉 |
border-box | content + padding + border | 就等于设置的 width | 符合直觉,最常用 |
快速记忆
- 默认
content-box:设置的宽高是「内容区」,加上 padding/border 后实际会更宽。 border-box:设置的宽高就是「边框区」,加 padding/border 不再撑大——更符合直觉,也更常用。- 现代项目常用全局重置:
*, *::before, *::after { box-sizing: border-box; }
示例:同一组 padding/border 的两种结果
下面示例中,width 都是 100px,但两种 box-sizing 的最终边框盒宽度不同。
html
<style>
.box {
width: 100px;
padding: 10px;
border: 1px solid #ccc;
margin: 10px;
background: #f7f7f7;
}
.contentBox {
box-sizing: content-box; /* 默认值,可不写 */
}
.borderBox {
box-sizing: border-box;
}
</style>
<div class="box contentBox">content-box</div>
<div class="box borderBox">border-box</div>计算结果:
- content-box(默认)
width: 100px= content 宽度- 边框盒总宽度:100 + 10 + 10 + 1 + 1 = 122px
- border-box
width: 100px= 边框盒宽度- 边框盒总宽度:100px
margin 不参与盒子本体宽度
margin: 10px 不参与上面的「盒子本体宽度」计算,但会在盒子外侧产生 10px 间隔,从而影响布局占位与元素间距。切勿把 margin 也算进 border-box 总宽度里。
结语:先分清「哪一层」再算尺寸
盒模型的所有困惑,几乎都源于「不清楚 width 算的是哪一层」。记住 border-box 让宽高所见即所得,再配合全局重置,绝大多数布局尺寸问题都能迎刃而解。