Formato HEIC Spiegato: Il Formato Immagine Moderno di Apple

Responsive images are essential for modern web development, ensuring users download appropriately sized images for their devices. This guide covers everything about implementing responsive images using srcset, sizes, and the picture element.

Why Responsive Images Matter

Serving the same large image to all devices wastes bandwidth and hurts performance.

The Problem with Fixed Images

Without responsive images:

  • Mobile users download desktop-sized images: 3-4x larger than needed
  • Wasted bandwidth: Especially problematic on cellular connections
  • Slow page loads: Large images are the #1 performance killer
  • Poor Core Web Vitals: Affects Google rankings
  • Higher costs: More bandwidth usage for hosting

The Benefits of Responsive Images

  • 50-80% bandwidth savings: Mobile users download much smaller files
  • Faster loading: Improved LCP (Largest Contentful Paint)
  • Better user experience: Faster perceived performance
  • SEO benefits: Better Core Web Vitals scores
  • Cost reduction: Lower CDN and bandwidth costs

Understanding srcset and sizes

The Basics: srcset

The srcset attribute lets you provide multiple image sources:

<img src="image-800.jpg"
     srcset="image-400.jpg 400w,
             image-800.jpg 800w,
             image-1200.jpg 1200w,
             image-1600.jpg 1600w"
     alt="Description">

How it works:

  • 400w means "this image is 400 pixels wide"
  • Browser knows its viewport width and pixel density
  • Browser calculates which image to download
  • Automatically chooses optimal image

Adding sizes: Tell the Browser Display Width

The sizes attribute specifies how wide the image will display:

<img src="image-800.jpg"
     srcset="image-400.jpg 400w,
             image-800.jpg 800w,
             image-1200.jpg 1200w"
     sizes="(max-width: 600px) 100vw,
            (max-width: 1200px) 50vw,
            800px"
     alt="Description">

Reading sizes:

  • (max-width: 600px) 100vw: On screens ≤600px, image is 100% of viewport
  • (max-width: 1200px) 50vw: On screens ≤1200px, image is 50% of viewport
  • 800px: Default (larger screens), image is 800px wide

Browser Selection Algorithm

Here's how the browser chooses an image:

1. Check viewport width: 375px (iPhone)
2. Check sizes: matches "(max-width: 600px) 100vw"
3. Calculate needed width: 375px × 100% = 375px
4. Check pixel density: 2x (Retina)
5. Calculate ideal image: 375px × 2 = 750px
6. Look at srcset: finds 800w is closest
7. Download image-800.jpg

Common Responsive Image Patterns

Pattern 1: Full-Width Hero Image

Image always spans full viewport width:

<img src="hero-1200.jpg"
     srcset="hero-400.jpg 400w,
             hero-800.jpg 800w,
             hero-1200.jpg 1200w,
             hero-1600.jpg 1600w,
             hero-2400.jpg 2400w"
     sizes="100vw"
     alt="Hero image"
     width="1200"
     height="600">

Result:

  • Mobile (375px @2x): Downloads 800w
  • Tablet (768px @2x): Downloads 1600w
  • Desktop (1920px): Downloads 2400w

Pattern 2: Constrained Content Image

Image within content column, max-width 800px:

<img src="content-800.jpg"
     srcset="content-400.jpg 400w,
             content-800.jpg 800w,
             content-1200.jpg 1200w,
             content-1600.jpg 1600w"
     sizes="(max-width: 800px) 100vw, 800px"
     alt="Content image"
     width="800"
     height="600">

Result:

  • Mobile (375px @2x): Downloads 800w
  • Desktop: Downloads 1600w (for Retina)
  • Standard display: Downloads 800w

Pattern 3: Sidebar Thumbnail

Small thumbnail, fixed size:

<img src="thumb-200.jpg"
     srcset="thumb-100.jpg 100w,
             thumb-200.jpg 200w,
             thumb-400.jpg 400w"
     sizes="200px"
     alt="Thumbnail"
     width="200"
     height="150">

Result:

  • Standard displays: Downloads 200w
  • Retina/HiDPI: Downloads 400w

Pattern 4: Responsive Grid Layout

Images in grid that changes columns:

