CSS3 box-sizing:margin-box; 为什么不?

Web*_*ner 135 css layout w3c position css3

我们为什么不拥有box-sizing: margin-box;?通常当我们放入box-sizing: border-box;样式表时,我们真正意味着前者.


例:

假设我有一个2列页面布局.两列的宽度都是50%,但它们看起来有点难看,因为没有排水沟(中间有间隙); 下面是CSS:

.col2 {
    width: 50%;
    float: left;
}
Run Code Online (Sandbox Code Playgroud)


要应用排水沟,您可能会认为我们可以在2列中的第一列上设置右边距; 这样的事情:

.col2:first-child {
    margin-right: 24px;
}
Run Code Online (Sandbox Code Playgroud)

但这会使第二列换行到新行,因为以下情况属实:

50% + 50% + 24px > 100%
Run Code Online (Sandbox Code Playgroud)

box-sizing: margin-box;通过在元素的计算宽度中包含边距来解决此问题.如果不是更有用,我会发现这非常有用box-sizing: border-box;.

小智 53

你不能用width: calc(50% - 24px);你的cols?然后设置你的边距.

  • 它高度依赖于浏览器.可能在2020年左右,ie15将支持它,你也可以在你的工作中使用它:-( (5认同)

pet*_*ica 16

我想我们可以有一个box-sizing: margin-box.css框模型准确显示了框架边距的位置.

存在一些小问题 - 例如,边距框可以重叠 - 但它们并不难解决.

我认为,情况是一样的,因为我们可以通过看overflow-xoverflow-y组合,与表细胞的绝对positionied的div,用最小的组合|最大宽度|高度与盒大小,依此类推.

有一些功能,非常简单的功能,浏览器开发人员根本没有开发.

恕我直言,box-sizing: margin-box是一个非常有用的功能.另一个有用的特性是box-sizing: padding-box,它至少存在于标准中,但它没有在任何主流浏览器中实现.甚至没有最新的镀铬!


注意:@Oriol的评论:Firefox确实实现了box-sizing:padding-box.但其他人没有,它已从规范中删除.Firefox将在50版中删除它.悲伤.

  • Firefox确实实现了`box-sizing:padding-box`.但其他人没有,它已从规范中删除.Firefox将在50版中删除它.悲伤. (2认同)

Mor*_*ney 6

顶部的人要求在整体宽度上添加边距,包括填充和边框.问题是,在使用时,边框应用于框外,填充和边框不适用border-box.

我试图实现这个border-margin想法.我发现如果使用保证金你可以添加一个类.last到最后一项(有保证金,然后应用零保证金,或使用:last-child/:last-of-type).或者一直添加相等的边距(类似于上面的填充版本).

请参阅此处的示例:http://codepen.io/mofeenster/pen/Anidc

border-box计算元素的宽度+其填充+边界作为总宽度.因此,如果您有2 div秒宽50%,它们将相邻.如果你8px给他们添加填充,那么你将有一个阴沟16px.将它与包裹元素(也有填充物)相结合8px,你将拥有一个布局合理的网格,周围有相同的排水沟.

请在此处查看此示例:http://codepen.io/mofeenster/pen/vGgje

后者是我最喜欢的方法.


Plu*_*mer 5

我相信所有这些都是显而易见的,但我还是会打出来,因为……好吧,我需要练习。以下结果是否与以下结果一样有效box-sizing: margin-box;

.col2 {
    width: 45%;
    height: 90%;
    margin: 5% 2.5%;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    float: left;
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/Fg3hg/

box-sizing用于控制从哪一点开始将填充和边框评估为元素的整体大小。因此,虽然包含px具有%宽度的边距(通常情况下总是如此)并不符合犹太教规,但计算相对百分比量应该是多少更容易,因为您不必将填充和边框合并到定义的宽度中。

  • margin-box 之类的用例是启用混合百分比宽度和像素边距。如果你想要两个 50% 的框,它们之间有 1px 的边距,这不能用 1% 的相似边距来实现 - 一些小屏幕尺寸会将 1% 舍入到 0 像素,突然间你没有边距。正如@Slouch 所示,我们真正需要的是浏览器对 calc() 或 flexbox 模型的更多支持。 (9认同)
  • 你的建议是一种解决方法。当您处理复杂的布局时,这不是编写 CSS 的理想方式。您假设设计师或作者想要在他们的设计中使用百分比。同样不管这个问题,即使您使用 calc() 函数使用像素边距计算间距,它仍然会限制设计人员,因为他们必须预先确定装订线是什么,而不是允许使用 CSS 覆盖它。 (2认同)