DigitalOcean 为您的旅程的每个阶段提供云产品。 从 免费试用 200 美元! 开始使用
CSS 中的 box-sizing
属性控制如何处理它应用于的元素的 盒子模型。
.module {
box-sizing: border-box;
}
使用它的更常见方法之一是将其应用于页面上的所有元素,包括 伪元素。
*, *::before, *::after {
box-sizing: border-box;
}
这通常被称为“通用盒子大小”,它是一种很好的工作方式! 您设置的(字面上的)width
就是您获得的宽度,无需进行心理运算和管理来自多个属性的宽度带来的复杂性。 我们甚至有 一个盒子大小意识日 围绕这里。
值
content-box
: 默认值。 宽度和高度值仅适用于元素的内容。 填充和边框添加到框的外部。padding-box
: 宽度和高度值适用于元素的内容及其填充。 边框添加到框的外部。 目前,只有 Firefox 支持padding-box
值。border-box
: 宽度和高度值适用于内容、填充和边框。inherit
: 继承父元素的盒子大小。
示例
此示例图像将默认的 content-box
(顶部)与 border-box
(底部)进行比较

图像之间的红线代表元素的宽度值。 请注意,具有默认 box-sizing: content-box;
的元素在将填充和边框添加到内容框的外部时会超出声明的宽度,而应用了 box-sizing: border-box;
的元素完全适合声明的宽度内。
使用盒子大小
假设您将元素设置为 width: 100px; padding: 20px; border: 5px solid black;
。 默认情况下,生成的框宽度为 150px。 这是因为默认的盒子大小模型是 content-box
,它仅将元素的声明宽度应用于其内容,并将填充和边框放置在元素框的外部。 这实际上会增加元素占用的空间量。
如果将 box-sizing
更改为 padding-box
,填充将被推入元素框内部。 然后,框将是 110px 宽,内部有 20px 的填充,外部有 10px 的边框。 如果您想将填充和边框都放到框内,可以使用 border-box
。 然后,框将是 100px 宽 - 10px 的边框和 20px 的填充都被推入元素框内部。
演示
更多信息
- CSS-Tricks 关于 盒子大小 的文章
- CSS-Tricks 关于 继承盒子大小 的文章
- MDN 文档
- Paul Irish 关于普遍使用 border-box
浏览器支持
Chrome | Safari | Firefox | Opera | IE | Android | iOS |
---|---|---|---|---|---|---|
任何 *† | 3 *† | 1 ‡ | 7 * | 8 * | 2.1 *† | 任何 * |
* 不支持 padding-box
† 较旧的版本需要 -webkit
前缀(Chrome 1-9、Safari 3-5、Android 2.1-3.x)
‡ 直到版本 28 需要 -moz
前缀,从版本 29 开始无需前缀。
我知道这不是最新的文章,但它仍然可以“被谷歌搜索到”,而且它有一个关键错误:任何 Firefox 版本都需要一个前缀,即使是目前的 Firefox Nightly 22。如果有人在不检查的情况下遵循作者的建议并删除前缀,该网站将在 Firefox 中完全崩溃。
抓住了,m_gol。
MDN 关于 box-sizing 的文章
正确,已修复。
在 29+ 中无前缀。在以下版本中使用前缀。
Firefox 27 之前需要浏览器前缀,Safari 5 之前需要前缀。
如前所述,Firefox 仍然需要前缀,另外还需注意/更新:浏览器支持中提到的 Firefox 错误已在 Firefox 17 中修复,正如同一 MDN 页面中提到的:https://mdn.org.cn/en-US/docs/Web/CSS/box-sizing
也写一下 box-sizing 属性如何影响各种 javascript 宽度/高度属性可能会有所帮助。虽然我知道 box-sizing 如何很好地影响 CSS 属性,但在 javascript 中,通常需要反复试验才能找到最适合该工作的属性。
我认为在第一种情况下(content-box),宽度应该是 150px(100px + 2 * 20px + 2 * 5px),而不是 140px。
我同意这个评论。
content-box
框的总宽度为:宽度 + 填充 + 边框。内容宽度设置为 100px,填充宽度设置为 20px **两侧**,边框宽度设置为 5px **两侧**。因此,正如 ngwdaniel 提到的,你的等式是(100px + 2 * 20px + 2 * 5px),结果为 150px。正确,已修复。
大家好,
我正在尝试应用此属性来解决我在以下页面中遇到的问题,
http://hdl.fitzroviadigital.co.uk/corporate-investment-banking/
主部分在部分 img 和 aside 之间创建了空白,但是即使将 box-sizing: border-box 应用于通用选择器,也无济于事,
有什么线索吗?
感谢分享这篇文章!
需要注意的是,Firefox 中关于 min / max-height 的错误从版本 17 开始似乎已修复。
干杯,
托马斯。
你好,
我在使用浮动 div 的 Safari 和 Seamonkey 中遇到了问题
) http://rh-balingen.de/FLUID-GRIDS/floating.html
高度不能是 %,而必须是 px。
) http://rh-balingen.de/FLUID-GRIDS/safari.html
在使用相对和绝对定位时,%是可以的。
) http://rh-balingen.de/FLUID-GRIDS/relative.html
我只是不明白,问题出在哪里……
只是需要注意的是,代码中 -moz-box-sizing 旁边的注释仍然是“Firefox 1,可能可以删除此”。应该说是“Firefox 1-28”。
-webkit 前缀适用于 Android 默认浏览器(Android 2.3.6)
这篇文章很好!但我对使用 box sizing 部分感到困惑。
实际上
内容宽度:100px;
填充:20px;
边框:5px;
总计:125px;
但你显示的是 150px,是如何发生的?
在你的等式中,你只加了一边的填充和边框。另一边也需要加上。填充在框的一边是 20px,在框的另一边也是 20px。所有填充都需要计算在内,因此必须加倍,总计 40px。边框也是如此。所以最后,计算结果是
100px 内容宽度
40px 总填充宽度(20px 左 + 20px 右)
10px 总边框宽度(5px 左 + 5px 右)
总计 150px
我有两个 div,为它们设置了相同的宽度,以及相同数量的列,并使用上面的 div 作为标题,下面的 div 作为主体。现在,如果为它们两者都删除填充,它们将获得相同的宽度。但是,如果我设置 padding: 10px;,它们会有 0.5px 的差异。我设置了 box-sizing,但问题仍然存在。
我刚刚注意到最新版本的 Firefox(50)删除了对 padding-box 的支持
https://mdn.org.cn/en-US/Firefox/Releases/50#Changes_for_Web_developers
帮助
我想在可变长度的测试字符串周围添加一个框,并将其全部保持在一行上。
我开始使用的 CSS 代码如下:
boxblueleft {
border: solid;
border-width: 1px;
border-color: #0000ff;
width: 200px;
min-width: 200px;
max-width: 600px;
padding-top: 0px;
padding-right: 25px;
padding-bottom: 0px;
padding-left: 0px;
position: relative;
top: 50%;
left: 50%;
transform: translateX(-50%);
box-sizing: border-box;
white-space: nowrap;
}
我可以通过调整 width、min-width 和 max-width 参数来预设实际宽度,但当最长字符串长度发生变化时,文本会溢出框宽度(当它变长时)或在字符串末尾留下一大段空白(当它变短时)…
请问有人可以指点我正确的方向吗?
帮助
我想在几个可变长度的测试字符串周围添加一个框,并将其全部保持在一行上。
我开始使用的 CSS 代码如下:
boxblueleft {
border: solid;
border-width: 1px;
border-color: #0000ff;
width: 200px;
min-width: 200px;
max-width: 600px;
padding-top: 0px;
padding-right: 25px;
padding-bottom: 0px;
padding-left: 0px;
position: relative;
top: 50%;
left: 50%;
transform: translateX(-50%);
box-sizing: border-box;
white-space: nowrap;
}
我可以通过调整 width、min-width 和 max-width 参数来预设实际宽度,但当最长字符串长度发生变化时,文本会溢出框宽度(当它变长时)或在字符串末尾留下一大段空白(当它变短时)…
请问有人可以指点我正确的方向吗?
谢谢,解释得很清楚。