【问题标题】:Why percentage value within grid-gap create overflow in CSS grid?为什么 grid-gap 中的百分比值会在 CSS 网格中产生溢出?
【发布时间】:2019-05-02 23:13:54
【问题描述】:

我想要一个这样的网格:

.grid{
  display:grid;
grid-gap:50%;
  background-color:blue;
}
.grid-1{
  background-color:red;
}
<div class="grid">
 <div class="grid-1">
  test
 </div>
 <div class="grid-1">
  test
 </div>
 <div class="grid-1">
  test
 </div>
</div>

我认为这是一个非常大的问题,因为所有浏览器都不能正确理解百分比值。

如何解决?

【问题讨论】:

    标签: css percentage css-grid


    【解决方案1】:

    最初,我们无法解决网格间隙的百分比,因为它取决于高度,所以我们忽略它(我们认为它是auto)。浏览器首先考虑如下内容计算高度:

    console.log(document.querySelector('.grid').offsetHeight)
    .grid {
      display: grid;
      background-color: blue;
    }
    
    .grid-1 {
      background-color: red;
      opacity:0.5;
    }
    <div class="grid">
      <div class="grid-1">
        test
      </div>
      <div class="grid-1">
        test
      </div>
      <div class="grid-1">
        test
      </div>
    </div>

    此高度用作计算间隙的参考,然后我们将其添加到 height(我们用来根据内容找到间隙的高度)。这不会再次触发网格的高度计算,因为它会创建一个循环并且会有一个无限循环,因此浏览器会停在这里,我们将有一个溢出

    console.log(document.querySelector('.grid').offsetHeight)
    
    console.log(document.querySelector('.grid-1:nth-child(2)').offsetTop - document.querySelector('.grid-1:nth-child(1)').offsetTop - document.querySelector('.grid-1:nth-child(1)').offsetHeight)
    .grid {
      display: grid;
      grid-gap:100%;
      background-color: blue;
      margin-top:50px;
    }
    
    .grid-1 {
      background-color: red;
      opacity:0.5;
      transform:translateY(-100%);
    }
    <div class="grid">
      <div class="grid-1">
        test
      </div>
      <div class="grid-1">
        test
      </div>
      <div class="grid-1">
        test
      </div>
    </div>

    如您所见,我使用了100%,并添加了一些变换,以查看间隙等于初始高度(JS代码也证实了这一点)

    一个简单的解决方法是避免使用百分比值并使用像素值,以便浏览器将它们包含在初始计算中。在所有情况下,使用百分比值都不好,例如您不知道“百分比是什么?”

    .grid {
      display: grid;
      grid-gap:50px;
      background-color: blue;
      margin-top:50px;
    }
    
    .grid-1 {
      background-color: red;
      opacity:0.5;
    }
    <div class="grid">
      <div class="grid-1">
        test
      </div>
      <div class="grid-1">
        test
      </div>
      <div class="grid-1">
        test
      </div>
    </div>

    您可以参考官方规范以获取有关此行为的更多详细信息,但要遵循这一点并非易事:

    https://www.w3.org/TR/css-sizing-3/#percentage-sizing


    这里有更多示例,其中百分比值稍后会被评估并产生不需要的结果:

    Why is my Grid element's height not being calculated correctly?

    CSS Grid - unnecessary word break

    Why does percentage padding break my flex item?

    【讨论】:

    • 谢谢你的回答 我有两点 1. 50% Grid-gap 表示行高和列宽总和的 50% 之后总高度可以很容易地计算出来 2. 我讨厌px 值,因为它们没有响应。有没有办法解决这个问题?
    • @MarkusSchneider 不,您有一个循环,这对您来说似乎很容易,但事实并非如此:假设您有一个元素 A,其高度由元素 B 定义,而元素 B 的高度以百分比定义高度为 A。这里就是这种情况,网格是 A,间隙是 B。我们首先定义 A 的高度,然后定义 B,如果我们重新定义 A,我们就必须重新定义 B,依此类推。它永远不会结束......正如我所说,你需要问自己“什么百分比?”即使是你也无法回答这个问题。你能告诉我百分之几吗?
    • 我会这样计算:高度第1行+高度第2行+高度第3行+0,5*(3-1)*(高度第1行+高度第2行+高度第3行) = 网格高度。所以对我来说实际它计算行高,而不是网格而不是间隙,我会计算行高,间隙,网格
    • @MarkusSchneider 你希望计算是这样的 :) 你认为它应该是那样的,但不是。计算如下:(1)我们无法解决网格间隙,因为它的百分比,我们移动(2)我们计算网格的高度(在这种情况下它是 3 行的总和,但它可以是其他东西,具体取决于其他属性)(3)现在我们有了网格的高度,我们可以解决网格间隙(4)我们添加网格间隙(5)我们有溢出并停止。这种情况看起来很简单,但请查看我分享的链接以了解其他更复杂的情况
    • @MarkusSchneider 不要忘记我们可以有边距、内边距等,并且浏览器进行您想要的计算并非易事。网格间隙也是网格高度的一部分。使用像素值时您可以清楚地注意到这一点,因此网格高度不仅是行,而且是间隙、边距、填充等。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多