CSS RWD Images

Making images responsive and adaptive

🖼️ What are Responsive Images?

Responsive images automatically scale and adapt to different screen sizes and resolutions. They ensure images look great on all devices while optimizing loading performance.


/* Basic responsive image */
img {
    max-width: 100%;
    height: auto;
}
                                    

Output:

Responsive Image Example

✅ Scales down on smaller screens

Responsive Image Techniques

📐

CSS Scaling

Use CSS to make images flexible

max-width: 100%;
🎯

Srcset Attribute

Provide multiple image sizes

srcset="image-320w.jpg 320w"
🖼️

Picture Element

Art direction for different screens

<picture><source></picture>

Lazy Loading

Load images when needed

loading="lazy"

🔹 Basic Responsive Images

Creating responsive images with CSS ensures they scale appropriately across all device screens without distortion. Apply max‑width: 100% and height: auto to any <img> element, allowing the image to shrink within its container while preserving its aspect ratio. This simple technique prevents horizontal scrolling on small screens and maintains visual integrity on large displays. For better performance, combine this with the srcset attribute to serve appropriately sized image files. Responsive images improve user experience, page speed, and SEO by adapting to different viewport dimensions seamlessly.

/* Basic responsive image */
img {
    max-width: 300px; /* Reduced from 100% */
    height: auto;
    display: block;
}
/* Responsive image with container */
.image-container {
    width: 100%;
    max-width: 300px; /* Reduced from 600px */
    margin: 0 auto;
}
.image-container img {
    width: 100%;
    height: auto;
    border-radius: 8px;
    box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}

Example:

Basic Responsive Image:
Basic responsive image
With Container & Styling:
Responsive image with container

↑ Try resizing your browser window to see how both images respond differently

HTML:

<!-- Basic responsive image -->
<img src="image.jpg" alt="Basic responsive image">

<!-- Image with container -->
<div class="image-container">
    <img src="image.jpg" alt="Responsive image with container">
</div>

🔹 Srcset for Different Resolutions

The srcset attribute delivers optimally sized images based on device resolution and viewport width. By providing multiple image sources with descriptors (e.g., 1x, 2x or width w), the browser can select the most efficient file for the user’s screen. This reduces unnecessary data transfer on mobile devices while ensuring crisp visuals on high‑DPI displays. Pair srcset with the sizes attribute to inform the browser about the image’s display dimensions. Implementing responsive images with srcset enhances loading performance, conserves bandwidth, and supports Core Web Vitals metrics.

<!-- Responsive images with srcset -->
<img src="assets/img/demo1.png"
     srcset="assets/img/demo1-320w.png 320w,
             assets/img/demo1-480w.png 480w,
             assets/img/demo1-800w.png 800w,
             assets/img/demo1.png 1200w"
     sizes="(max-width: 320px) 280px,
            (max-width: 480px) 440px,
            (max-width: 800px) 760px,
            1200px"
     alt="Responsive image with multiple sizes">

Example:

Responsive image with multiple sizes

How it works:

  • srcset: Lists available image sizes
  • sizes: Tells browser which size to use when
  • Browser: Automatically picks the best image

🔹 Picture Element for Art Direction

The <picture> element enables art direction by serving different images for distinct layout breakpoints. It wraps multiple <source> tags with media queries, allowing precise control over which image version loads at specific screen sizes. This is ideal for hero images, banners, or any visual content that requires cropping, focal‑point adjustment, or format changes across devices. The <img> inside acts as a fallback for older browsers. Using the picture element improves visual storytelling, ensures critical imagery remains impactful on all screens, and complements a responsive design strategy.

<picture>
    <!-- Large screens: landscape image -->
    <source media="(min-width: 800px)" 
            srcset="hero-landscape.jpg">
    
    <!-- Medium screens: square crop -->
    <source media="(min-width: 400px)" 
            srcset="hero-square.jpg">
    
    <!-- Small screens: portrait crop -->
    <img src="hero-portrait.jpg" 
         alt="Hero image">
</picture>

Visual Example:

Desktop Landscape
Tablet Square
Mobile Portrait

🔹 Modern Image Formats

Modern image formats like WebP, AVIF, and JPEG‑XL offer superior compression and quality compared to traditional JPEG or PNG. These formats support advanced features such as transparency, animation, and high color depth while significantly reducing file sizes. Implement them with fallback mechanisms using the <picture> element or type attribute to ensure compatibility across browsers. Adopting modern formats accelerates page loads, reduces bandwidth consumption, and improves user experience—key factors for SEO and conversion rates. Always provide a legacy format fallback to maintain accessibility for all users.

<picture>
    <!-- Modern formats for supported browsers -->
    <source srcset="image.avif" type="image/avif">
    <source srcset="image.webp" type="image/webp">
    
    <!-- Fallback for older browsers -->
    <img src="image.jpg" alt="Modern image with fallbacks">
</picture>

Format Benefits:

  • AVIF: Best compression, newest format
  • WebP: Great compression, wide support
  • JPEG: Universal fallback

🔹 CSS Object-Fit for Image Cropping

Control how images fit within containers:

/* Image gallery with consistent sizes */
.gallery {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 20px;
}

.gallery-item {
    aspect-ratio: 1; /* Square containers */
    overflow: hidden;
    border-radius: 8px;
}

.gallery-item img {
    width: 100%;
    height: 100%;
    object-fit: cover; /* Crop to fill container */
    object-position: center;
    transition: transform 0.3s ease;
}

.gallery-item:hover img {
    transform: scale(1.05);
}

/* Different object-fit values */
.cover { object-fit: cover; }     /* Crop to fill */
.contain { object-fit: contain; } /* Fit entire image */
.fill { object-fit: fill; }       /* Stretch to fill */

Object-fit Examples:

Cover example
Contain example
Fill example

🔹 Performance Optimization

Image performance optimization is crucial for fast page loads, better user engagement, and higher search engine rankings. Techniques include compressing images without quality loss, choosing appropriate formats (WebP/AVIF), implementing lazy loading with loading="lazy", and using responsive images with srcset. Additionally, leverage Content Delivery Networks (CDNs) for faster delivery and set proper cache headers. Optimized images reduce Largest Contentful Paint (LCP) and overall page weight, directly improving Core Web Vitals scores. Regular audits with tools like Lighthouse or PageSpeed Insights help identify further optimization opportunities.

<!-- Lazy loading -->
<img src="image.jpg" 
     alt="Lazy loaded image"
     loading="lazy">

<!-- Preload critical images -->
<link rel="preload" as="image" href="hero-image.jpg">

<!-- Responsive with lazy loading -->
<img src="placeholder.jpg"
     data-src="image-800w.jpg"
     data-srcset="image-320w.jpg 320w,
                  image-480w.jpg 480w,
                  image-800w.jpg 800w"
     alt="Optimized responsive image"
     loading="lazy"
     class="lazy">

Performance Tips:

  • Use appropriate image formats (WebP, AVIF)
  • Compress images without losing quality
  • Use lazy loading for images below the fold
  • Preload critical above-the-fold images
  • Use CDN for faster image delivery

🧠 Test Your Knowledge

What CSS property makes images responsive?