盒模型是 CSS 中最基础也最重要的概念之一。理解盒模型对于准确控制元素的尺寸、间距和布局至关重要。每个 HTML 元素都被表示为一个矩形的盒子,这个盒子由内容、内边距、边框和外边距组成。
CSS 盒模型由四个部分组成:
内容区域是元素实际显示内容的地方,包含文本、图片或其他子元素。
.box {
width: 200px;
height: 100px;
background: #3498db;
}
内边距是内容区域与边框之间的空间,属于元素内部的一部分。
.box {
padding: 20px;
background: #3498db;
}
边框围绕内边距和内容区域,是元素的可见边界。
.box {
border: 2px solid #333;
padding: 20px;
background: #3498db;
}
外边距是元素与其他元素之间的空间,位于边框外部。
.box {
margin: 20px;
border: 2px solid #333;
padding: 20px;
background: #3498db;
}
┌─────────────────────────────────────┐
│ 外边距 (Margin) │
│ ┌───────────────────────────────┐ │
│ │ 边框 (Border) │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ 内边距 (Padding) │ │ │
│ │ │ ┌───────────────────┐ │ │ │
│ │ │ │ 内容 (Content) │ │ │ │
│ │ │ └───────────────────┘ │ │ │
│ │ └─────────────────────────┘ │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
内边距属性用于设置内容与边框之间的空间。
/* 四周相同的内边距 */
.box {
padding: 20px;
}
/* 上下20px,左右30px */
.box {
padding: 20px 30px;
}
/* 上20px,左右30px,下40px */
.box {
padding: 20px 30px 40px;
}
/* 上20px,右30px,下40px,左50px */
.box {
padding: 20px 30px 40px 50px;
}
/* 上内边距 */
.box {
padding-top: 20px;
}
/* 右内边距 */
.box {
padding-right: 30px;
}
/* 下内边距 */
.box {
padding-bottom: 40px;
}
/* 左内边距 */
.box {
padding-left: 50px;
}
/* 卡片内边距 */
.card {
padding: 20px;
background: white;
border-radius: 8px;
}
/* 按钮内边距 */
.button {
padding: 12px 24px;
background: #007bff;
color: white;
border: none;
border-radius: 4px;
}
/* 输入框内边距 */
.input {
padding: 10px 15px;
border: 1px solid #ced4da;
border-radius: 4px;
}
外边距属性用于设置元素与其他元素之间的空间。
/* 四周相同的外边距 */
.box {
margin: 20px;
}
/* 上下20px,左右30px */
.box {
margin: 20px 30px;
}
/* 上20px,左右30px,下40px */
.box {
margin: 20px 30px 40px;
}
/* 上20px,右30px,下40px,左50px */
.box {
margin: 20px 30px 40px 50px;
}
/* 上外边距 */
.box {
margin-top: 20px;
}
/* 右外边距 */
.box {
margin-right: 30px;
}
/* 下外边距 */
.box {
margin-bottom: 40px;
}
/* 左外边距 */
.box {
margin-left: 50px;
}
/* 水平居中 */
.center {
width: 500px;
margin: 0 auto;
}
/* 垂直居中(需要配合其他属性) */
.center-vertical {
width: 500px;
height: 300px;
margin: auto;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
/* 负外边距可以减少元素间的距离 */
.box {
margin-top: -10px;
}
/* 用于精确控制布局 */
.header {
margin-bottom: -5px;
}
垂直方向相邻的块级元素的外边距会发生合并,取较大的那个值。
/* 外边距合并示例 */
.box1 {
margin-bottom: 20px;
}
.box2 {
margin-top: 30px;
}
/* 实际间距是30px,不是50px */
CSS 有两种盒模型:标准盒模型和 IE 盒模型。
在标准盒模型中,width 和 height 只包含内容区域。
.box {
box-sizing: content-box;
width: 200px;
padding: 20px;
border: 5px solid #333;
margin: 10px;
}
/* 总宽度 = 200px + 20px*2 + 5px*2 = 250px */
在 IE 盒模型中,width 和 height 包含内容、内边距和边框。
.box {
box-sizing: border-box;
width: 200px;
padding: 20px;
border: 5px solid #333;
margin: 10px;
}
/* 总宽度 = 200px */
/* 全局设置 */
* {
box-sizing: border-box;
}
/* 单个元素设置 */
.box {
box-sizing: content-box;
}
.content-box {
box-sizing: content-box;
width: 300px;
padding: 20px;
border: 5px solid #333;
margin: 10px;
background: #3498db;
}
/* 计算:
* 内容宽度:300px
* 内边距:20px × 2 = 40px
* 边框:5px × 2 = 10px
* 总宽度:300px + 40px + 10px = 350px
*/
.border-box {
box-sizing: border-box;
width: 300px;
padding: 20px;
border: 5px solid #333;
margin: 10px;
background: #e74c3c;
}
/* 计算:
* 总宽度:300px
* 内容宽度:300px - 40px - 10px = 250px
*/
.card {
box-sizing: border-box;
width: 300px;
margin: 20px;
padding: 20px;
border: 1px solid #dee2e6;
border-radius: 8px;
background: white;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.button {
box-sizing: border-box;
padding: 12px 24px;
margin: 10px;
border: none;
border-radius: 4px;
background: #007bff;
color: white;
cursor: pointer;
}
.button:hover {
background: #0056b3;
}
.input {
box-sizing: border-box;
width: 100%;
padding: 10px 15px;
margin-bottom: 15px;
border: 1px solid #ced4da;
border-radius: 4px;
font-size: 16px;
}
.input:focus {
border-color: #007bff;
outline: none;
box-shadow: 0 0 0 3px rgba(0,123,255,0.25);
}
.container {
box-sizing: border-box;
width: 100%;
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
现代浏览器的开发者工具可以可视化盒模型:
/* 调试盒模型 */
.debug {
outline: 2px solid red;
}
.debug * {
outline: 1px solid blue;
}
/* 调试内边距 */
.debug-padding {
background: #f5f5f5;
padding: 20px;
}
/* 调试外边距 */
.debug-margin {
background: #e9ecef;
margin: 20px;
border: 1px solid #dee2e6;
}
/* 全局设置 */
*,
*::before,
*::after {
box-sizing: border-box;
}
/* 不推荐 */
.box {
margin-top: -10px;
}
/* 推荐 */
.box {
margin-top: 0;
}
/* 不推荐 - 相邻元素都设置外边距 */
.box1 {
margin-bottom: 20px;
}
.box2 {
margin-top: 20px;
}
/* 推荐 - 只在一个方向设置外边距 */
.box {
margin-bottom: 20px;
}
/* 推荐 */
.button {
padding: 12px 24px;
}
/* 不推荐 */
.button {
height: 48px;
margin: 12px;
}
盒模型是 CSS 中最基础也最重要的概念之一:
记住以下几点: