默认 content-box 下 width 仅指内容区,padding 和 border 额外增加总宽;切换 border-box 后 width 表示总宽,padding 和 border 向内压缩。
因为默认
是
,
和
会额外加在你写的
外面——这不是 bug,是标准行为;切到
后,
才真正代表“总宽度”,
往里挤,不撑大盒子。
为什么 padding 会让 width “失效”
浏览器默认用
模型:
只管内容区,
和
是“附加项”。比如:
这个
实际占宽是
。你看到它“撑大了”,其实是盒模型在按规则计算。
这种行为在响应式布局中尤其危险:比如
+
→ 实际超父容器 40px
或
子项设了
,但因
额外叠加,列宽总和可能突破 100%
表单控件(如
)在 Chrome/Firefox 中默认是
,加
后极易横向溢出
如何正确切换为 border-box
全局重置最稳妥,避免漏写、覆盖混乱:
立即学习
“
前端免费学习笔记(深入)
”;
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
必须包含
和
,否则伪元素带
或
时仍会撑开(比如用伪元素做装饰边框)
不要只写
——它不覆盖伪元素
第三方 UI 库(如 Ant Design、Bootstrap 5+)通常已内置该重置,重复声明不会报错,但调试时可能干扰样式来源判断
老版微信 X5 内核(v3.7 以下)对通配符伪元素支持不稳定,可加兜底:
+ 后代选择器
哪些元素必须单独再声明
不继承,且部分原生元素的 UA 样式会强行覆盖全局设置:
、
、
、
:不同浏览器默认值不一致,务必显式重写
、
、
:虽支持
,但默认是
,加
后容易在卡片布局中错位
、
:部分浏览器下对
行为有细微差异,复杂表格建议实测
元素(如
、
)完全不支持
,别浪费时间设置
border-box 下 width 计算的实际效果
启用后,
就是最终渲染宽度,
和
从里面“扣”:
这个按钮总宽严格为
,内容区实际只有
。
用
手动减
是反模式——
的意义就是免去这种计算
、
返回的始终是最终渲染宽度,与
设置一致,JS 无需适配
Flex/Grid 容器里的子项仍受此影响:如果
的 item 是
,它的实际占位仍是
真正难处理的不是切换本身,而是混合状态:全局设了
,但某个第三方组件内部硬编码了
,又没加
,结果尺寸推算全乱。遇到这类问题,直接查开发者工具的 Computed 面板,看
最终值是多少,比猜更可靠。
box-sizingcontent-boxpaddingborderwidthborder-boxwidthpaddingcontent-boxwidthpaddingborder.card {
width: 300px;
padding: 16px;
border: 1px solid #ccc;
}.card300 + 16×2 + 1×2 = 334pxwidth: 100%padding: 20pxflexgridwidth: 100%paddinginputcontent-boxpadding*,
*::before,
*::after {
box-sizing: border-box;
}*::before*::afterpaddingborder* { box-sizing: border-box; }html { box-sizing: border-box; }box-sizinginputtextareaselectbuttonimgvideocanvasbox-sizingcontent-boxpaddingtdthborder-boxsvgrectcirclebox-sizingwidthpaddingborder.btn {
width: 120px;
padding: 8px 16px;
border: 2px solid #333;
box-sizing: border-box; /* 必须有 */
}120px120 − 16×2 − 2×2 = 84pxcalc()paddingborder-boxoffsetWidthgetBoundingClientRect().widthbox-sizingflex-basis: 200pxcontent-box200 + padding + borderborder-boxbox-sizing: content-box!importantbox-sizing