22

某些流畅的设计,尤其是那些涉及 %-width iFrames 的设计,似乎会在 Chrome 中导致一些奇怪的舍入类型错误(我有版本 21)。

这个小提琴演示了这个问题。将边框设置为整数像素值,当您要求它们时返回的值是略小于预期值的浮点数。

在 CodePen 中尝试完全相同的代码不会产生相同的结果,大概是因为 iFrame 和它周围的其他样式的设置方式不同。

(我也看到了基本宽度和高度属性的这种行为,尽管我无法在 jsFiddle 中复制这部分问题。)

这在 Firefox 或 IE8 中似乎不是问题。

关于具体是什么导致这种奇怪行为以及我如何解决它以获得真正的价值的任何想法?


情节变厚了。为了解决这个问题,我发现超过 10px 的值似乎不受问题的影响。

此外,根据@GionaF 的评论,它似乎在 Chrome 22 中正常工作。

4

5 回答 5

13

我目前无法在 Chrome 中重现这种行为,但这种行为很可能与Subpixel Rendering有关。本质上,Webkit 将使用整数数学进行计算,以避免浮点不精确。

目前似乎border不使用亚像素渲染,这可以解释为什么在新的 Chrome 版本中看不到这个问题。

于 2013-05-19T14:35:13.523 回答
12

要重现您的问题,我必须更改 Chrome 的缩放级别。将缩放级别更改回 100% 可以修复它。看来是个bug,计算的边框宽度总是小于定义的边框宽度,放大或缩小!

当缩放级别为 110% 时,您的 10px 边框的值为 10,但在 125% 时,它与您的 3px 边框有相同的问题。

编辑:Firefox 有同样的行为!

于 2013-05-24T16:29:44.393 回答
4

将所有元素的 box-sizing 设置为 border-box 有帮助吗?这将改变计算边界和填充不会影响宽度的盒子模型的方式。

*,
*:before,
*:after {
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box; }
于 2013-05-24T00:15:35.060 回答
0

我也遇到了inputs 和其他元素中的边框问题。花了一个小时后,我发现了导致此问题的意外原因。Bootstrap css 使用normalize css并且以下代码导致了此类问题:

hr {
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    box-sizing: content-box;
}

为了解决这个问题,我覆盖了 style.css 中的 css:

hr {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

hr规则实际上与inputs 无关,但它有效。这真是出乎意料的行为,试试吧,会奏效的。

于 2017-11-03T06:43:28.840 回答
0

我刚刚有另一个例子,铬(铬 76)由transform: translate().

<div class='container'>
    <div class="box-triangle"></div>
</div>

.box-triangle有一个::after元素塑造了一个边界三角形,它绝对位于.box-triangle(填充之后)的顶部。
如果我使用% on设置翻译.container并且生成的百分比不是整数,则.box-triangle边框将在其::after元素下方略微显示。

解决方案:使用 px 转换而不是 %,或确保容器尺寸的百分比是整数

编辑:如果直接应用转换,则会发生完全相同的事情.box-triangle(参见片段中的最后一个示例)

* {
  box-sizing: border-box;
}

body {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-around;
  min-height: 100vh;
  width: 100%;
  background-color: #e55039;
  font-size: 16px;
}

.box-triangle {
  position: relative;
  margin: 0;
  color: #f7f1e3;
  background-color: #227093;
  font-size: 20px;
  margin: 0;
  padding: 1em;
  border: 5px solid white;
}

.box-triangle::after {
  content: "";
  position: absolute;
  height: 0;
  width: 0;
  margin: 0;
  border: solid transparent;
  left: 50%;
  bottom: 100%;
  border-bottom-color: #227093;
  border-width: 1.5em;
  -webkit-transform: translate(-50%, 0);
  transform: translate(-50%, 0);
}

[class^='container'] {
  margin: 20px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.container-1 {
  position: relative;
  height: 10.5rem;
  width: 20rem;
  /* transform: translate(1%, 1%); */
}

.container-2 {
  position: relative;
  height: 10.5rem;
  width: 20rem;
  transform: translate(0, 5%);
}

.container-3 {
  position: relative;
  height: 10rem;
  width: 20rem;
  transform: translate(0, 5%);
}

.container-4 {
  position: relative;
  height: 168px;
  width: 320px;
  transform: translate(0, 5%);
}

.container-5 {
  position: relative;
  height: 168px;
  width: 320px;
  transform: translate(0, 8px);
}

.noContainer {
  position: relative;
  height: 168px;
  width: 320px;
  transform: translate(0, 5%);
}
<div class='container-1'>
  <div class="box-triangle">no translate + container height: 10.5 rem (168px)</div>
</div>

<div class='container-2'>
  <div class="box-triangle">translate(0, 5%) + container height: 10.5 rem (168px)</div>
</div>

<div class='container-3'>
  <div class="box-triangle">translate(0, 5%) + container height: 10rem (160px)</div>
</div>

<div class='container-4'>
  <div class="box-triangle">translate(0, 5%) + container height: 168px</div>
</div>

<div class='container-5'>
  <div class="box-triangle">translate(0, 8px) + container height: 168px</div>
</div>

<div class="box-triangle noContainer">No container + translate(0, 5%) + height: 168px</div>

于 2019-09-20T14:29:36.140 回答