Chrome中的奇怪边框宽度行为 - 浮点边框宽度?

时间:2012-10-12 16:33:51

标签: css google-chrome

某些流体设计,尤其是那些涉及%-width iFrames的流体设计,似乎会在Chrome中造成一些奇怪的舍入类型错误(我已经获得了第21版)。

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

尝试exact same code in CodePen并不会产生相同的结果,大概是因为iFrame及其周围的其他样式设置方式不同。

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

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

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


情节变浓。为了解决这个问题,我发现10px以上的值似乎不受此问题的影响。

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

5 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:11)

要重现您的问题,我必须更改Chrome的缩放级别。将缩放级别更改回100%可以修复它。它似乎是一个错误,计算出的边框宽度始终小于定义的边框宽度,放大或缩小!

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

编辑:firefox具有相同的行为!

答案 2 :(得分:4)

为所有元素设置box-sizing到border-box是否有帮助?这将改变计算框模型的方式,其中边框和填充不会影响宽度。

*,
*:before,
*:after {
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box; }

答案 3 :(得分:0)

我还遇到了input和其他元素中的边框问题。花了一个小时后,我发现意外的原因导致了这个问题。 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规则实际上与input无关,但它有效。这实际上是意想不到的行为,尝试并且会起作用。

答案 4 :(得分:0)

我刚刚有一个transform: translate()引起的铬(铬76)的例子。

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

.box-triangle有一个::after元素,其形状为border triangle,该元素绝对位于.box-triangle的顶部(在填充之后)。
如果我设置了在.container上加上的转换,并且所得到的百分比不是整数,则.box-triangle的边框将在其::after元素下稍微显示。 br />

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

Edit :如果将转换直接应用于.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>