Build Your Own Pinterest-Style Masonry Grid: A Step-by-Step Guide

Kunal Singh

Dec 10, 2023

So I have been trying to create a grid which has a masonry structure and was trying to find a simple way to create it without having any DOM related heavy lifting, ie wihout any javascript. I wanted to use CSS to do this and I thought it might be simple but it's not the simplest of things to achieve with CSS alone.

Final Masonry Layout with Infinite Scroll

It's very simple to achieve a column layout with pure masonry but the catch is your content flows from top to bottom and then to the next column

Masonry Wall Layout

.container{
columns: 3 300px;
}

Just this one line can give you a masonry structure, but AT WHAT COST?

At what cost

You will have a layout that will not support pagination, This means when ever new content is added, the last column will have more children and the last row that user expects to be populated with new childrens will not be working as expected.

To solve this problem we can use a different approach of css grid. Here we use a grid container.

<div id="masonary-container">
<!-- Children -->
</div>
#masonary-container {
display: grid;
grid-template-columns: repeat(auto-fill, 280px);
grid-auto-rows: 10px;
}

/* this will avoid overflow of images in the grid */
img {
width: 100%;
height: 100%;
object-fit: cover;
}

Here

grid-template-columns: repeat(auto-fill, 280px): This instructs the browser to automatically fill the available space with as many columns as possible with minimum width of 280px.

grid-auto-rows: 10px: This specifies the minimum height of each row. The rows will be at least 10px high, but they can be taller if there is enough content to fill them.

Here is where the magic happens

We create three classes in our CSS File

.small {
grid-row-end: span 16;
}

.medium {
grid-row-end: span 23;
}

.large {
grid-row-end: span 35;
}

This will help us get the masonry layout. In our javascript code, we can add a logic to add .small | .medium | .large class depending upon the where its the the nth | n+1th| n+2th child.

const container = document.querySelector('.container');
let xwidth = 400;
let ywidth = 400;
let currentCount = 0;

container.innerHTML = getCatsCards();

function getCatsCards() {
const cardsMarkup = Array.from({ length: 10 }).map((_, i) => {
xwidth++;
ywidth++;

let sizeClass = getCurrentSizeClass(i)
return `
<div id="card-
${i}" key="${i}" class="${sizeClass} card">
<img src="//source.unsplash.com/
${xwidth}x${ywidth}?cat" alt="Cat Image">
<span>
${currentCount + i+1}</span>
</div>
`
;
}).join('');

currentCount = currentCount + 10;
return cardsMarkup;
}


function getCurrentSizeClass(i) {
if (i % 3 === 0) {
sizeClass = 'large';
} else if (i % 2 === 0) {
sizeClass = 'medium';
} else {
sizeClass = 'small';
}
return sizeClass;
}

With some fine tuning we can get a final result which is almost as good as the pinterest masonry layout. This can handle pagination and logical flow of data in the DOM.

Recommendations

Are You Still Using Basic CSS? Here Are 7 Tricks to Get Ahead of the Curve

#css

Bored of the same old CSS? Unleash 7 hidden gems to take your designs to the...

Dec 27, 2023

Easiest way to store your logs in a file WITHOUT chaging the source file(node)

#productivity

Often, developers face challenges when dealing with a flood of logs in the...

Dec 21, 2023

Using git diff and git apply to Share Local Changes with Peers

#git

,

#productivity

,

#software_engeneering

,

#dev

git diff and git apply are two powerful Git commands that can be used to share...

Nov 12, 2023

React Portals: Render Components Outside the current DOM Hierarchy

#react

,

#web

The createPortal API in React allows you to render child elements into a...

Jul 27, 2023

Cloning Made Easy: Try degit and Clone Directories within Repos.

#git

,

#productivit

Have you ever faced the dilemma of wanting just a small portion of a repository,...

Jul 19, 2023

Debugging Web Apps with Browser Dev Tools: 6 Amazing Tricks

#browser

,

#debugging

,

#web

Debugging web applications can be a challenging task, with errors like...

Jul 13, 2023

Controlled Versus Uncontrolled Components in React

#react

,

#forms

Understanding State Management Within Forms Comparing controlled and...

Nov 5, 2022

Format Numbers, Dates and Currencies with the Intl Object in Javascript

#javascript

,

#html

,

#web

Intl object can be used to format data into commonly used formats of dates,...

Sep 13, 2022

Image Masking on Hover Using CSS Clip Path and Javascript

#javscript

,

#css

,

#html

Image Masking can be used to add fancy hover highlight effects to images for...

Jul 23, 2022

Recreating CSS Tricks Fancy Grid Hover Effect

#html

,

#css

,

#UI

,

#recreation

CSS Trick had a simple yet cool grid layout which I found dope. So lets try to...

May 21, 2022

File Explorer Recursive React Component

#react

,

#javascript

,

#web

How to create a recursive folder Component using react.

Apr 16, 2022

Add Google Fonts to Your React & NextJS + TailwindCSS Project (Next 14)

#css

,

#tailwindcss

,

#react

,

#nextjs

,

#tailwind

,

#design

Use Google Fonts in Your TailwindCSS Projects

Apr 6, 2022

Event Delegation in Javascript

#javscript

,

#css

,

#html

,

#web

,

#performance

Handling multiple Events in Javascript with minimal CPU Usage

Mar 6, 2022

A Simple Web Accessibility Trick that you most probably missed!

#html

,

#css

,

#web-accessibility

,

#user-experience

Imagine that you cannot use the mouse and have to Navigate a Website with the...

Dec 23, 2021

Top Terminal Commands I Use For Productivity

#linux

,

#cli

,

#terminal

The whole point of development is solving problems. But very often we Developers...

Nov 3, 2021

CSS Logical Properties

#css

,

#html

CSS logical properties are properties which are used to design element on the...

Oct 5, 2021

Fluid Typography in CSS 💧

#css

,

#html

,

#typography

CSS Best Practices in Fluid Typography

Aug 15, 2021

CSS Units in a Nutshell 🐚

#css

,

#html

Are you still writing your css units in pixels and percentages? if you are then...

Aug 8, 2021

Master Markdown in 5minutes ⌚

#markdown

,

#documentation

Markdown is a lightweight markup language for creating formatted text using a...

Aug 1, 2021

What is JAMStack ✨

#jamstack

Jamstack stands for Javascript APIS and Markup and it is based on this idea of...

Jul 31, 2021

+

Check my latest Blog Post

Are You Still Using Basic CSS? Here Are 7 Tricks to Get Ahead of the Curve

Read Now
Oh My Gawwdd!!!!!!!

Wow you have been viewing my site since 20 seconds!

+
+