【问题标题】:Responsive css grid layout with max-width items具有最大宽度项目的响应式 CSS 网格布局
【发布时间】:2017-08-25 11:41:28
【问题描述】:

我正在寻找一种自动生成网格的方法,它始终填充可用空间,同时缩小项目直到可以添加另一个项目。

大多数响应式网格实现都使用以下链接:

grid-template-colums: repeat(auto-fill, minmax(120px, 1fr));

这很好用,除了它使用最小值作为默认图像大小,这会导致网格内的图像插值。我想做相反的事情——设置一个最大宽度并在必要时缩小图像。


假设我的网格项目的最大宽度应为 400 像素。以下是我想要获得的一些值:

400px available space: One image with a width of 400px
402px available space: Two images with a width of 201px
800px available space: Two images with a width of 400px
and so on …

基本上我想将图像限制在 200px 和 400px 之间,并始终使用可能的最大值。我想我需要这样的东西:

min(max(200px, 1fr), 400px)

到目前为止,我能够做到这一点的唯一方法是生成一些媒体查询。

/* This example adjusts items to a max-width of 400px with a 10px grid-gap.*/

@media (min-width: 401px) {
  .grid {
    grid-template-columns: repeat(auto-fill, calc((100% - 10px) / 2));
  }
}
@media (min-width: 811px) {
  .grid {
    grid-template-columns: repeat(auto-fill, calc((100% - 20px) / 3));
  }
}

我写了一个Sass mixin 来使这个过程更加灵活,但是这个解决方案有一些缺点:

  • 您必须生成任意数量的查询才能处理多种屏幕尺寸,这可能会导致死代码
  • 您必须知道用于媒体查询的网格容器的可用空间(或用于计算可用空间的已用空间)

我正在寻找一种没有这些缺点的方法。


编辑:

Here is a CodePen of my current code.如果你玩弄它应该更容易理解我想要做什么。

【问题讨论】:

    标签: html css css-grid


    【解决方案1】:

    此时,您的媒体查询解决方案可能是您的最佳选择。

    目前,CSS Grid 不提供灵活的最小值。

    来自规范:

    minmax(min, max)

    定义大于或等于 min 且小于或 等于 max

    如果 max ,则 max 被忽略,minmax(min,max) 被处理 作为min

    作为最大值,<flex> 值设置轨道的弹性系数;它是 至少无效。

    注意:此规范的未来级别可能允许 <flex> 最小值,并且 将更新轨道大小算法以正确解决此问题

    您是否考虑过使用 flexbox:

    .grid {
      display: flex;
      flex-wrap: wrap;
    }
    
    .grid > div {
      flex: 1 0 200px;  /* can grow, can't shrink, minimum width 200px */
      max-width: 400px;
      margin: 5px;
    }
    
    .grid-item {
      width: 100%;
      height: auto;
    }
    <div class="grid">
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
      <div><img src="http://placehold.it/400x300" alt="" class="grid-item"></div>
    </div>

    revised codepen

    【讨论】:

    • 好主意,更广泛的浏览器支持将是一个额外的好处。不过,最后一行不太理想。你能想出一种简单的方法来让最后一个项目的大小与其他项目的大小相同,当它们没有填满整行时?
    • 在最后一行调整弹性项目的大小是一个已知问题。我在这里列出了几个解决方案:stackoverflow.com/q/42176419/3597276
    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 2017-11-05
    • 2018-08-05
    • 2018-08-09
    • 1970-01-01
    • 2015-10-20
    • 2021-02-23
    • 2015-04-24
    相关资源
    最近更新 更多