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-react
import { 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
optimize
prop for automatic responsive handling - Adjust Loading Offset: Set an appropriate
offset
based on your use case - Choose Appropriate Quality: Balance quality and file size with the
quality
prop
MIT © Asfak Ahmed ( rahi )