DEV Community

Cover image for Let's create Pinterest's home feed layout using tailwind CSS & a Simple CSS Trick
Sabin Baniya
Sabin Baniya

Posted on

2 1

Let's create Pinterest's home feed layout using tailwind CSS & a Simple CSS Trick

Hey guys, Today we are going to be making Pinterest's masonry grid layout of their home feed. We will be using Next.JS & tailwind CSS with Unsplash API for this project.

First, let's have a look at what we're going to be building.

Here's what the home feed of Pinterest looks like

Creating Pinterest layout with tailwind CSS

Upon inspecting with Chrome Devtools, We can see that they have implemented the layout using translate and absolute position, etc. for their layout.

Creating Pinterest layout with tailwind CSS

But we are going to be implementing the same layout in a much simpler way, using Columns. Columns is a CSS shorthand for column count & column width property. I first saw this in the tailwind docs as class and later realized that it's a CSS property. So, what this property does is it helps in dividing an element into columns that you specify. Kinda like the columns in a newspaper article.

You can checkout the tailwind docs for columns here.

Let's go ahead and get access to Unsplash API. Go to Unsplash developer , register your application & you will be able to get access & secret key for that project.

Now let's use create-next-app to create a next.js application for us.

npx create-next-app pinterest-layout
Enter fullscreen mode Exit fullscreen mode

Let's install our dependencies for this project. First, Tailwind CSS.

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
Enter fullscreen mode Exit fullscreen mode

After running the two commands, your root directory shall now have a tailwind.config.js file.

In that file remove all existing code & add the following snippet:

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./pages/**/*.{js,ts,jsx,tsx}",
    "./components/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
};
Enter fullscreen mode Exit fullscreen mode

Now under /styles/globals.css. Remove all existing code & add the following snippet:

@tailwind base;
@tailwind components;
@tailwind utilities;
Enter fullscreen mode Exit fullscreen mode

Now, Let's go to /pages/index.js now. We will remove all the existing code and add the following snippet:

import Head from "next/head"
const Home = () => {
  return <>
    <Head>
        <title>Pinterest</title>
    </Head>
  </>;
};

export default Home;
Enter fullscreen mode Exit fullscreen mode

Now with this much done, we can start to set up our unsplash api, first create a .env.local file in your root directory.

Add in your access key provided in the Unsplash developer portal.

Now let's install the Unsplash library

npm i unsplash-js
Enter fullscreen mode Exit fullscreen mode

After that let's initialize the instance to make request to unsplash api as said in their docs.

We will be using getServerSideProps to make request from our server to the unsplash server & we will return the response as props to the page.

import { createApi } from "unsplash-js";

export const getServerSideProps = async () => {
  const serverApi = createApi({
    accessKey: process.env.ACCESS_KEY,
  });

  const photos = await serverApi.photos.list({perPage: 30});
  return {
    props: {
      photos: photos.response.results,
    },
  };
};
Enter fullscreen mode Exit fullscreen mode

Now if everything goes well till here, then we will get photos props in our page and we will be able to access it via props.

Now lets map over the photos prop.

const Home = ({ photos }) => {
  return (
    <>
      <Head>
        <title>Pinterest</title>
      </Head>
      <section>
             {photos.map((el) => (
                <div key={el.id}>
                  <img
                    src={el.urls.regular}
                    alt={el.description}
                    height={300}
                    width={200}
                  />
                </div>
              ))}     
      </section>
    </>
  );
};
Enter fullscreen mode Exit fullscreen mode

Now after we map the images they should lay normally like this.

Creating Pinterest layout with tailwind CSS

And after we add the class of columns to the containing section of whole images, we will use a 7 column layout for this one, and after changing the code to

<section className='columns-7 max-w-7xl mx-auto space-y-4'>
        {photos.map((el) => (
          <div key={el.id} className='rounded-md overflow-hidden'>
            <img
              src={el.urls.regular}
              alt={el.description}
              height={300}
              width={200}
            />
          </div>
        ))}
</section>
Enter fullscreen mode Exit fullscreen mode

We will see the layout work like magic with no extra work, we get a beautiful layout

Creating Pinterest layout with tailwind CSS

All right that's it, that is how we can achieve Pinterest like layout in a simple way using CSS columns, in next.js with Tailwindcss.

If you read all the way, thanks for reading the whole blog.

Any comments would be much appreciated.

About Me: My name is Sabin. I'm a full stack web developer and designer based in Pokhara, Nepal. I'm new to writing blogs and will continue to write hopefully 🤞. I focus primarily on the frontend with Next.js & React.js

Sentry blog image

How to reduce TTFB

In the past few years in the web dev world, we’ve seen a significant push towards rendering our websites on the server. Doing so is better for SEO and performs better on low-powered devices, but one thing we had to sacrifice is TTFB.

In this article, we’ll see how we can identify what makes our TTFB high so we can fix it.

Read more

Top comments (0)

SurveyJS custom survey software

JavaScript Form Builder UI Component

Generate dynamic JSON-driven forms directly in your JavaScript app (Angular, React, Vue.js, jQuery) with a fully customizable drag-and-drop form builder. Easily integrate with any backend system and retain full ownership over your data, with no user or form submission limits.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay