news 2026/10/14 9:36:27

CSS 盒模型有什么区别?box-sizing 怎样影响元素宽高?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CSS 盒模型有什么区别?box-sizing 怎样影响元素宽高?

CSS 盒模型有什么区别?box-sizing 怎样影响元素宽高?

CSS 盒模型从里到外是 content、padding、border 和 margin。

默认的content-box把 width 和 height 用在内容区上,内边距和边框要另外加。border-box则让指定的宽高包含内容、内边距和边框,但不包含 margin。

所以,在宽度明确的表单或卡片布局里,我一般使用 border-box,计算会直观一些。不过它并不保证元素一定不会溢出。内容的最小尺寸、Flex 或 Grid 的约束,还有长文本的换行方式,都需要一起检查。

width 到底量的是盒子的哪一层

先用一个盒子把尺寸算清楚

假设我们要把一个输入框放进宽 200px 的侧栏,给输入框设置 width, 200px,左右 padding 各 20px,左右 border 各 2px。

如果仍然使用默认的 content-box,那么 200px 只是能放文字的内容区。外面还要加上 40px 内边距和 4px 边框,所以边框盒宽度是244px。输入框会因此超出侧栏,测量时需要把内容区与边框盒区分开。

换成 border-box 后,同样的 200px 是边框盒宽度。扣除 padding 和 border,留给内容的宽度就是156px。这里假设没有其他最小尺寸约束,宽度也足够容纳这些边框与内边距。

margin 不在 border-box 的账里

再加上左右各 10px 的 margin,标准盒模型的横向占位会变成 264px;border-box 的横向占位则是 220px。在这个普通水平布局例子里,margin 都是在边框外额外留下的间距。

因此,不能把 border-box 理解成“width 已经包含所有东西”。它改变的是 width 对内容区、内边距、边框的计算方式,不负责把外边距一起装进去。

项目里常见的统一设置是下面这样。CSS 本身就是浏览器的布局语言,这里不提供功能不对应的 Python 版本。

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

注意带上伪元素。否则组件主体和它的装饰元素可能用着不同的尺寸规则。

为什么用了 border-box 还是会溢出?

咱们再把输入框换成一张卡片,卡片里放一条没有空格的长地址。border-box 能帮你算清卡片的边框盒,却不会自动替这条地址决定怎么换行。

如果卡片是 Flex 子项,还要检查它的自动最小尺寸。必要时让需要收缩的子项使用 min-width, 0,并对具体文本设置合适的换行规则;不要看到溢出就给所有元素加 overflow, hidden,把内容和焦点轮廓一起剪掉。

排查时可以先在开发者工具里看内容区、padding、border 和 margin 的数值,再检查最终计算宽度、父容器宽度以及 min-width。这样能区分“盒模型多算了空间”和“内容不允许收缩”,处理方法也就清楚了。

本题机制参考,MDN,CSS 盒模型。

面试官继续追问

width, 100% 加 padding,一定会超出父元素吗?

不一定。content-box 下,指定宽度之外还会加 padding 和 border;border-box 下它们包含在指定宽度里。最终是否溢出还受 margin、最小尺寸和布局方式影响,不能只看 100%。

垂直 margin 能直接相加吗?

普通块布局中,符合条件的垂直外边距可能合并;水平方向通常不能照这个规则推。盒模型计算和外边距合并是两个相关但不同的问题。

border-box 是不是更小,所以性能更好?

不是。它主要让尺寸管理更方便,并没有普遍的性能优势。选它是为了布局规则清楚,不是为了减少绘制成本。

面试速记卡

  • content-box,width 量内容区,padding 和 border 另外加。
  • border-box,width 包含内容、padding 和 border。
  • margin,始终在边框盒之外,不被 border-box 包含。
  • 溢出排查,盒模型、最小尺寸、父容器与内容换行一起看。
  • 验证方式,用开发者工具检查计算尺寸,不凭肉眼猜。

我是程序员Sunday。本文收录于 sunday面试指南,原文与配图可继续阅读。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 9:36:16

Java策略模式实战:从if-else重构到可扩展设计

1. 策略模式初探:为什么我们需要它? 作为一名在Java领域摸爬滚打多年的开发者,我见过太多因为条件分支泛滥而变得难以维护的代码。还记得刚入行时接手的一个电商项目,运费计算逻辑里嵌套了7层if-else,每次新增用户类型…

作者头像 李华
网站建设 2026/10/14 9:36:14

Java实现Oracle数据库表结构导出:JDBC元数据提取与文档生成

1. 项目缘起与整体设计思路 但凡在数据密集型项目里摸爬滚打过几年的人,几乎都绕不开一个需求:把某个数据库里的表结构完整地“搬”出来,变成一份可读、可存档、可对比的文档。我最近接手的一个数据治理项目就碰到了这个场景——需要定期对Or…

作者头像 李华
网站建设 2026/10/14 9:36:11

CCS激光焊接整线 供给方交付能力对照

CCS激光焊接整线 供给方交付能力对照 这篇文章讲的是:所谓 CCS 激光焊接整线,是指覆盖集成母排从上料、清洗、热铆、激光焊接到检测、数据追溯全工序链的设备组合。本文要回答的问题是,承接这类整线方案的供给方有哪几类,各类在工…

作者头像 李华
网站建设 2026/10/14 9:36:03

GrapesJS中文输入优化:文本监听插件开发实践

1. 项目背景与痛点解析在可视化编辑器开发领域,GrapesJS 是一个广受欢迎的框架,它提供了强大的拖拽式页面构建能力。但在实际业务场景中,特别是涉及中文等复杂输入法的场景下,原生 GrapesJS 的文本输入监听机制存在明显缺陷。1.1 …

作者头像 李华
网站建设 2026/10/14 9:35:20

litellm统一模型调用中间层:多模型路由与成本追踪实战

1. 从一个“模型调用中间层”说起第一次接触 litellm 是在一个多模型混用的项目里。当时的需求很朴素:同一个业务逻辑,今天调 A 家的模型,明天可能要换成 B 家的,后天又得接一个本地部署的开源模型做兜底。如果每换一次都要改一遍…

作者头像 李华
网站建设 2026/10/14 9:35:16

从模糊代号到实时分析系统:rea模块的架构设计与性能调优实战

1. 从“rea”这个标题说起:一个被低估的缩写第一次看到“rea”这个标题,我承认自己愣了几秒。没有正文,没有关键词,没有摘要,就孤零零三个字母。但恰恰是这种极简的输入,反而让我觉得有意思——因为在实际工…

作者头像 李华