【问题标题】:CSS Grid - Auto height rows, sizing to contentCSS Grid - 自动高度行,根据内容调整大小
【发布时间】:2018-09-16 23:46:29
【问题描述】:

我有两个网格嵌套在一个网格中。不幸的是,右嵌套网格.grid-3 设置了行的高度,以便左右网格的高度相同,额外的空间在类.right 之间共享。如何设置右侧嵌套网格的行以适应内容的大小,使它们与左侧嵌套行的高度相同?

div {
  border: 1px dotted black;
}
.grid-2 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-auto-rows auto;
}

.grid-3 {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-auto-rows auto;
}

.left {
  background-color: red;
}
 
.right {
  background-color: green;
}
<div class="grid-2">
      <div class="grid-2">
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
        <div class="left">L</div>
     </div>
     <div class="grid-3">
         <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
        <div class="right">R</div>
     </div>
</div>

【问题讨论】:

    标签: css css-grid


    【解决方案1】:

    你可以试试minmax(min-content, max-content) ref

    div {
      border: 1px dotted black;
    }
    .grid-2 {
      display: grid;
      grid-template-columns: repeat(2, 1fr);
      grid-auto-rows: minmax(min-content, max-content);
    }
    
    .grid-3 {
      display: grid;
      grid-template-columns: 1fr 1fr 1fr;
      grid-auto-rows: minmax(min-content, max-content);
    }
    
    .left {
      background-color: red;
    }
     
    .right {
      background-color: green;
    }
    <div class="grid-2">
          <div class="grid-2">
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
         </div>
         <div class="grid-3">
             <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
         </div>
    </div>

    您也可以只使用max-contentmin-content

    div {
      border: 1px dotted black;
    }
    .grid-2 {
      display: grid;
      grid-template-columns: repeat(2, 1fr);
      grid-auto-rows: max-content; /* min-content*/
    }
    
    .grid-3 {
      display: grid;
      grid-template-columns: 1fr 1fr 1fr;
      grid-auto-rows: max-content; /* min-content*/
    }
    
    .left {
      background-color: red;
    }
     
    .right {
      background-color: green;
    }
    <div class="grid-2">
          <div class="grid-2">
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
            <div class="left">L</div>
         </div>
         <div class="grid-3">
             <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
            <div class="right">R</div>
         </div>
    </div>

    【讨论】:

    • 请注意,grid-3 将在此处获取所有父级高度。如果您希望grid-3 的高度适合内容,您可以使用my answer
    【解决方案2】:

    你也可以试试grid-auto-rows: fit-content(1em);。当然,使用对您有意义的任何尺寸。我也尝试了描述的方法 Temani (minmax(min-content, max-content)) 和渲染我的 HTML 时的结果是相同的。

    根据Elad Schechter - Medium

    fit-content 函数接受一个参数,即最大值。 ... fit-content() 函数类似于使用 minmax() 函数,最小值为 0。一个关键区别:minmax() 更可能占用允许的最大空间,而 fit-content不会占用不必要的空间。

    您的需求将决定fit-content 是否比使用minmax 更合适,反之亦然。

    【讨论】:

      【解决方案3】:

      默认情况下,网格项目会延伸到所有网格单元区域。因此,如果您希望网格的高度适合内容,您可以在此处使用此选项:

      • 使用align-items 为网格容器设置所有项目的对齐方式(默认值为align-items: stretch)。所以只需将align-items: start 设置为grid-2。演示:

        div {
          border: 1px dotted black;
        }
        
        .grid-2 {
          display: grid;
          grid-template-columns: repeat(2, 1fr);
          align-items: start;
        }
        
        .grid-3 {
          display: grid;
          grid-template-columns: 1fr 1fr 1fr;
        }
        
        .left {
          background-color: red;
        }
         
        .right {
          background-color: green;
        }
        <div class="grid-2">
              <div class="grid-2">
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
             </div>
             <div class="grid-3">
                 <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
             </div>
        </div>
      • 使用align-self(默认值为align-self: stretch)单独设置网格项目的对齐方式。所以只需将align-self: start 设置为grid-3。演示:

        div {
          border: 1px dotted black;
        }
        
        .grid-2 {
          display: grid;
          grid-template-columns: repeat(2, 1fr);
        }
        
        .grid-3 {
          display: grid;
          grid-template-columns: 1fr 1fr 1fr;
          align-self: start;
        }
        
        .left {
          background-color: red;
        }
         
        .right {
          background-color: green;
        }
        <div class="grid-2">
              <div class="grid-2">
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
             </div>
             <div class="grid-3">
                 <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
             </div>
        </div>
      • 使用margin 属性和auto 值单独设置网格项目的对齐方式。网格单元的自动边距沿任何方向占用所有可用空间。所以只需将margin-bottom: auto 设置为grid-3。演示:

        div {
          border: 1px dotted black;
        }
        
        .grid-2 {
          display: grid;
          grid-template-columns: repeat(2, 1fr);
        }
        
        .grid-3 {
          display: grid;
          grid-template-columns: 1fr 1fr 1fr;
          margin-bottom: auto;
        }
        
        .left {
          background-color: red;
        }
         
        .right {
          background-color: green;
        }
        <div class="grid-2">
              <div class="grid-2">
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
                <div class="left">L</div>
             </div>
             <div class="grid-3">
                 <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
                <div class="right">R</div>
             </div>
        </div>

      如果您希望右网格占据所有父垂直空间但使其单元格适合内容,请使用this answer

      【讨论】:

      • 您提出的解决方案很好,但是出现了另一个问题:边距创建了一个额外的空间,没有填充内容。我如何对网格系统说我只需要列中的元素?也许我应该在这里使用 flex...谢谢
      • @LucioB 对不起,不明白你的问题。也许最好单独提出一个包含所有详细信息和示例的问题,然后在 cmets 中将链接发布给我。
      • 根据我所看到的,LucioB 说align-items: start,网格内容的底部在内容结束的地方结束,而不是在网格单元结束的地方,所以下面的下一行有一个额外的尺寸差距。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2023-04-03
      • 2018-01-05
      相关资源
      最近更新 更多