With the advent of flex-box
and grid
it is now easier than every to create a nice, clean grid layout. But the question is, what should I use and how can I make it responsive?
Suppose I have the following HTML and want each square inside my grid to have equal proportions, even as the screen size changes.
<div class="square-container">
<div class="square">
<div class="content">
</div>
</div>
<div class="square">
<div class="content">
</div>
</div>
<div class="square">
<div class="content">
</div>
</div>
<div class="square">
<div class="content">
</div>
</div>
<div class="square">
<div class="content">
</div>
</div>
</div>
Lucky for us we can use either flex-box
or grid
to create a grid container and keep the width of each square equal. We can then use a little trick with padding-top: 100%;
which will keep our square height the same as our width.
First up, our flex example:
.square-container {
display: flex;
flex-wrap: wrap;
}
.square {
position: relative;
flex-basis: calc(25% - 10px);
margin: 5px;
border: 1px solid;
box-sizing: border-box;
}
.square::before {
content: '';
display: block;
padding-top: 100%;
}
.square .content {
position: absolute;
top: 0; left: 0;
height: 100%;
width: 100%;
}
We end up with something like this:
By adding .square::before
we are essentially adding an inner element to our square which has the same height as the parent squares width thanks to our little padding-top: 100%;
trick. We can then position our square content over the top of this inner element and it will be a perfect square.
Similarly if you'd like to use grid to acheive the same thing, you can do something like this:
.square-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(30%, 1fr));
grid-gap: 10px;
}
.square {
position: relative;
border: 1px solid;
box-sizing: border-box;
}
.square::before {
content: '';
display: block;
padding-top: 100%;
}
.square .content {
position: absolute;
top: 0; left: 0;
height: 100%;
width: 100%;
}
Hopefully by combining either flex-box or grid with the padding-top trick, you too can create grid layouts with responsive squares.
Top comments (2)
now you can safely use aspect-ratio: jsfiddle.net/6rwc2q5u/ it has a good support everywhere: caniuse.com/mdn-css_properties_asp... (and soon available on Safari)
Ah nice, that's quick and simple