CSS 尺寸 - 1cm != 1cm

CSS dimensions - 1cm != 1cm

好奇地想弄清楚为什么这似乎不起作用。

我应用了 CSS 背景渐变,例如:

.element {
  width: 10cm;
  height: 5cm;
  background-size: 1cm;
  background-image: repeating-linear-gradient(
    90deg,
    red,
    black
  );
}
.child {
  width: 1cm;
  height: 1cm;
  background: green;
  outline: 1px solid black;
  float:left;
}
.child:before {
  content: "1cm";
  color: white;
}
<div class="element">
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
</div>

现在,当查看时(这是来自 Chrome,但我在其他浏览器中看到类似的结果),线条与元素不匹配。我希望看到 10 个均匀 spaced "backgrounds" 重复,right-most 正好与元素的边缘对齐。

是什么导致了这个额外的 space?

http://codepen.io/anon/pen/JoLVem

在 codepen 示例中,我有一个具有我想要的背景的元素,该元素有 10 个 children。 Parent是10cm,children是1cm。恰好 10 children 适合 parent 因为 1cm * 10 = 10cm。

然而,背景正在重复 1 厘米宽的渐变。这应该会导致在 10 厘米宽的元素上精确地重复 10 次背景。如您所见,每个背景图像都小于 1 厘米。

CSS units don't necessarily equate to exact dimensions。最后,屏幕上显示的每个 CSS 测量值最终都以像素为单位进行计算。

CSS 假定屏幕将具有 96 dpi,因此使用 inptpc 通常是安全的,尽管不同的显示器分辨率或用户定义缩放可能会影响您的结果。

但公制单位是另一回事,因为没有精确的像素计算,因此浏览器会四舍五入以提供接近指定测量值的结果。这是 W3C only recommends px, %, or em units 用于屏幕目标布局的原因之一。

在你的例子中:

1cm ≈ 37px or 38px 
10cm ≈ 370px

唯一的选择是在每毫米 3 或 4 像素的毫米级别进行标准化。这不好,因为它不会让你在更大的水平上接近厘米测量值。

正如您在下面的示例中看到的,这在以英寸为单位时可以正常工作,因为对像素的计算是精确的:

.element {
    background-image: repeating-linear-gradient(
     90deg,
     white,
     black 100%
    );
    background-size: 1in;
    width: 5in;
    height: 4in;
}

.child {
  width: 1in;
  height: 1in;
  background: green;
  outline: 1px solid black;
  float:left;
}
.child:before {
  content: "1in";
  color: white;
}
<div class="element">
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
</div>

给背景元素一个百分比宽度:

.element {
  background-image: repeating-linear-gradient(90deg, white, black 100%);
  background-size: 10%;
  width: 300px;
  height: 100px;
  border: 1px solid #000000;
}
<div class="element"></div>

设置 background-size :10% 将修复它。


也就是说,如果您使用像素值,它会正常工作

.element {
  background-image: repeating-linear-gradient(90deg, white, black 100%);
  background-size: 30px;
  width: 300px;
  height: 100px;
  border: 1px solid #000000;
}
<div class="element"></div>