Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • CSS
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • CSS
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • CSS

    • CSS教程和技巧收藏
    • css块元素和行内元素
    • 盒子模型
      • 一、什么是盒子模型(Box Model)
      • 二、两种盒模型的区别(核心)
        • 举例说明:
      • 三、box-sizing 属性详解
      • 四、实战推荐写法(几乎所有项目都这么写)
        • 优点:
      • 五、举例对比(感性理解)
        • 1️⃣ 默认情况(content-box)
        • 2️⃣ border-box
      • 六、与布局相关的几个小陷阱
      • 七、面试官可能的追问
        • ❓1. 如何验证盒模型?
        • ❓2. 为什么 CSS Reset 要加 *, *::before, *::after { box-sizing: border-box; }?
        • ❓3. 如果只想让部分组件使用标准模型?
      • 八、面试答题模板(30秒)
      • 九、可视化案例(推荐自己做个 Demo 练习)
    • BFC和IFC
    • 字体font-weight相关知识
    • CSS-function汇总
    • CSS3之has函数的使用
    • CSS3之transition过渡
    • CSS3之animation动画
    • css动画性能优化
    • flex布局语法
    • flex布局案例
    • Grid布局语法
    • flex布局和grid布局的区别
    • 「布局技巧」图片未加载前自动撑开元素高度
    • 文字在一行或多行时超出显示省略号
    • 水平垂直居中的几种方式-案例
    • 如何根据系统主题自动响应CSS深色模式
    • 工作中遇到的css问题记录
    • 今天总结一下用到的css吧
  • 页面
  • CSS
mamingjuan
2020-02-27
目录

盒子模型

# 盒子模型

# 一、什么是盒子模型(Box Model)

浏览器渲染一个元素时,会将其视为一个矩形盒子(Box)。 这个盒子由四个区域组成:

+----------------------------+
|        margin 外边距       |
|  +----------------------+  |
|  |     border 边框      |  |
|  |  +----------------+  |  |
|  |  |  padding 内边距 |  |  |
|  |  | +-------------+ |  |  |
|  |  | | content 内容 | |  |  |
|  |  | +-------------+ |  |  |
|  |  +----------------+  |  |
|  +----------------------+  |
+----------------------------+
1
2
3
4
5
6
7
8
9
10
11
12

# 二、两种盒模型的区别(核心)

模型类型 计算方式(width 表示什么) CSS 触发方式
标准盒模型(W3C) width = content 区域宽度,不包括 padding 和 border box-sizing: content-box(默认)
IE 盒模型 width = content + padding + border 整体盒宽 box-sizing: border-box

# 举例说明:

div {
  width: 200px;
  padding: 10px;
  border: 5px solid;
}
1
2
3
4
5
模型 实际渲染宽度
content-box 200 + 10 + 10 + 5 + 5 = 230px
border-box 200(已包含 padding、border)

# 三、box-sizing 属性详解

属性值 含义
content-box width 只包含内容区(默认)
border-box width 包含内容 + padding + border(推荐)
inherit 继承父元素设置

在 CSS盒子模型 (opens new window) 的默认定义里,你对一个元素所设置的 width (opens new window) 与 height (opens new window) 只会应用到这个元素的内容区。如果这个元素有任何的 border (opens new window) 或 padding (opens new window) ,绘制到屏幕上时的盒子宽度和高度会加上设置的边框和内边距值。

来源:https://developer.mozilla.org/zh-CN/docs/Web/CSS/box-sizing (opens new window)

# 四、实战推荐写法(几乎所有项目都这么写)

现代前端项目(Vue/React/Tailwind)都会全局设定:

*, *::before, *::after {
  box-sizing: border-box;
}
1
2
3

# 优点:

  • padding、border 不再影响盒子总宽度;
  • 布局更直观,减少计算;
  • 尤其适合响应式和复杂 UI(如卡片、表单);

# 五、举例对比(感性理解)

# 1️⃣ 默认情况(content-box)

<div class="box1">content-box</div>
1
.box1 {
  width: 200px;
  padding: 20px;
  border: 10px solid #4f46e5;
  background: #c7d2fe;
}
1
2
3
4
5
6

👉 实际占用宽度 = 200 + 40 + 20 = 260px


# 2️⃣ border-box

<div class="box2">border-box</div>
1
.box2 {
  box-sizing: border-box;
  width: 200px;
  padding: 20px;
  border: 10px solid #4f46e5;
  background: #a5b4fc;
}
1
2
3
4
5
6
7

👉 实际占用宽度 = 200px,更好控制!


# 六、与布局相关的几个小陷阱

场景 问题
设置 width: 100% 同时有 padding 实际宽度 > 父级,会溢出(content-box)
想让盒子固定尺寸 用 border-box 更安全
Tailwind / ElementPlus 默认 已设置全局 border-box

# 七、面试官可能的追问

# ❓1. 如何验证盒模型?

👉 打开浏览器 DevTools → Elements → “Computed” 面板 → Box Model 图示,一目了然。

# ❓2. 为什么 CSS Reset 要加 *, *::before, *::after { box-sizing: border-box; }?

👉 因为伪元素 (::before、::after) 默认是 content-box,不重置会影响布局。

# ❓3. 如果只想让部分组件使用标准模型?

👉 局部覆盖:

.card {
  box-sizing: content-box;
}
1
2
3

# 八、面试答题模板(30秒)

在 CSS 中,每个元素都是一个盒子,分为 content、padding、border、margin 四层。 默认的盒模型是标准模型(content-box),width 只包含内容区; 而 IE 模型(border-box)会把 padding 和 border 都包含在 width 里。 我们可以通过 box-sizing 属性控制,一般项目都会统一设置为 border-box, 这样布局更可控,尤其在响应式场景中可以避免计算宽度出错。


# 九、可视化案例(推荐自己做个 Demo 练习)

<template>
  <div class="container">
    <div class="box content-box">content-box</div>
    <div class="box border-box">border-box</div>
  </div>
</template>

<style scoped>
.container {
  display: flex;
  gap: 20px;
}
.box {
  width: 200px;
  padding: 20px;
  border: 10px solid #4f46e5;
  background: #c7d2fe;
  text-align: center;
}
.content-box {
  box-sizing: content-box;
}
.border-box {
  box-sizing: border-box;
  background: #a5b4fc;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

上次更新: 2025/11/25, 03:24:47
css块元素和行内元素
BFC和IFC

← css块元素和行内元素 BFC和IFC→

Copyright © 2015-2025 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式