Image Gallery with PhotoSwipe

Easily add animated image zoom to your React app using PhotoSwipe library for stunning image galleries

Pulkit
Pulkit
13 min read153views
ReactPhotoSwipeImage GalleryAnimation

In one of my recent projects(image-tweaker), I provided users with the ability to upload images, which were then displayed in a collection on the dashboard. I was searching for a way to give these images a cool animated view, and that's when I discovered PhotoSwipe!

PhotoSwipe is a powerful, easy-to-use JavaScript library that allows you to create beautiful, animated image galleries. It provides a smooth and responsive experience, making your image collections look stunning on any device.

Let's make an image gallery in React with the react-photoswipe-gallery.

Let's Start by Bootstrapping a Fresh React-TS App

BASH
npm create vite@latest react-app-gallery -- --template react
cd react-app-gallery
npm install
npm run dev

And just like that, we have our plain Vite React app ready to go!

This will set up a new React project with TypeScript support. You should see a default Vite React app running at http://localhost:3000.

Default Vite React app running in browser

Clean Up the Default Setup

You can also remove the default CSS in App.css and index.css.

TSX
export default function App() {
  return <div>App</div>;
}

Adding PhotoSwipe

Now let's start adding the dependencies

BASH
npm i react-photoswipe-gallery photoswipe

Include the CSS file from photoswipe. (As a best practice, I typically add these types of default CSS files in main.tsx.)

TSX
import "photoswipe/dist/photoswipe.css";

Creating the Image Gallery

Now, let's create a simple image gallery using react-photoswipe-gallery. Update App.tsx with the following code:

Add some images and include their links in App.tsx, like this:

TSX
import Image1 from "./assets/image1.png";
import Image2 from "./assets/image2.png";
import Image3 from "./assets/image3.png";

make an array of images(you can use external links as well)

TSX
const images = [Image1, Image2, Image3];

Now, to add the photoswipe gallery, let's wrap the images in Gallery.

TSX
import { Gallery, Item } from "react-photoswipe-gallery";

import Image1 from "./assets/image1.png";
import Image2 from "./assets/image2.png";
import Image3 from "./assets/image3.png";

export default function App() {
  const images = [Image1, Image2, Image3];
  return <Gallery>// images here</Gallery>;
}

A single image inside the gallery looks like this:

TSX
<Item original={image} width="1024" height="768">
  {({ ref, open }) => (
    <img
      ref={ref}
      onClick={open}
      src={image}
      style={{
        width: "200px",
        height: "200px",
      }}
    />
  )}
</Item>;

This code creates an image item within a gallery using the react-photoswipe-gallery library. Here's a breakdown of this spooky code:

  • <Item>: This is a component from the react-photoswipe-gallery library that represents a single image item in the gallery.
    • original={image}: This prop sets the original, full-size image source.
  • {({ ref, open }) => (...)}: This is a render prop function that provides two arguments:
    • ref: A reference to the image element, used to track and manipulate the DOM element.
    • open: A function that opens the image in the gallery when called.

But we have an array of images, so we simply map the array

TSX
{
  images.map((image, index) => (
    <Item
      key={index}
      original={image}
      width="1024"
      height="768"
    >
      {({ ref, open }) => (
        <img
          ref={ref}
          onClick={open}
          src={image}
          style={{
            width: "200px",
            height: "200px",
          }}
        />
      )}
    </Item>
  ));
}

Currently, the image appears quite congested.

Three images displayed without spacing

Just so as to add some breathing space let's add some styles

TSX
style={{
  width: "200px",
  height: "200px",
  margin: 10,
  cursor: "pointer",
  borderRadius: 10,
}}

And yes, it works fine now, here's the complete code

TSX
import { Gallery, Item } from "react-photoswipe-gallery";

import Image1 from "./assets/image1.png";
import Image2 from "./assets/image2.png";
import Image3 from "./assets/image3.png";

export default function App() {
  const images = [Image1, Image2, Image3];
  return (
    <Gallery>
      {images.map((image, index) => (
        <Item
          key={index}
          original={image}
          width="1024"
          height="768"
        >
          {({ ref, open }) => (
            <img
              ref={ref}
              onClick={open}
              src={image}
              style={{
                width: "200px",
                height: "200px",
                margin: 10,
                cursor: "pointer",
                borderRadius: 10,
              }}
            />
          )}
        </Item>
      ))}
    </Gallery>
  );
}

Here's the final version!

With these changes, your image gallery should now look much cleaner and more user-friendly. The added margin and rounded corners give each image some breathing room and a polished appearance. Enjoy your improved gallery!

Related Posts

More posts you might enjoy

Made with ❤️ by Pulkit

© 2026 Pulkit. All rights reserved

DMCA Verified

Last updated: