【问题标题】:Variable grid-gap makes padding of grid-parent invade grid-elements [duplicate]可变网格间隙使网格父级的填充侵入网格元素[重复]
【发布时间】:2020-02-28 22:57:54
【问题描述】:

如果我为grid-gap 设置一个变量值,例如10%,则父级(<div id="grid">) 的padding-bottom 开始在子级(<div class="grid-item">) 内部流动。为什么会这样?如何防止这种行为?

这是一个最小的例子:

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

#grid {
  padding-bottom: 100px;
  display: grid;
  grid-gap: 10%;
  grid-template-columns: 100px;
}

.grid-item img {
  width: 100%;
}
<div id="grid">
  <div class="grid-item"><img src="https://cdn.sstatic.net/Img/teams/overview/secure.png?v=03c691959884">
    <h3>Stack Overflow</h3>
  </div>
  <div class="grid-item"><img src="https://cdn.sstatic.net/Img/teams/overview/secure.png?v=03c691959884">
    <h3>Stack Overflow</h3>
  </div>
</div>

您可以使用开发工具检查网格父级 (&lt;div id="grid"&gt;) 并查看填充或查看此屏幕截图以查看问题(填充(绿色)侵犯网格元素的空间(虚线)框)):

【问题讨论】:

  • grid-gap:10vw 或 10vh 可能会像您预期的 10% 那样工作?没有填充,我可以在这里看到
  • @G-Cyr 为了清晰起见,我添加了一个屏幕截图。如果可能,我想使用 10%。
  • 好的,使用grid-gap: 10vh 10vw; 你应该得到预期的结果,而不会从浏览器中计算错误。这是一个具有两个值的演示。 % 和 vh/vw 单位 codepen.io/gc-nomade/pen/ZEEvZEL
  • @G-Cyr 我知道我可以通过不使用 %.我仍然想了解这个问题 - 这是一个错误吗?
  • @G-Cyr 并不是一个真正的错误,但这是由于百分比值的计算方式。如您所知,我们需要一个参考,并且对于间隙,它的高度是自动的,因此我们首先找到没有间隙的高度,然后我们计算间隙并将间隙添加到先前的高度(我们停在这里或者我们将有一个无限循环)-->我们有一个溢出

标签: css css-grid


【解决方案1】:

这是我的猜测,基于我对级联、百分比长度和grid sizing algorithm 的了解。我还没有找到任何专门解决这个问题的官方文件,所以再次,这是一个推断。

为了使百分比高度起作用,当父容器上没有明确定义高度时,浏览器首先需要渲染所有其他长度。这样它就可以得出容器的实际大小,并可以回答以下问题:“10% 的什么?”

因此,浏览器首先呈现项目和padding-bottom: 100px

现在它可以计算grid-gap: 10%,或者更具体地说,可以计算row-gap: 10% 组件(高度百分比)。

因为所有其他尺寸都已经就位,所以这 10% 的额外高度会迫使较低的项目侵入固定的填充空间。

为了支持这个理论,如果我们在容器上设置一个高度,现在它为百分比行高提供了一个明确的参考点,那么规则可以与其他规则按顺序呈现(即,不需要百分比最后渲染的高度),并且在大多数情况下消除了重叠。 (在较短的屏幕中仍然会有重叠,因为 padding 的高度固定为 100px。)

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

#grid {
  padding-bottom: 100px;
  display: grid;
  grid-gap: 10%;
  grid-template-columns: 100px;
  height: 100vh; /* new */
}

.grid-item img {
  width: 100%;
}
<div id="grid">
  <div class="grid-item"><img src="https://cdn.sstatic.net/Img/teams/overview/secure.png?v=03c691959884">
    <h3>Stack Overflow</h3>
  </div>
  <div class="grid-item"><img src="https://cdn.sstatic.net/Img/teams/overview/secure.png?v=03c691959884">
    <h3>Stack Overflow</h3>
  </div>
</div>

【讨论】:

  • 我想一切都在这里定义:w3.org/TR/css-sizing-3/#percentage-sizing .. 我能够大致理解我正在发生的事情,但很难解释规范的那部分。
  • 顺便提醒我一个老问题;)stackoverflow.com/q/51962136/8620333
  • 是的,需要一些时间来仔细阅读该部分,构建测试并跨浏览器运行,但不能保证浏览器符合规范,或者我们正确解释了语言。不是在一个阳光明媚、温暖的星期天早晨。祝你有美好的一天!
  • 当你使用标尺时,在op的2行示例中,你可以看到第一行的顶框和第二行的底框之间的间隙是长度的10%排。 100px 中缺少的是 10% 的差距。使该框为 3 行,间隙增加以匹配从第一行到 las 行的距离,但是这 2 个间隙也从 100px 中删除,使其成为 4 行,最后一行部分位于外面。5 行,你有部分间隙和最后一行完全在网格框之外。 :( codepen.io/gc-nomade/pen/eYYyayX 对我来说,这是一个错误 ;)
猜你喜欢
  • 2019-05-18
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
相关资源
最近更新 更多