Equal height rows in a flex container

前端 未结 9 606
梦如初夏
梦如初夏 2020-11-22 09:28

As you can see, the list-items in the first row have same height. But items in the second row have different height

相关标签:
9条回答
  • 2020-11-22 10:08

    You can accomplish that now with display: grid:

    .list {
      display: grid;
      overflow: hidden;
      grid-template-columns: repeat(3, 1fr);
      grid-auto-rows: 1fr;
      grid-column-gap: 5px;
      grid-row-gap: 5px;
      max-width: 500px;
    }
    .list-item {
      background-color: #ccc;
      display: flex;
      padding: 0.5em;
      margin-bottom: 20px;
    }
    .list-content {
      width: 100%;
    }
    <ul class="list">
      <li class="list-item">
        <div class="list-content">
          <h2>box 1</h2>
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
        </div>
      </li>
      <li class="list-item">
        <div class="list-content">
          <h3>box 2</h3>
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
        </div>
      </li>
    
      <li class="list-item">
        <div class="list-content">
          <h3>box 2</h3>
          <p>Lorem ipsum dolor</p>
        </div>
      </li>
    
      <li class="list-item">
        <div class="list-content">
          <h3>box 2</h3>
          <p>Lorem ipsum dolor</p>
        </div>
      </li>
      <li class="list-item">
        <div class="list-content">
          <h1>h1</h1>
        </div>
      </li>
    </ul>

    Although the grid itself is not flexbox, it behaves very similar to a flexbox container, and the items inside the grid can be flex.

    The grid layout is also very handy in the case you want responsive grids. That is, if you want the grid to have a different number of columns per row you can then just change grid-template-columns:

    grid-template-columns: repeat(1, 1fr); // 1 column
    grid-template-columns: repeat(2, 1fr); // 2 columns
    grid-template-columns: repeat(3, 1fr); // 3 columns
    

    and so on...

    You can mix it with media queries and change according to the size of the page.

    Sadly there is still no support for container queries / element queries in the browsers (out of the box) to make it work well with changing the number of columns according to the container size, not to the page size (this would be great to use with reusable webcomponents).

    More information about the grid layout:

    https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout

    Support of the Grid Layout accross browsers:

    https://caniuse.com/#feat=css-grid

    0 讨论(0)
  • 2020-11-22 10:10

    No, you can't achieve that without setting a fixed height (or using a script).


    Here are 2 answers of mine, showing how to use a script to achieve something like that:

    • How to get header from cards or similar to have the same height with flex box?

    • Same height for flex items in the flex-direction column flex container

    0 讨论(0)
  • 2020-11-22 10:10

    You can with flexbox:

    ul.list {
        padding: 0;
        list-style: none;
        display: flex;
        align-items: stretch;
        justify-items: center;
        flex-wrap: wrap;
        justify-content: center;
    }
    li {
        width: 100px;
        padding: .5rem;
        border-radius: 1rem;
        background: yellow;
        margin: 0 5px;
    }
    <ul class="list">
      <li>title 1</li>
      <li>title 2<br>new line</li>
      <li>title 3<br>new<br>line</li>
    </ul>

    0 讨论(0)
提交回复
热议问题