<img src="grid-600.jpg"
     srcset="grid-300.jpg 300w,
             grid-600.jpg 600w,
             grid-900.jpg 900w,
             grid-1200.jpg 1200w"
     sizes="(max-width: 600px) 100vw,
            (max-width: 900px) 50vw,
            (max-width: 1200px) 33.33vw,
            25vw"
     alt="Grid item">

Result:

  • Mobile: 1 column (100vw)
  • Tablet: 2 columns (50vw)
  • Small desktop: 3 columns (33.33vw)
  • Large desktop: 4 columns (25vw)

The Picture Element: Art Direction

Use picture when you need different crops/versions for different screen sizes:

Basic Art Direction Example

<picture>
  <!-- Mobile: portrait crop -->
  <source media="(max-width: 600px)"
          srcset="portrait-400.jpg 400w, portrait-800.jpg 800w"
          sizes="100vw">

  <!-- Tablet: square crop -->
  <source media="(max-width: 1200px)"
          srcset="square-600.jpg 600w, square-1200.jpg 1200w"
          sizes="100vw">

  <!-- Desktop: landscape crop -->
  <img src="landscape-1200.jpg"
       srcset="landscape-1200.jpg 1200w, landscape-2400.jpg 2400w"
       sizes="100vw"
       alt="Responsive image with different crops">
</picture>

Combining Modern Formats with Art Direction

<picture>
  <!-- Mobile WebP -->
  <source media="(max-width: 600px)"
          type="image/webp"
          srcset="mobile.webp">

  <!-- Mobile JPG fallback -->
  <source media="(max-width: 600px)"
          srcset="mobile.jpg">

  <!-- Desktop WebP -->
  <source type="image/webp"
          srcset="desktop.webp">

  <!-- Desktop JPG fallback -->
  <img src="desktop.jpg" alt="Description">
</picture>

Creating Image Variations

Deciding on Breakpoints

Common image width breakpoints:

Device Viewport 1x Display 2x Display
Mobile S 320-375px 400w 800w
Mobile L 375-600px 600w 1200w
Tablet 600-900px 900w 1800w
Desktop 900-1200px 1200w 2400w
Large 1200px+ 1600w 3200w

Recommended set for most images:

  • 400w, 800w, 1200w, 1600w, 2400w

Automation Tools

Command line (ImageMagick):

# Generate multiple sizes
for width in 400 800 1200 1600 2400; do
  convert original.jpg -resize ${width}x -quality 85 image-${width}.jpg
done

Node.js (Sharp):

const sharp = require('sharp');

const widths = [400, 800, 1200, 1600, 2400];

widths.forEach(width => {
  sharp('original.jpg')
    .resize(width)
    .jpeg({ quality: 85 })
    .toFile(`image-${width}.jpg`);
});

Build tools:

  • Webpack: responsive-loader
  • Gulp: gulp-responsive
  • Next.js: Built-in Image component
  • Gatsby: gatsby-plugin-image

Framework-Specific Solutions

Next.js Image Component

import Image from 'next/image';

<Image
  src="/hero.jpg"
  alt="Hero image"
  width={1200}
  height={800}
  sizes="100vw"
  priority // Disable lazy loading for LCP image
/>

Benefits:

  • Automatic srcset generation
  • Automatic WebP conversion
  • Lazy loading by default
  • Blur placeholder support

WordPress Responsive Images

WordPress automatically generates srcset for uploaded images:

<?php the_post_thumbnail('large', [
  'sizes' => '(max-width: 600px) 100vw, 50vw'
]); ?>

React Responsive Images

function ResponsiveImage() {
  return (
    <img
      src="/image-800.jpg"
      srcSet="/image-400.jpg 400w,
              /image-800.jpg 800w,
              /image-1200.jpg 1200w"
      sizes="(max-width: 600px) 100vw, 800px"
      alt="Description"
      width="800"
      height="600"
    />
  );
}

Performance Optimization

Lazy Loading with Responsive Images

<img src="image-800.jpg"
     srcset="image-400.jpg 400w,
             image-800.jpg 800w,
             image-1200.jpg 1200w"
     sizes="(max-width: 600px) 100vw, 800px"
     alt="Description"
     loading="lazy"
     width="800"
     height="600">

Preloading LCP Responsive Image

