CSS 盒模型深度解析:border-box、margin塌陷与布局要点
Introduction
CSS 盒模型(Box Model)是 CSS 布局的核心基础。每一个 HTML 元素都被视为一个矩形盒,由 content(内容区)、padding(内边距)、border(边框)和 margin(外边距)四部分组成。理解盒模型的工作原理,特别是标准盒模型与替代盒模型的差异、margin 塌陷机制、以及如何正确计算元素尺寸,是写出精准布局代码的前提。
两种盒模型
/* 标准盒模型(默认):width = content 宽度 */
box-sizing: content-box; /* 默认值 */
.element {
width: 200px;
padding: 20px;
border: 2px solid #333;
/* 实际占用宽度 = 200 + 20*2 + 2*2 = 244px */
}
/* 替代盒模型(推荐):width = content + padding + border */
box-sizing: border-box;
.element {
width: 200px;
padding: 20px;
border: 2px solid #333;
/* 内容区实际 = 200 - 20*2 - 2*2 = 156px */
}
/* 全局设置(现代 CSS 最佳实践)*/
*, *::before, *::after {
box-sizing: border-box;
}
外边距折叠(Margin Collapsing)
/* 三个经典的 margin 折叠场景 */
/* 1. 垂直方向相邻元素 */
.box1 { margin-bottom: 30px; }
.box2 { margin-top: 20px; }
/* 结果:间距 = max(30px, 20px) = 30px,不叠加 */
/* 2. 父子元素(无间隔元素分隔)*/
.parent { margin-top: 20px; }
.child { margin-top: 30px; }
/* 结果:父元素上外边距 = 30px(子 margin 穿透到父)*/
/* 3. 空的块级元素(上下 margin 相遇)*/
.empty { margin-top: 20px; margin-bottom: 30px; }
/* 结果:该元素外边距 = max(20px, 30px) = 30px */
/* 防止折叠的方法 */
.parent { overflow: hidden; } /* 触发 BFC */
.parent { padding-top: 1px; } /* 加任意 padding */
.parent { border-top: 1px solid transparent; } /* 加边框 */
display 对盒模型的影响
/* 块级元素(block):独占一行,可设宽高 */
div { display: block; width: 200px; height: 100px; }
/* 行内元素(inline):不换行,宽高由内容决定 */
span { display: inline; margin: 10px; /* 水平有效,垂直无效 */ }
/* 行内块(inline-block):同行显示但可设宽高 */
button { display: inline-block; width: 100px; height: 40px; }
实战:完美居中弹窗
.modal-overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
}
.modal {
background: #fff;
border-radius: 12px;
padding: 24px;
max-width: min(90vw, 600px);
max-height: 90vh;
overflow: auto;
}
运行效果
打开弹窗示例,遮罩层占满整个视口,弹窗在屏幕正中央。当窗口缩小时,弹窗宽度最大不超过视口的90%,超出高度时弹窗内部出现滚动条而不会溢出屏幕。
常见问题
- margin: auto 居中为什么不生效:只有块级元素在有明确 width 且父容器有剩余空间时,水平 margin: auto 才能居中。
- padding 撑大父容器:在 content-box 下,padding 会撑大元素实际尺寸。解决方案:全局使用 border-box。
- 负 margin:允许负值,可用于元素偏移、浮动布局、等高列等高级技巧,但慎用以免破坏页面流。
- MDN 盒模型文档:MDN CSS Box Model
- BFC(Block Formatting Context)深入理解:触发条件与布局影响