【问题标题】:Why does fractional pixel padding give the parent element additional width?为什么分数像素填充给父元素额外的宽度?
【发布时间】:2017-03-28 18:46:50
【问题描述】:

这最好通过我的JSFiddle 来解释。我正在使用 Chrome。

我有一个 inline-block 容器元素。它的内部是内联元素(跨度)。

<div id="container">
  <span class="star">★</span><span class="star">★</span>
</div>

当我给星类填充 5px 时,容器的边框按预期呈现在最后一个元素的边缘。

当我将内边距更改为 5.5 或许多其他十进制值之一时,容器的一侧似乎有额外的宽度(内部元素越多,这种效果越深)。

实际上,我怀疑容器没有额外的宽度,但内部元素的宽度太小了。请注意 Chrome 的元素检查器显示的蓝色框比第一个示例中的要窄。

当元素内联时:

当元素是 inline-block 时:

这是怎么回事?

【问题讨论】:

  • 除非 Google Chrome 的一位工程师遇到了您的问题(您应该将其标记为 Chrome,顺便说一句),否则我怀疑您除了猜测 “不推荐使用小数像素”。真的吗,伙计们?你认为vw 到底是什么意思?我会告诉你。 小数像素。 99% 的时间。 回到问题本身,如果你真的对合适的技术感兴趣,最好在 Crhom[e/ium] 论坛上提问而不是在这里提问。回答。但是,我确实希望我错了,它会在这里得到正确的答案。

标签: html css google-chrome pixel


【解决方案1】:

小数像素是允许的,可以参考这个答案:Can a CSS pixel be a fraction?

但是,这取决于浏览器如何解释它。如果您在 IE11 中打开小提琴,则宽度是正确的(有趣的是 IE11 在某些方面“更好”)。

【讨论】:

  • Edge 38.19 也可以。很奇怪。
【解决方案2】:

好的,让我们试着得出一个合理的结论。

使用小数像素并没有错,但它并不能完全按照我们的预期工作,因为大多数浏览器会将小数四舍五入为整数。

我希望我能给你一个关于这件事的官方参考,但我不能。它不是一个标准,它只是一些浏览器决定呈现它的方式。 (如果有人能找到参考,请随时更新答案)

现在,记住这些信息:

这只是一个数学问题: (此措施在谷歌浏览器中计算)

没有填充,您的星号的宽度为13.33px。您正在添加5.5px 的周围填充。所以:

     FIRST STAR            SECOND STAR
--------------------   -------------------
  5.5 | 13.33 | 5.5     5.5 | 13.33 | 5.5
--------------------   -------------------

总结: 5.5 + 13.33 + 5.5 + 5.5 + 13.33 + 5.5 = 48.66

所以浏览器告诉父元素它的内部内容总和为48.66px,但根据我们的考虑,它将呈现为49px。

如果是这样,那么 49px 元素的大小应该与您的示例完全相同,因为它是:

#container { 
  display: inline-block;
  border: dashed 1px red;
}

#compare {
  border: dashed 1px blue;
  width: 49px;
  text-align: center;
  margin-bottom: 10px;
}

.star {
  padding: 5.5px;
  background-color: lightgray;
}
<div id="compare">49px</div>

<div id="container">
  <span class="star">★</span><span class="star">★</span>
</div>

结论:

你可能会问,为什么不把内部内容也四舍五入到总共 49px?

显然,浏览器会根据小数向上或向下舍入,因此13.33px 将在内部元素上四舍五入为13px,导致其渲染小于其父元素。

【讨论】:

  • 首先,在某些值下,空间看起来比1px 多。也许渲染错误加起来?可能是错觉,但我对此表示怀疑。我在这台机器上没有合适的工具,但我会测量它。其次,为什么 Chrome 只对inline 内容有这个"error",对inline-block 内容没有?第三,无论您如何使用小数,方框都不会四舍五入。它永远不会更小。如果你说的是真的,它有时会比星星小半个像素。
  • 在 Chrome 中检查您的示例,每颗星都有24.34px(根据 Chrome 工具工具提示)。根据相同的工具提示,#container52.69px。我们正在谈论4.01px
  • 我的 Chrome 显示每颗星的宽度为 23.33 (image.ibb.co/nctjFa/Sem_t_tulo.png)。正如你所说,它实际上应该是24.3,因为13.3 + 5.5 + 5.5 = 24.3。这意味着 Chrome 将 5.5 计算为 5px。
【解决方案3】:

对 safari 的快速测试表明它们很合适。看:

解决这个问题的最佳方法是为星星添加边框。看这里:

#container { 
  display: inline-block;
  border: dashed 1px red;
}

#container2 { 
  display: inline-block;
}
.star {
  /* This creates extra width. */
  padding: 5.5px;
  background-color: lightgray;
}

.star2 {  
  /* This is fine. */
  padding: 5px;
  background-color: lightgray;
}

.star3 {  
  /* This is fine. */
  padding: 5.5px;
  border-top: dashed 1px red;
  border-bottom: dashed 1px red;
  background-color: lightgray;
}
.star3:first-child {  
  border-left: dashed 1px red;
}

.star3:last-child {  
  border-right: dashed 1px red;
}
<div id="container">
  <span class="star">★</span><span class="star">★</span>
</div>

<div id="container">
  <span class="star2">★</span><span class="star2">★</span>
</div>

<div id="container2">
  <span class="star3">★</span><span class="star3">★</span><span class="star3">★</span>
</div>

【讨论】:

  • 这个问题很清楚。他没有问这是否是好的做法。他甚至没有说他正在使用它。 OP问“发生了什么事?”恕我直言,您的回答并未回答问题。
  • 我认为它解决了“发生了什么问题”。因为问题是小数像素渲染@AndreiGheorghiu
  • 我对这个问题有一些了解,它最初表现在一个以 em 为大小的元素上。由于 em 几乎总是计算小数像素,并且是一个广泛使用的单位,因此说“不要那样做”并不能真正帮助理解问题的本质。
【解决方案4】:

#container {
  display: inline-block;
  border: dashed 1px red;
}

.star {
  /* This creates extra width. */
  /*  padding: 4.48px 6.72px; */
  /* This is fine. */
  /*  padding: 5px; */
  /* This creates extra width. */
  padding: 5.5px;
  display: inline-block;
  background-color: lightgray;
}
<div id="container">
  <span class="star">★</span><span class="star">★</span>
</div>
#container {
  display: inline-block;
  border: dashed 1px red;
}

.star {
  /* This creates extra width. */
  /*  padding: 4.48px 6.72px; */
  /* This is fine. */
  /*  padding: 5px; */
  /* This creates extra width. */
  padding: 5.5px;
  display: inline-block;
  background-color: lightgray;
}

【讨论】:

  • 如果你仔细阅读这个问题,OP 已经知道 inline-block 解决了这个问题。他问发生了什么事?。你能试着回答这个问题吗?这是一个理论问题,而不是实际问题。
猜你喜欢
  • 2018-01-04
  • 2014-11-25
  • 2014-07-12
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2023-03-27
  • 2016-03-15
  • 2011-03-07
相关资源
最近更新 更多