css 网格中的正方形旋转会产生间隙

square rotate in css grid creates gaps

在 css 网格内旋转正方形 div 会产生间隙。为什么?

这是一个简单的例子:

div {
    height:100%;
    width: 100%;
    margin:0;
    display:block;
}

.square{ 
    background: skyBlue;
}

.rotate{
    transform:rotate(180deg);
}

#grid {
    display: grid;
    height:100vmin;
    width: 100vmin;
    grid-template-rows: repeat(6, 1fr);
    grid-template-columns: repeat(6, 1fr);

    background: white;
    border: 1px solid black;
    margin: auto;
}
<div id=grid>
     <div style="grid-row: 1; grid-column:2">normal</div>
     <div class="square" style="grid-row: 2; grid-column:2"></div>
     <div class="square" style="grid-row: 3; grid-column:2"></div>
     <div class="square" style="grid-row: 4; grid-column:2"></div>


     <div style="grid-row: 1; grid-column:4">rotated (180deg)</div>
     <div class="square rotate" style="grid-row: 2; grid-column:4"></div>
     <div class="square rotate" style="grid-row: 3; grid-column:4"></div>
     <div class="square rotate" style="grid-row: 4; grid-column:4"></div>
</div>
在截取的代码中,可以看到 右侧列网格之间的小间隙 。 只有旋转的网格之间似乎有间隙,而“正常”(未旋转)网格的左列看起来很平滑。

为什么旋转后会出现空隙? 我该如何解决?

能否看到细线取决于browser/screen/zoom级别。

例如,在 Chrome 上,我放大了你的代码片段,然后这条线来来去去。

我觉得这个问题就像一个舍入error/edge的效果。系统正在尝试找出如何处理部分像素 - 在这种情况下,蓝色元素的高度是通过计算获得然后旋转的网格 space 的百分比。它并不是每次都得出一个精确的整数。在现代屏幕上,它必须转换为一个 CSS 像素可以是几个屏幕像素。有时一些屏幕像素 'get left behind'。 (注意细线很细,还不到一个CSS像素)。

查看您的代码的一种怪异方法是将旋转的 div 的大小增加几个像素并相应地重置其位置。这可能适合也可能不适合您的现实生活情况。

div {
  height: 100%;
  width: 100%;
  margin: 0;
  display: block;
}

.square {
  background: skyBlue;
}

.rotate {
  transform: rotate(180deg);
}

#grid {
  display: grid;
  height: 100vmin;
  width: 100vmin;
  grid-template-rows: repeat(6, 1fr);
  grid-template-columns: repeat(6, 1fr);
  background: white;
  border: 1px solid black;
  margin: auto;
}

.rotate {
  height: calc(100% + 2px);
  width: calc(100% + 2px);
  margin-top: -1px;
  margin-left: -1px;
}
<div id=grid>
  <div style="grid-row: 1; grid-column:2">normal</div>
  <div class="square" style="grid-row: 2; grid-column:2"></div>
  <div class="square" style="grid-row: 3; grid-column:2"></div>
  <div class="square" style="grid-row: 4; grid-column:2"></div>


  <div style="grid-row: 1; grid-column:4">rotated (180deg)</div>
  <div class="square rotate" style="grid-row: 2; grid-column:4"></div>
  <div class="square rotate" style="grid-row: 3; grid-column:4"></div>
  <div class="square rotate" style="grid-row: 4; grid-column:4"></div>
</div>