A highly customizable, performance-focused React component for lazy loading images with advanced features like placeholder effects, image optimization, and responsive loading.
Try it with our Playground
- 🎯 Lazy Loading: Load images only when they enter the viewport
- 🖼 Placeholder Support: Multiple placeholder types while images load
- 🎨 Effect Transitions: Smooth transitions with blur, opacity, or color effects
- 📱 Responsive Images: Automatic srcset and sizes generation
- ⚡ Performance Optimized: Intersection Observer for efficient lazy loading
- 🛠 Highly Customizable: Extensive props for fine-tuning behavior
- 📦 Lightweight: Small bundle size.
If our GitHub repository reaches 200 stars ⭐, we will proudly launch the Vue version of this package.
npm install zenui-image-reactimport { LazyLoadImage } from 'zenui-image-react'; function MyComponent() { return ( <LazyLoadImage src="https://example.com/image.jpg" alt="Example" placeholderType="effect" effectType="blur" /> ); }Choose from multiple placeholder types while your image loads:
// Effect Placeholder (blur, opacity, or color) <LazyLoadImage src="image.jpg" placeholderType="effect" effectType="blur" effectAmount={10} /> // Custom Image Placeholder <LazyLoadImage src="image.jpg" placeholderType="image" placeholderImage="placeholder.jpg" /> // Custom Component Placeholder <LazyLoadImage src="image.jpg" placeholderType="custom" customPlaceholder={<MyCustomLoader />} />Enable automatic responsive image optimization:
<LazyLoadImage src="image.jpg" optimize quality={80} breakpoints={{ sm: 576, md: 768, lg: 992, xl: 1200 }} imageWidths={{ sm: [576], md: [768], lg: [992], xl: [1200] }} />Control the intersection observer and loading offset:
<LazyLoadImage src="image.jpg" useIntersectionObserver={true} offset={200} // Start loading 200px before entering viewport onLoad={() => console.log('Image loaded')} onError={(e) => console.error('Load failed:', e)} />| Prop | Type | Default | Description |
|---|---|---|---|
src | string | Required | Image source URL |
alt | string | '' | Alt text for the image |
className | string | '' | CSS class name |
style | object | {} | Inline styles |
placeholderType | enum | 'none' | Type of placeholder ('none', 'effect', 'image', 'custom') |
effectType | enum | 'blur' | Effect type ('blur', 'opacity', 'color') |
effectAmount | number | 10 | Intensity of the effect |
placeholderImage | string | - | URL for placeholder image |
customPlaceholder | element | - | Custom React component as placeholder |
optimize | boolean | false | Enable responsive image optimization |
quality | number | 80 | Image quality (1-100) when optimize is true |
breakpoints | object | - | Custom breakpoints for responsive loading |
imageWidths | object | - | Width configurations for each breakpoint |
sizes | string | - | Custom sizes attribute for responsive images |
useIntersectionObserver | boolean | true | Enable/disable intersection observer |
offset | number | 0 | Loading offset in pixels |
onLoad | function | - | Callback when image loads |
onError | function | - | Callback when image fails to load |
{ xs: 320, sm: 576, md: 768, lg: 992, xl: 1200, xxl: 1400 }{ xs: [320], sm: [576], md: [768], lg: [992], xl: [1200], xxl: [1400] }- Use WebP Format: Provide WebP images when possible for better compression
- Optimize Image Dimensions: Use appropriate image sizes for different breakpoints
- Enable Optimization: Use the
optimizeprop for automatic responsive handling - Adjust Loading Offset: Set an appropriate
offsetbased on your use case - Choose Appropriate Quality: Balance quality and file size with the
qualityprop
MIT © Asfak Ahmed ( rahi )
