具有最大宽度为100%的CSS网格minmax()

6

这段代码使用CSS grid和minmax(30rem, 1fr)

grid-template-columns: repeat(auto-fill, minmax(30rem, 1fr));

一切都运行正常,但是当父容器小于30rem时,会出现水平滚动条。我需要像minmax(min(30rem, 100%), 1fr))这样的东西。有什么办法可以实现吗? https://codepen.io/anon/pen/LmEyer

ul {
  list-style-type: none;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(30rem, 1fr));
  grid-auto-rows: 1fr;
  grid-gap: 10px;
}

li {
  background-color: #aaa;
  padding: 0.5rem;
}
<ul class="list">
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
<ul>

2个回答

2

你自己回答了这个问题!! 你可以使用min()函数来实现:

codepen

.grid {
  display: grid;
  grid-template-columns:
    repeat(
      auto-fit,
      minmax(min(100%, 30rem), 1fr)
    );
  gap: 20px;
}

我推荐这个文章,了解如何将clampmin()grid-template-column相结合。


你是对的。我猜5年前可能没有可用的函数嵌套,或者当时我在尝试时出了点问题。 - mhchem

1
听起来当屏幕宽度为30rem时,您有一个断点。这需要使用媒体查询。
将以下代码添加到您的代码中:
@media (max-width: 30rem) {
   ul { grid-template-columns: 1fr; }
}

修改版的CodePen

ul {
  list-style-type: none;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(30rem, 1fr));
  grid-auto-rows: 1fr;
  grid-gap: 10px;
}

li {
  background-color: #aaa;
  padding: 0.5rem;
}

@media (max-width: 30rem) {
  ul {
    grid-template-columns: 1fr;
  }
}
<ul class="list">
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
  <li>grid item</li>
<ul>


1
媒体查询应该考虑到网格间距。因此,它应该写成@media (max-width: calc(30rem + 2 * 10px)),但目前并不被广泛支持 - mhchem
很遗憾,这只适用于网格在根级别的情况。如果此网格位于比视口更窄的容器中,则无法正常工作。(是的,我的原始问题是关于视口的。但那只是为了简单起见。) - mhchem
1
不需要考虑网格列间距(仅在项目之间呈现)。一旦屏幕达到30rem,就只有一列,没有间隙。@mhchem - Michael Benjamin
@Michael_B 是和不是。这与网格间距无关,你说得对。但是30rem不是避免滚动条的正确值(在几个浏览器中测试了你的codepen)。在这种情况下,你需要考虑body的边距。 - mhchem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接