Search code examples
cssflexboxgrid-layoutaspect-ratio

Flexbox, responsive grid of square divs maintaining aspect ratio


I'm trying to create a 2x2 grid with divs. Some of the divs might contain an image, but it will probably be set as a background, with the option background-size: cover.

Here's the pen I created: http://codepen.io/qarlo/pen/vLEprq

.container {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  margin: auto;
  max-width: 960px;
  width: 80%;
}
.container__item {
  align-content: center;
  border: 1px solid #333;
  display: flex;
  flex-basis: 1;
  font-size: 3em;
  justify-content: center;
  height: 100%;
  margin-bottom: 1em;
  min-height: 300px;
  width: 47%;
}
<div class="container">
  <div class="container__item">?</div>
  <div class="container__item">?</div>
  <div class="container__item">?</div>
  <div class="container__item">?</div>
</div>

I'd like to force the divs to be squares and maintain the aspect ratio when resizing it. I was mistakenly hoping that this would have been straightforward with flexbox, but unless I'm missing something, I was wrong.


Solution

  • To maintain your items aspect ratio, a very simple method is to use CSS Viewport units

    I modified your pen to see how this units work: http://codepen.io/vladbicu/pen/wMBmOb

    .container {
        display: flex;
        flex-wrap: wrap;
        justify-content: space-between;
        margin: auto;
        max-width: 960px;
        width: 80%;
    }
    
    .container__item {
        align-content: center;
        border: 1px solid #333;
        display: flex;
        flex-basis: 1;
        font-size: 3em;
        justify-content: center;
        margin-bottom: 1em;
    
        // maintain aspect ratio
        width: 30vw;
        height: 30vw;
    }
    

    Hope it helps.