3 columns grid (top to bottom) using grid CSS

前端 未结 4 1904
醉梦人生
醉梦人生 2021-01-17 13:59

Ok, here\'s the situation, let\'s say I have a list with unknown number of items, it could be 10 or a 100, and I want to lay them out in 3 columns going top to bottom not le

4条回答
  •  北恋
    北恋 (楼主)
    2021-01-17 14:49

    In theory, you can kind of achieve this with CSS Grid by using "Quantity queries" based on :nth-* selectors, like this:

    ul {
      list-style: none;
      display: grid;
      grid-auto-flow: row dense;
      grid-template-columns: repeat(3, 1fr);
      grid-column-gap: 10px;
    }
    
    /* by default, items go in first column */
    li { grid-column: 1; }
    
    /* if there are 1 to 3 items, the 2nd one goes to 2nd column and the 3rd one goes to 3rd column */
    li:first-child:nth-last-child(n + 1):nth-last-child(-n + 3) ~ li:nth-child(n + 2):nth-child(-n + 2) { grid-column: 2; }
    li:first-child:nth-last-child(n + 1):nth-last-child(-n + 3) ~ li:nth-child(n + 3) { grid-column: 3; }
    
    /* ... */
    
    /* if there are 19 to 21 items, items 8-14 to 2nd column and items 15+ to 3rd one */
    li:first-child:nth-last-child(n + 19):nth-last-child(-n + 21) ~ li:nth-child(n + 8):nth-child(-n + 14) { grid-column: 2; }
    li:first-child:nth-last-child(n + 19):nth-last-child(-n + 21) ~ li:nth-child(n + 15) { grid-column: 3; }
    
    /* if there are 22 to 24 items, items 9-16 to 2nd column and items 17+ to 3rd one */
    li:first-child:nth-last-child(n + 22):nth-last-child(-n + 24) ~ li:nth-child(n + 9):nth-child(-n + 16) { grid-column: 2; }
    li:first-child:nth-last-child(n + 22):nth-last-child(-n + 24) ~ li:nth-child(n + 17) { grid-column: 3; }
    
    /* if there are 25 to 27 items, items 10-18 to 2nd column and items 19+ to 3rd one */
    li:first-child:nth-last-child(n + 25):nth-last-child(-n + 27) ~ li:nth-child(n + 10):nth-child(-n + 18) { grid-column: 2; }
    li:first-child:nth-last-child(n + 25):nth-last-child(-n + 27) ~ li:nth-child(n + 19) { grid-column: 3; }
    
    /* and so on */
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    However, this approach isn't practical. In my opinion, the CSS Multi-column layout is the better solution here than CSS Grid.

提交回复
热议问题