Search code examples
cssflexboxgrid-layoutcss-grid

Make a div span two rows in a grid


I have a page full of blocks which pile up with display: inline-block. I want to make some four or two times bigger, so I used float: left or right to put other blocks around.

My problem is if I have a five-element row, how could I put a bigger element in the middle of it? (as float put it naturally on the side).

Here's an example snippet:

#wrapper{
  width: 516px;
}
.block{
  display: inline-block;
  width: 90px;
  height: 50px;
  margin: 5px;
  background-color: red;
}
.bigger{
  height: 110px;
}
<div id="wrapper">
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block"></div>
  <div class="block bigger"></div>
  <div class="block"></div>
  <div class="block"></div>
</div>

Here's what I would like to have from the snippet above Expected


Solution

  • Flexbox Solution

    You have fixed heights on your child elements (.block). Based on that information, we can extrapolate the height of the container (#wrapper).

    By knowing the height of the container, your layout can be achieved using CSS Flexbox with flex-direction: column and flex-wrap: wrap.

    A fixed height on the container serves as a breakpoint, telling flex items where to wrap.

    #wrapper {
      display: flex;
      flex-direction: column;
      flex-wrap: wrap;
      height: 120px;
      width: 516px;
    }
    .block {
      width: 90px;
      flex: 0 0 50px;
      margin: 5px;
      background-color: red;
    }
    .bigger {
      flex-basis: 110px;
    }
    <div id="wrapper">
      <div class="block"></div>
      <div class="block"></div>
      <div class="block bigger"></div>
      <div class="block"></div>
      <div class="block"></div>
      <div class="block"></div>
      <div class="block"></div>
      <div class="block"></div>
      <div class="block"></div>
    </div>

    jsFiddle

    Here's an explanation why flex items can't wrap unless there's a fixed height/width on the container: https://stackoverflow.com/a/43897663/3597276