🍋
Menu
Best Practice Beginner 2 min read 489 words

Best Practices for Responsive Image Sizing on the Web

Serving the right image size for every screen width is critical for performance and user experience. This guide covers srcset, sizes, modern formats, and the art of balancing visual quality against page load speed.

Key Takeaways

  • A single high-resolution image that looks crisp on a 27-inch retina display wastes bandwidth when loaded on a 375px-wide mobile screen.
  • The `srcset` attribute provides the browser with a list of image sources and their widths (in `w` units) or pixel densities (in `x` units).
  • Generate image variants at logical breakpoints rather than at every possible width.
  • WebP provides 25-35% better compression than JPEG at equivalent quality.
  • Add `loading="lazy"` to images below the fold.

The Problem with One-Size-Fits-All Images

A single high-resolution image that looks crisp on a 27-inch retina display wastes bandwidth when loaded on a 375px-wide mobile screen. Conversely, an image optimized for mobile appears blurry on desktop. Responsive images solve this by letting the browser choose the most appropriate image source based on viewport width and device pixel ratio.

The srcset and sizes Attributes

How srcset Works

The srcset attribute provides the browser with a list of image sources and their widths (in w units) or pixel densities (in x units). The browser then selects the best match based on the current viewport and display density. Width descriptors (w) are preferred over pixel density descriptors (x) because they give the browser more information for decision-making.

The sizes Attribute

The sizes attribute tells the browser how wide the image will be displayed at each breakpoint. Without it, the browser assumes the image fills the full viewport width, which leads to unnecessarily large image downloads. A typical sizes value might be (max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw meaning full-width on mobile, half-width on tablet, one-third on desktop.

Choosing Breakpoints

Resolution Breakpoints

Generate image variants at logical breakpoints rather than at every possible width. A practical set for most projects is: 320px, 640px, 960px, 1280px, 1920px, and 2560px. This covers mobile through 5K displays with reasonable granularity.

File Size Steps

Rather than spacing breakpoints evenly by pixel width, space them by file size. If the difference between two variants is less than 20KB, the smaller one provides insufficient savings to justify an extra HTTP request or cache entry.

Modern Image Formats

WebP

WebP provides 25-35% better compression than JPEG at equivalent quality. Browser support is now universal in modern browsers (Chrome, Firefox, Safari, Edge). Use WebP as your primary format with JPEG as a fallback for older clients.

AVIF

AVIF offers 40-50% better compression than JPEG and supports HDR, wide color gamut, and transparency. Browser support is growing but not yet universal — Safari added support in version 16. Encode time is significantly slower than WebP, so pre-generate AVIF variants at build time rather than on-the-fly.

Performance Best Practices

Lazy Loading

Add loading="lazy" to images below the fold. This defers loading until the image is about to enter the viewport, reducing initial page load time. Never lazy-load the LCP (Largest Contentful Paint) image — it should load immediately.

Width and Height Attributes

Always specify width and height attributes (or use CSS aspect-ratio) to prevent layout shifts as images load. The browser uses these dimensions to reserve space before the image downloads. Cumulative Layout Shift (CLS) is a Core Web Vitals metric that penalizes layout instability.

CDN Optimization

Serve images from a CDN with immutable cache headers for hashed filenames. A typical configuration is Cache-Control: public, max-age=31536000, immutable for content-hashed URLs. This ensures repeat visitors never re-download unchanged images.

संबंधित टूल्स

संबंधित फ़ॉर्मेट

संबंधित गाइड