react-image-grid-gallery
v4.0.1
Published
A simple image gallery with lightbox for displaying a grid of images in React apps
Maintainers
Readme
React Image Grid Gallery
A simple, easy-to-use, and responsive image gallery component with a lightbox for displaying a grid of images in React apps.
Features
- 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 and Tutorial
Available at: https://codesweetly.com/react-image-grid-gallery
Installation
This section shows how to install the React Image Grid Gallery package.
Using npm
npm install react-image-grid-gallery --saveUsing yarn
yarn add react-image-grid-galleryUsing pnpm
pnpm add react-image-grid-galleryUsage
Import the library and its stylesheet, and use it as shown below:
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} />;
}Why import the stylesheet?
The components rely on predefined CSS classes for styling. Importing the stylesheet once ensures consistent application of these styles across all components.
Props
(Required) An array of objects containing the following properties:
id: (Required - string or number) Each image's unique identifying key.alt: (Required - string) The image's alternative text.caption: (Optional - string) The image's description.cta: (Optional - object) This feature lets you add a link to each image's caption in the lightbox, allowing users to visit a related page. The CTA (call-to-action) object accepts the following properties:href(string): The URL that the CTA link will point to. (Required)rel(string): Specifies the relationship between the current document and the linked document (e.g.,noopener noreferrerfor security reasons when using_blank).target(string): Specifies where to open the linked document (e.g.,_blankfor a new tab).text(string): The text that will be displayed for the CTA link in the image caption within the lightbox. (Required)
src: (Required - string) The image's default URL.gridSrc: (Optional - string) The preferred grid image's URL.thumbSrc: (Optional - string) The preferred thumbnail image's URL.srcSet: (Optional - string) The set of images' URLs and sizes for resolution switching.mediaSizes: (Optional - string) The media conditions and image sizes that hint the browser on the specificsrcSetto display when a media condition is true.
(Optional) A function to be executed when an image is clicked, if enableDefaultLightbox is false. This allows you to implement your own custom lightbox or any other action on image click.
The customizeImageClickAction function receives two arguments, imageData and index, which are automatically provided. These arguments give you access to the data of the clicked image.
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 customizeImageClickAction feature is not compatible with the Astro framework, as Astro does not support passing functions to hydrated components.
(Optional) Specify whether to use the package’s default lightbox. If set to false, you can use the customizeImageClickAction prop to implement your own lightbox or any other action when an image is clicked.
(Optional) Specify whether to display the image captions permanently (true) or to hide them by default and ease them in on mouse hover (false).
(Optional) The image's index to begin the grid's lazy loading.
tip: Use a negative number to lazy load all the images.
Note for Remix Users
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.
Note for NextJS users
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 { 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().
Note for Docusaurus users
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;
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).
Build
npm run build