<link rel="preload"
      as="image"
      href="hero-1200.jpg"
      imagesrcset="hero-400.jpg 400w,
                   hero-800.jpg 800w,
                   hero-1200.jpg 1200w,
                   hero-1600.jpg 1600w"
      imagesizes="100vw">

CDN with Automatic Resizing

Many CDNs can generate sizes on-the-fly:

<!-- Cloudinary example -->
<img src="https://res.cloudinary.com/demo/w_400/sample.jpg"
     srcset="https://res.cloudinary.com/demo/w_400/sample.jpg 400w,
             https://res.cloudinary.com/demo/w_800/sample.jpg 800w,
             https://res.cloudinary.com/demo/w_1200/sample.jpg 1200w"
     sizes="100vw"
     alt="Sample">

Testing Responsive Images

Browser DevTools

Chrome DevTools:

  1. Open DevTools (F12)
  2. Go to Network tab
  3. Filter by "Img"
  4. Change device/viewport width
  5. Reload and check which image is downloaded

Testing Different Scenarios

Test these combinations:

  • Mobile (375px @2x): iPhone 11/12/13
  • Tablet (768px @2x): iPad
  • Desktop (1920px @1x): Standard monitor
  • Desktop (1920px @2x): MacBook Pro
  • 4K (3840px @1x): Large display

Validation Tools

  • RespImageLint: Validates responsive image markup
  • Lighthouse: Checks if properly sized images are served
  • Chrome Coverage: Shows unused image bytes

Common Mistakes and Solutions

Mistake 1: Incorrect sizes Attribute

Problem: sizes doesn't match actual display width

Solution: Measure actual image width at different breakpoints

<!-- Bad: sizes doesn't match reality -->
<img srcset="..." sizes="100vw">
<!-- But image actually displays at 50% width -->

<!-- Good: sizes matches actual width -->
<img srcset="..." sizes="50vw">

Mistake 2: Too Many or Too Few Sizes

Problem: Either too many image files or too large gaps

Solution: 5-7 sizes is usually optimal

Mistake 3: Missing width/height

Problem: Causes layout shift (CLS)

Solution: Always specify dimensions

<!-- Bad -->
<img src="..." srcset="..." sizes="...">

<!-- Good -->
<img src="..." srcset="..." sizes="..." width="800" height="600">

Mistake 4: Not Accounting for DPI

Problem: Images look blurry on Retina displays

Solution: Provide 2x images in srcset

Real-World Implementation Checklist

  • □ Generate 5-7 image sizes (400w, 800w, 1200w, 1600w, 2400w)
  • □ Compress all image sizes (WebP or JPG)
  • □ Write srcset with width descriptors (400w, 800w, etc.)
  • □ Write accurate sizes attribute
  • □ Specify width and height attributes
  • □ Add descriptive alt text
  • □ Use loading="lazy" for below-the-fold images
  • □ Preload LCP image if it's responsive
  • □ Test on real devices at different screen sizes
  • □ Verify correct images are downloaded in DevTools

Conclusion

Responsive images using srcset and sizes are essential for modern web performance. By serving appropriately sized images to each device, you can reduce bandwidth usage by 50-80%, dramatically improve loading times, and enhance user experience across all devices.

Start with the basic srcset pattern, measure your actual display widths to write accurate sizes attributes, and progressively enhance with the picture element for art direction when needed. Test thoroughly across devices, and leverage modern frameworks and CDNs to automate the heavy lifting.

Domande Frequenti

Cos'è HEIC e perché il mio iPhone lo usa?

HEIC (High Efficiency Image Container) usa compressione HEVC per file del 50% più piccoli di JPG alla stessa qualità. Gli iPhone usano HEIC per impostazione predefinita per risparmiare spazio di archiviazione.

Posso usare immagini HEIC sul mio sito web?

No, HEIC ha scarso supporto browser. Converti HEIC in JPG o WebP per uso web. Safari su iOS supporta HEIC ma altri browser no.

Come converto HEIC in JPG?

Usa convertitori online, app desktop come iMazing HEIC Converter (Windows) o strumenti da riga di comando. Anteprima macOS può esportare HEIC come JPG. Molti processori di immagini ora supportano HEIC.