【问题标题】:How does percentage work in grid items min-width [when using fit-content]?百分比如何在网格项目最小宽度中起作用[使用 fit-content 时]?
【发布时间】:2018-10-20 23:28:30
【问题描述】:

目标

  • 有一个 CSS 网格容器

  • 有 3 列由 fit-content(33.33%) 计算,以获得相同大小的列

  • 能够通过在单个网格项上使用最小/最大宽度来进一步控制/限制列大小

特别是我想将列的大小从 33% 调整到 50%,以防只有 2 个网格项,使用 min-width

下面的 sn-p 符合上述目标

.grid {
  width: 780px;
  display: grid;
  grid-template-columns: repeat(3, fit-content(33.33%));
  justify-items: start;
  align-items: stretch;
  border:1px solid #000;
}

.cell {
  min-width:calc(780px / 2);
  height:80vh;
  background: radial-gradient(
    circle,
    rgba(63, 94, 251, 1) 0%,
    rgba(252, 70, 107, 1) 100%
  );
}
<div class="grid">
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
</div>

问题是我使用了一个明确的值:min-width:calc(780px / 2)

所以我尝试使用百分比,例如min-width:calc(100% / 2)。但似乎网格项目中的百分比是相对于它自己的宽度而不是 而不是容器的宽度。

所以我尝试了这个:min-width:calc(300% / 2),认为如果 100% 是 fit-content 1/3 中 1 个网格项的宽度,那么 300% / 2 将是相对于容器的大约 50% 最小宽度宽度。

但是像这样使用百分比会使项目重叠:

.grid {
  width: 780px;
  display: grid;
  grid-template-columns: repeat(3, fit-content(33.33%));
  justify-items: start;
  align-items: stretch;
  border:1px solid #000;
}

.cell {
  min-width:calc(300% / 2);
  height:80vh;
  background: radial-gradient(
    circle,
    rgba(63, 94, 251, 1) 0%,
    rgba(252, 70, 107, 1) 100%
  );
}
<div class="grid">
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
</div>

所以我的问题是:是否可以在网格项的最小宽度中使用百分比,相对于容器的宽度?怎么样?

【问题讨论】:

  • 在解决方案中使用 CSS Grid 和 min-width 是否是硬性要求?如果您想要的只是一个平均分布 2 或 3 列的容器,那么只需使用 flexbox 即可轻松解决。
  • 是的,由于许多其他要求,我需要 CSS 网格和最小宽度(这种情况非常孤立)。我也很好奇百分比在这里是如何工作的,因为它在所有浏览器中都同样奇怪。

标签: css css-grid


【解决方案1】:

您的计算是正确的,与百分比一起使用的min-width 与网格容器的33% 已经定义的网格单元格相关,因此您需要300%/2 才能拥有50% 但您将溢出网格单元格,即由33% 定义。要解决此问题,您可以考虑将 margin-right 添加到第二个元素以推送它,因为第二个单元格从 33% 而不是 50% 开始,就像您可能认为的溢出一样。

边距应该等于50%,即33%50%,因此容器的16.5%也是50% - 33%,如下图所示:

.grid {
  width: 780px;
  display: grid;
  grid-template-columns: repeat(3, fit-content(33.33%));
  justify-items: start;
  align-items: stretch;
  border:1px solid #000;
}

.cell {
  min-width:calc(300% / 2);
  height:80vh;
  background: radial-gradient(
    circle,
    rgba(63, 94, 251, 1) 0%,
    rgba(252, 70, 107, 1) 100%
  );
}
.cell:nth-child(2) {
  margin-left:50%;
}
<div class="grid">
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
</div>

【讨论】:

  • 这是我认为最好的解决方法。但奇怪的是,使用百分比不会改变网格项目/单元格的大小。在使用min-width:calc(780px / 2)更改单元格大小 并防止溢出。我从未见过不同的单位会大幅改变行为。
  • 使用margin-left不如百分比能够像精确单位一样改变单元格大小,因为如果你也使用max-width是不够的(fit-content应该尊重) .例如。您将min-width 更改为width(因为min-width 优先于max-width)并添加一个400px 的max-width。您需要将边距设置为(伪代码)calc(max(100%, (400px - widthOfGridItem) * 2) / 2) 以获得 a)如果未达到最大宽度,则为 50% 边距或 b)最大宽度减去单元格宽度
  • @Bell I've never seen different units change the behaviour drastically --> 仅仅因为 px 是百分比不一样...使用 px 您正在考虑非相对长度,因此它可以直观地工作但是当您使用 % 它是相对长度,它不是相对于容器,而是相对于由百分比定​​义的轨道,从逻辑上讲,您不能使用以第一个指定宽度定义的百分比宽度来增加指定宽度(我知道这不容易获得),这就是为什么唯一的方法是当使用超过 100% 时有溢出也是合乎逻辑的
【解决方案2】:

这对你有用吗?

.grid {
  width: 780px;
  display: grid;
  grid-template-columns: auto auto auto;
  grid-auto-flow: row;
  justify-items: start;
  align-items: stretch;
  border: 1px solid #000;
}

.cell {
  height: 80vh;
  background: radial-gradient(
    circle,
    rgba(63, 94, 251, 1) 0%,
    rgba(252, 70, 107, 1) 100%
  );
}
<div class="grid">
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div> 
</div>
<div class="grid">
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
  <div class="cell">Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor. Lorem ipsum dolor.</div>
</div>

【讨论】:

  • 这不使用fit-content
猜你喜欢
  • 2018-09-05
  • 2020-05-20
  • 1970-01-01
  • 2023-03-31
  • 2015-09-29
  • 2015-04-18
  • 1970-01-01
  • 2012-01-17
相关资源
最近更新 更多