CSS Grid - Auto height rows, sizing to content

本小妞迷上赌 提交于 2019-11-27 14:32:25

问题


I have two grids nested within a grid. Unfortunately the right nested grid .grid-3 sets the height of the rows so that both the left and right grid are the same height, the extra space is shared among the divs with the class .right. How can I set the rows of the right nested grid to adjust to the size of the content, so they are the same height as the left nested rows?

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>

回答1:


You can try 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>



回答2:


By default grid items stretch to all grid cell area. So you have this options here if you want grid's height to fit content:

  • Set alignment for all items using align-items for grid container (default value is align-items: stretch). So just set align-items: start for grid-2. Demo:

    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>
  • Set alignment for grid items individually using align-self (default value is align-self: stretch). So just set align-self: start for grid-3. Demo:

    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>
  • Set alignment for grid items individually using margin property with auto values. Auto margins for grid cell take all available space in any direction. So just set margin-bottom: auto for grid-3. Demo:

    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>

If you want right grid to take all parent vertical space but make its cells to fit content use this answer.



来源:https://stackoverflow.com/questions/49701408/css-grid-auto-height-rows-sizing-to-content

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!