【问题标题】:Scale transform causes rendering gap with flex layout缩放变换导致与 flex 布局的渲染间隙
【发布时间】:2017-11-16 22:04:52
【问题描述】:

我正在使用 flex 布局来呈现具有 3 个大小均匀的列的容器 div。在我应用比例变换之前,它的工作原理与我预期的一样。当容器按比例缩小时,内容框之间会出现细小的间隙。该问题发生在 MacOS Chrome 和 Safari 上,但不是 Firefox。我相信我看到了一个渲染错误,但想知道是否有人可能有解决方法的想法。

这是一个非常简化的示例,用于演示 Chrome 中的问题:

body {
  background: black;
  margin: 0;
}
.scale {
  transform: scale(0.703125);
}
.container {
  display: flex;
  width: 600px;
  height: 200px;
}
.column {
  flex-grow: 1;
  background:#ff0000;
}
.column:nth-child(2) {
  background: #ff3333;
}
<div class="container scale">
  <div class="column"></div>
  <div class="column"></div>
  <div class="column"></div>
</div>
<div class="container">
  <div class="column"></div>
  <div class="column"></div>
  <div class="column"></div>
</div>

【问题讨论】:

标签: css google-chrome flexbox css-transforms


【解决方案1】:

考虑解决 CSS 框阴影问题。

这是一个使用box-shadow 属性的spread-radius 值的示例。

body {
  background: black;
  margin: 0;
}

.container {
  display: flex;
  height: 200px;
}

.column {
  flex-grow: 1;
  background: #ff0000;
}

.scale {
  transform: scale(0.703125);
  overflow: hidden;                 /* new */
}

.scale>div:nth-child(2) {
  box-shadow: 0 0 0 1000px #ff0000; /* new */
}

.column:nth-child(2) {
  background: orange;               /* easier to see */
}
<div class="container scale">
  <div class="column"></div>
  <div class="column"></div>
  <div class="column"></div>
</div>
<div class="container">
  <div class="column"></div>
  <div class="column"></div>
  <div class="column"></div>
</div>

以下是此方法工作原理的详细说明:

【讨论】:

  • 您对问题的解释并不准确,但使用阴影解决问题的想法非常好。您能否更新您的答案以消除小数位是问题的想法? (只是想想将来有人会遇到这个问题。不想传播虚假信息。)
  • ...就其价值而言,一个简单的 1px 阴影似乎可以解决问题。 box-shadow: 0 0 0 1px #ff0000;
  • 对于任何一起玩的人,这里有一个最终的 Codepen,展示了一个应用了这种解决方法的更复杂的示例:codepen.io/Ghazgkull/pen/BZLVmO
  • 很高兴它对你有用。是的,1px 可能就足够了。但是容器上有overflow: hidden,任何多余的都会被剪掉,所以任何值都可以工作。
  • overflow: hidden 不适用于 box-shadow。所以 1000px 实际上添加了一个 1000px 的 box-shadow。 :) 如果您有兴趣,这里有一个 1000px 阴影的示例……如果您检查列,您会看到框阴影延伸到它们之外。 codepen.io/Ghazgkull/pen/vZXrMr
【解决方案2】:

一种解决方法是在该元素上使用与其中一种颜色匹配的背景,这样页面的背景就不会显示在元素之间。

body {
  background: black;
  margin: 0;
}
.scale {
  transform: scale(0.703125);
}
.container {
  display: flex;
  width: 600px;
  height: 200px;
}
.column {
  flex-grow: 1;
  background:#ff0000;
}
.column:nth-child(2), .scale {
  background: #ff3333;
}
<div class="container scale">
  <div class="column"></div>
  <div class="column"></div>
  <div class="column"></div>
</div>
<div class="container">
  <div class="column"></div>
  <div class="column"></div>
  <div class="column"></div>
</div>

【讨论】:

  • 感谢您的想法。但在我的真实示例中,这个容器是一个叠加层,我对依次下降的三列进行动画处理以显示下面的内容......所以容器实际上必须是透明的。
  • 你能告诉我你正在使用的实际代码吗?也许用它更新你的帖子或创建一个小提琴或代码笔? @Ghazgkull
  • 就伸缩弹性盒容器的问题而言,示例代码显示了该问题。我只是在寻找一种解决方法来消除缩放的内容 div 之间出现的差距。
  • @Ghazgkull 我的演示没有提供解决方法吗?在我看来,您好像在说这个演示确实如此,但不是您的实际用例。如果您尝试解决实际用例,我需要查看该代码。
  • 在 div 后面应用背景颜色可以隐藏问题,但这样做会破坏演示。我本可以将背景设置为红色而不是黑色,但我试图确保容易看到间隙。我正在寻找的是一种消除 3 个内容 div 之间差距的方法。我可以举一个更复杂的例子,以便您了解它的重要性,但最终的问题是“列”之间的差距。
猜你喜欢
  • 2014-03-16
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多