前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库box-sizing content-box border-box
CSS盒模型与排版

同样写 width 200px,content-box 和 border-box 算出来的宽度为什么不一样?

content-box 下 width 只是内容区的宽,padding 和 border 会再往外加,元素实际更宽。border-box 下 width 就是边框外沿的总宽,加 padding 和 border 时内容区自己缩小。写布局时后者更好算,所以项目里通常全局设成 border-box。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#盒模型与排版
先看核心答案读代码示例
理解线索

`width` 到底量的是哪一圈

  1. content-boxwidth 量内容区,padding 和 border 在外面另算
  2. border-boxwidth 量到边框外沿,内容区 = width 减去 padding 和 border
  3. margin两种模式都不计入 width,只影响元素占的外部空间

border-box 下内容区最小是 0,不会变负数。padding 加 border 超过 width 时,元素照样会被撑大。

核心回答

先记住这个答案

区别在于 width 量的是哪一圈。content-box 是浏览器默认值,width 只算内容区,padding 和 border 另外往外加,所以写了 width: 200px 再加 padding: 20px 和 2px 边框,元素实际占 244px。border-box 下 width 就是到边框外沿的总宽,还是 200px,内容区缩成 156px。需要按设计稿写死尺寸、用百分比分栏、表单控件对齐时都优先选 border-box,多数项目直接在全局重置里设好。

  • content-box 的外宽含边框和内边距
  • border-box 的宽度含边框和内边距
  • 默认盒模型是 content-box
  • border-box 可防内边距撑宽

同一组样式,两种算法的结果

拿一个最常见的场景:两个卡片各占 50%,再给卡片加点内边距。

两个 50% 的卡片为什么掉行CSS
.row { width: 400px; }
.card {
  float: left;
  width: 50%;          /* 200px */
  padding: 16px;
  border: 1px solid #ddd;
}

/* content-box(默认):200 + 16*2 + 1*2 = 234px,两个 468px > 400px,第二个掉到下一行 */
/* border-box:总宽就是 200px,两个正好 400px,排在一行 */
.card { box-sizing: border-box; }

content-box 下,百分比宽度和 padding 放在一起就会出问题:百分比算的是内容区,内边距又在外面加一圈,加起来一定超过 50%。以前的做法是用 calc(50% - 34px) 手动扣掉,改一次内边距就要改一次 calc,很容易漏。 换成 border-box,width: 50% 就是卡片看得见的宽度,内边距怎么改都不会撑破布局。

为什么大家都全局设 border-box

设计稿上标的尺寸,是一个按钮、一个输入框从边框到边框的宽度。border-box 的算法和人眼看到的一致,写 CSS 时不用再做加减法。

常见的全局写法CSS
html { box-sizing: border-box; }
*, *::before, *::after { box-sizing: inherit; }

用 inherit 而不是直接在 * 上写 border-box,是为了让某个第三方组件需要 content-box 时,只在它的根元素上改一次,里面的子元素会跟着继承。直接写 * { box-sizing: border-box } 也能用,只是局部回退要逐个元素覆盖。

表单控件本来就不统一
input、textarea、select、button 在不同浏览器里的默认 box-sizing 并不一致,有的是 border-box,有的是 content-box。所以不设全局值时,同样 width: 200px 的输入框和按钮经常对不齐。全局统一成 border-box 顺手解决了这个问题。

content-box 还有什么用

content-box 也不是没用。当你关心的是内容区的尺寸,比如一张固定 300px 的图片外面包一层边框和内边距,希望图片区域始终是 300px,这时让 width 量内容区更直观。

另一种情况是维护老项目。整站本来按 content-box 写的尺寸,中途改成全局 border-box,所有带 padding 的元素都会变窄,需要全量回归,不能只改一行重置样式就上线。

回答前,多想一步

容易答错的地方

以为 border-box 也包含 margin
border-box 只到边框为止,margin 在两种模式下都不算进 width。两个 width: 50% 的元素再各加 margin: 0 8px,照样会超宽。这时要用 gap、Flex 或者在 calc 里扣掉外边距。
以为 border-box 下内容区会被压成负数
内容区最小就是 0。如果 padding 左右加起来 40px、border 2px,而 width 只写了 30px,元素会被撑到 42px,不会出现负的内容宽度。
以为 height 不受影响
box-sizing 对 height 同样生效。border-box 下 height: 40px 的按钮加了上下 padding,总高还是 40px,文字区域变矮;content-box 下按钮会变高。做按钮、输入框等高对齐时经常在这里踩坑。
试着用自己的话回答

面试官还会怎么问?

IE 怪异模式的盒模型是怎么回事?

老 IE 在怪异模式(页面没写 <!DOCTYPE>)下,width 就包含 padding 和 border,也就是现在的 border-box 算法。W3C 标准盒模型是 content-box。后来 CSS3 加了 box-sizing,让开发者可以自己选,才有了今天的全局 border-box 写法。

min-width、max-width 受 box-sizing 影响吗?

受。min-width、max-width、min-height、max-height 都按当前 box-sizing 解释。border-box 下 max-width: 600px 就是边框外沿最多 600px,这也是它在响应式里好用的原因。

在 Flex 布局里,flex-basis 按哪一圈算?

flex-basis 和 width 一样遵循 box-sizing。border-box 下 flex: 0 0 200px 的子项,边框到边框就是 200px;content-box 下还要再加上内边距和边框。Flex 子项宽度对不上时,先检查这个。

从一道题,走向一组知识

把知识连起来

盒模型与排版

CSS 中触发 BFC 的常见方式有哪些,BFC 对布局有什么实际作用?

盒子尺寸算清楚之后,下一步是 BFC 决定这些盒子怎么排、浮动和外边距怎么处理。

盒模型与排版

绝对定位元素是相对谁定位的?中间隔着没定位的父元素会有影响吗?

绝对定位的百分比宽度相对包含块的 padding box 计算,和这里的盒子分层是同一套概念。

参考资料

  • box-sizing CSS property

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 同一组样式,两种算法的结果
  3. 为什么大家都全局设 border-box
  4. content-box 还有什么用
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