【问题标题】:Why does box-sizing: border-box still show the border with a width of 0px? [duplicate]为什么 box-sizing:border-box 仍然显示宽度为 0px 的边框? [复制]
【发布时间】:2021-03-19 08:10:44
【问题描述】:

在 CSS 中使用 box-sizing: border-box 时,我假设元素的总宽度将在其“宽度”值中定义。所以如果我说一个分割的宽度是20px,右边框是10px,我最终会得到一个占据20px空间的盒子,其中一半是右边框。将它推到我将宽度设置为 10px 和右边框的位置,就像这里一样:

#box {
  overflow: hidden;
  width: 10px;
  box-sizing: border-box;
  height: 50px;
  background: black;
  border-right: 10px solid red;
}
<div id="box"></div>

该框将仅包含红色边框。当我将宽度设置为 0px 时会发生什么?我以为它会让整个事情消失,但是不,结果和上面的完全一样:

#box-1 {
  overflow: hidden;
  width: 10px;
  box-sizing: border-box;
  height: 50px;
  margin-bottom: 10px;
  background: black;
  border-right: 10px solid red;
}

#box-2 {
  overflow: hidden;
  width: 0px;
  box-sizing: border-box;
  height: 50px;
  background: black;
  border-right: 10px solid red;
}
<div id="box-1"></div>
<div id="box-2"></div>

View on jsFiddle

我的问题是这是否是预期的行为。对我来说似乎不一致。我想让一个盒子消失,只控制宽度/高度。

【问题讨论】:

  • 你用的是什么浏览器?并非所有浏览器都直接支持 box-sizing。有些有自己专有的盒子大小,例如-moz-box-sizing 和-webkit-box-sizing。如果您想让某些东西消失,请考虑使用display:none; 或visibility:hidden;
  • 我也可以用锤子打碎鸡蛋……但我尽量不这样做:)开玩笑,我真的需要元素像那样消失……想想缝。 ..
  • 您的意思是某种动画,您会慢慢将宽度减小到零?不完全确定你所说的狭缝是什么意思。如果您可以详细说明您正在尝试实现的目标,那么可能还有另一个更合适的解决方案。与大多数事情一样,有很多方法可以做到这一点。也许羊角锤是一个糟糕的选择,但也许撕裂锤就在你的小巷里。

标签: css border-box


【解决方案1】:

内容区域是减去边框宽度后剩下的任何内容。

内容的宽度和高度是通过减去边框来计算的 以及指定“宽度”的各个边的填充宽度 和“高度”属性。

指定宽度 = 10 像素
边框宽度 = 10 像素
内容宽度 = 指定宽度 (10 px) - 边框宽度 (10 px)
内容宽度 10 - 10 = 0

指定宽度 = 0 像素
边框宽度 = 10 像素
内容宽度 = 指定宽度 (0 px) - 边框宽度 (10 px)
内容宽度 0 - 10 = -10(这将删除边框使用的 10 px)

但是

由于内容的宽高不能为负数([CSS21],section 10.2),这个计算的下限为 0。

指定宽度 = 0 像素
边框宽度 = 10 像素
内容宽度 = 指定宽度 (0 px) - 边框宽度 (10 px)
内容宽度 0 - 10 = 0(不移除边框使用的 10 px)

如果您不想使用display:none; 或visibility:hidden;,则需要将width:XX; 和border-right:XX; 都设置为零。

【讨论】:

  • 谢谢您的回答;我猜,关键是要理解,由于负面结果,边界仍然存在。但是,在您看来,您认为这是一种一贯的行为吗?我想知道,因为在最后一种情况下,边框框和内容框的行为相同,这对我来说似乎很违反直觉。你怎么看?
  • 我同意,问题是你不能允许负大小的块,所以这就是他们决定处理它的方式。我想不出更好的选择。
  • 所以border-box我们并没有真正设置边框+填充+内容的大小,我们仍然只设置内容的大小,但告诉浏览器将边框和填充吸收到内容中。呵呵。
【解决方案2】:

看看这个截图:

正如您所期望的那样,整个框是100x100px,但实际宽度是90px + 10px 右边框。所以当你将宽度设置为0时,宽度仍然是0(不能有负宽度),但你仍然有10px的边框。

【讨论】:

  • 但是为什么还有边框呢?因为在规范之后它不应该在那里:“内容的宽度和高度是通过从指定的'width'和'height'属性中减去各自边的边框和填充宽度来计算的。因为内容的宽度和高度不能为负数([CSS21],第 10.2 节),此计算的下限为 0。” see border-box
  • 就是这样。内容宽度(不包括边框或内边距的宽度)为 0,因为在减去边框和内边距后,您的宽度为负数。需要注意的是你如何定义“内容”。
  • ...所以元素的总“宽度”应该设为 0,对吧?如果通过定义宽度:10px 和边框右:10px,我得到一个 10px 的框,如果我将宽度定义为 0px,我应该得到一个 0px 的框,对吗?重新引用 Paul Irish:“呃。如果我说宽度是 200 像素 [0 像素],天哪,即使我有 20 像素的填充 [边框],它也会是 200 像素 [0 像素] 宽的盒子。” * { box-sizing: border-box } FTW
  • 不,“内容宽度”将为0。总宽度为内容+填充+边框。
  • 不,不是,我使用的是 box-sizing:border-box。请阅读有关该物业的信息。
猜你喜欢
  • 2020-07-02
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 2012-07-21
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多