A responsive React image gallery component with an optional lightbox for displaying image grids in React applications.
- SEO friendly
- Fullscreen support
- Keyboard accessible
- Mobile responsive
- Lightbox with translucent background
- Thumbnails
- Image captions
- Lazy loading support
- Set column numbers dynamically or manually
- Resolution switching compatible
- Customizable styles
Live demo, installation guide, and walkthrough:
https://codesweetly.com/react-image-grid-gallery
Install the package with your preferred package manager.
npm install react-image-grid-gallery --save
yarn add react-image-grid-gallery
pnpm add react-image-grid-gallery
Import the library and its stylesheet, then use it like this:
import { ImageGallery } from "react-image-grid-gallery";
import "react-image-grid-gallery/style.css";
const imagesArray = [
{
id: "uniqueid111",
alt: "Image1's alt text",
caption: "Image1's description",
src: "http://example.com/image1.jpg",
},
{
id: "uniqueid222",
alt: "Image2's alt text",
caption: "Image2's description",
src: "http://example.com/image2.png",
thumbSrc: "http://example.com/image2_640.png",
},
{
id: "uniqueid333",
alt: "Image3's alt text",
caption: "Image3's description",
cta: {
href: "https://example.com",
rel: "noopener noreferrer",
target: "_blank",
text: "Learn more",
},
src: "http://example.com/image3.webp?w=2400",
gridSrc: "http://example.com/image3.webp?w=1280",
thumbSrc: "http://example.com/image3.webp?w=640",
srcSet:
"http://example.com/image3.webp?w=2400 2400w, http://example.com/image3.webp?w=1280 1280w, http://example.com/image3.webp?w=640 640w",
mediaSizes: "(max-width: 640px) 640w, (max-width: 1024px) 1280w, 2400px",
},
];
function App() {
return <ImageGallery imagesData={imagesArray} gapSize={24} />;
}The components rely on predefined CSS classes for styling. Importing the stylesheet once ensures consistent styling across the gallery components.
| Props | Type | Default | Description |
|---|---|---|---|
imagesData |
array | undefined |
(Required) An array of objects containing the following properties:
|
| number or keyword (string) | "auto" |
(Optional) The number of columns. | |
| number or keyword (string) | 230 |
(Optional) The minimum width of the gallery's columns. | |
customizeImageClickAction |
function | () => {} |
(Optional) A function to be executed when an image is clicked, if The Example 1: <ImageGallery
imagesData={imagesArray}
enableDefaultLightbox={false}
customizeImageClickAction={() => {
console.log("Image clicked!");
}}
/>Example 2: <ImageGallery
imagesData={imagesArray}
enableDefaultLightbox={false}
customizeImageClickAction={(imageData, index) => {
console.log("Image clicked:", imageData, index);
}}
/>note: The |
enableDefaultLightbox |
boolean | true |
(Optional) Specify whether to use the package’s default lightbox. If set to |
fixedCaption |
boolean | false |
(Optional) Specify whether to display the image captions permanently ( |
| number | 24 |
(Optional) The gallery's gap size. | |
lazy |
boolean | true |
(Optional) Specify whether to lazy load images. |
lazyFromIndex |
number | 6 |
(Optional) The image's index to begin the grid's lazy loading. tip: Use a negative number to lazy load all the images. |
thumbnailBorder |
string | "3px solid #fff" |
(Optional) The thumbnail's border style. |
Remix users should add "react-image-grid-gallery" to their remix.config.js file:
/** @type {import('@remix-run/dev').AppConfig} */
module.exports = {
ignoredRouteFiles: ["**/.*"],
+ serverDependenciesToBundle: ["react-image-grid-gallery"],
serverModuleFormat: "cjs",
};The serverDependenciesToBundle field tells Remix to transpile and include the "react-image-grid-gallery" package in the server bundle.
NextJS users should declare the "use client" directive at the top of their file. It should sit above all other import statements like so:
+ "use client";
import { ImageGallery } from "react-image-grid-gallery";
import "react-image-grid-gallery/style.css";
import { YouTubePlaylist } from "@codesweetly/react-youtube-playlist";The "use client" directive tells NextJS to consider all modules imported into the page as part of the Client Component module graph.
The ImageGallery package works only as a Client Component because it uses React's State and Lifecycle effects, such as useState() and useEffect().
Did you get a ReferenceError: crypto is not defined error during the build step? If so, this note is for you.
Wrap the ImageGallery component in <BrowserOnly> if you get a ReferenceError: crypto is not defined error during your build step.
import BrowserOnly from "@docusaurus/BrowserOnly";
function YourComponent() {
return (
<BrowserOnly fallback={<div>Loading...</div>}>
{() => {
const ImageGallery = require("react-image-grid-gallery").ImageGallery;
require("react-image-grid-gallery/style.css");
return (
<ImageGallery
imagesData={imagesArray}
columnCount={"auto"}
columnWidth={230}
gapSize={24}
/>
);
}}
</BrowserOnly>
);
}This process is essential if your imagesArray uses the Web Crypto API. The <BrowserOnly> component tells Docusaurus to render the ImageGallery library only in the browser. It ensures that the Crypto API runs only in CSR (Client-Side Rendering) rather than during build or SSR (Server-Side Rendering).
npm run buildContributions, bug reports, and suggestions are welcome and appreciated.
If you find an issue or have an improvement to propose, please open an issue or submit a pull request.
For larger changes, it is helpful to open an issue first so we can discuss the proposed direction before implementation.
Need help integrating this package, customizing the gallery, or solving a frontend implementation issue?