GitHub

盒模型

JeremyJone ... 2025-3-15 大约 5 分钟

# 盒模型

盒模型是 CSS 中一个非常重要的概念。所有元素都被一个个盒子包裹,理解盒模型的原理,是我们使用 CSS 实现准确布局、处理元素排列的关键所在。

# 块级与内联

CSS 中,常用的有两种盒子,块级盒子内联盒子。这两种盒子会在页面流和元素之间表现出不同的行为。

# 块级盒子的行为

# 内联盒子的行为

# 控制盒子的显示类型

通过 display 属性,可以改变盒子的显示类型:

/* 设置为块级 */
display: block;

/* 设置为内联 */
display: inline;
1
2
3
4
5

提示

为了更好的展示块级与内联的区别,自己写了一个 演示页面,有需要的小朋友可以去体验一下。

# 什么是盒模型

完整的 CSS 盒模型应用于块级盒子,内联盒子只使用和模型中定义的部分内容。

在这个模型中,定义了 marginpaddingbordercontent

box-model

# 标准盒模型

一个盒模型的标准宽高,应该是:

宽度:border-width + padding-left + width + padding-right + border-width

高度:border-width + padding-top + height + padding-bottom + border-width

margin 不计入实际大小。当然它也影响盒子在页面中所占空间,但影响的是外部空间,盒子的大小并不计算在内。

standard-box-model.png

这是默认模式,如果希望显式指定,可以通过 box-sizing: content-box; 来设置。

# 替代盒模型

有时候,希望我们的宽高设置后,就是盒子本身的大小,而不用单独计算边框和边距,这时可以使用 替代盒模型。它的宽高就是我们给出的 widthheight,而盒模型里面内容的宽高会自动从这个总宽高中减去对应的边框和边距大小。

alternate-box-model.png

浏览器默认为标准盒模型,如果我们使用替代盒模型,可以通过 box-sizing: border-box; 来设置。

# 外边距

外边距总是在可见部分之外单独计算添加,它用于将当前盒子与其他元素拉开距离。

外边距有四个属性:

margin-top: 10px;
margin-right: 10px;
margin-bottom: 10px;
margin-left: 10px;
1
2
3
4

同时支持简写,可以定义多种方式:

/* 四周外边距都为 10px */
margin: 10px;

/* 上下 10px,左右 20px */
margin: 10px 20px;

/* 上 10px,左右 20px,右 5px */
margin: 10px 20px 5px;

/* 上 10px,右 20px,下 5px,左 15px */
margin: 10px 20px 5px 15px;
1
2
3
4
5
6
7
8
9
10
11

取值支持:

同时取值支持 负值,可以减少边距,相当于移动元素位置。

# 外边距折叠

如果两个具有外边距的元素相接,那么它们会合并为一个外边距,即最大的单个外边距大小。

比如一个块级元素具有 margin-bottom: 50px,另一个块级元素具有 margin-top:10px,那么它们上下相连并不会出现 60px 的边距,而是选取两者的最大值,即 50px 作为外边距。

提示

当设置了外边距之后,并没有得到我们希望的效果,很大概率是因为外边距折叠导致。

触发外边距折叠的情况:

# 边框

边框是在边距和填充框之间绘制的。边框有大量属性,主要分为:

支持统一设定,也支持单独设定:

/* 统一设置 */
border: 1px solid black;

/* 单独设置一边 */
border-top: 1px dotted;

/* 单独设置宽度、样式、颜色,支持1-4个参数风格 */
border-width: 1px 2px 3px 4px;
border-style: none groove inset double;
border-color: red yellow green blue;

/* 还支持上下左右单独设置每个属性 */
border-left-style: dashed;
border-bottom-color: pink;
1
2
3
4
5
6
7
8
9
10
11
12
13
14

完整内容,参考 MDN

# 内边距

内边距用于将内容与边框分开。与外边距不同,内边距不能出现负值,它必须大于等于 0 的值。

与外边距 margin 一样,内边距有四个属性:

padding-top: 10px;
padding-right: 10px;
padding-bottom: 10px;
padding-left: 10px;
1
2
3
4

它同样支持 1-4 个参数方式:

/* 四周内边距都为 10px */
padding: 10px;

/* 上下 10px,左右 20px */
padding: 10px 20px;

/* 上 10px,左右 20px,右 5px */
padding: 10px 20px 5px;

/* 上 10px,右 20px,下 5px,左 15px */
padding: 10px 20px 5px 15px;
1
2
3
4
5
6
7
8
9
10
11