Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Picture Perfect - An Image Optimization Talk

Picture Perfect - An Image Optimization Talk

Learn the tips and tricks that help production sites deliver images that have optimal Largest Contentful Paint and minimum Cumulative Layout Shift.

Addy Osmani

June 02, 2022
Tweet

More Decks by Addy Osmani

Other Decks in Technology

Transcript

  1. Major changes in the image landscape • WebP support in

    all modern browsers • AVIF image decode support landing in Chrome & Firefox • JPEGXL decoding behind a fl ag in Chrome • Lazy-loading images in Chrome, FF, Safari TP. A default in WordPress • Compute img/video aspect ratio from width/height attributes • FF support for preload, Chrome: imagesrcset and imagesizes on link rel=preload • width/height on <source> elements for <picture> • and more! 2020-2021
  2. The modern <img> element <img src="donut-800w.jpg" alt="A delicious donut" width="400"

    height="400" srcset="donut-400w.jpg 400w, donut-800w.jpg 800w" sizes="(max-width: 640px) 400px, 800px" loading="lazy" decoding="async" style="background-size: cover; background-image: url(data:image/svg+xml;base64,[svg text]);"> Lazy-load Async decode SET DIMENSIONS TO AVOID LAYOUT SHIFTS Placeholder
  3. 50% of the brain is involved in visual processing Time

    to get the sense of a visual scene 0.01s How much we recall of what we see or do vs. 20% of what we read. 80% Increase in willingness to read due to color visuals. 80% Neuroscience How much audiences more likely to be persuaded by a talk with visuals vs. a purely verbal one 17% To process a symbol and 100ms to attach meaning to it. 150ms Sources: goo.gle/imgsci
  4. Optimal image serving for Web Vitals • For a fast

    Largest Contentful Paint • Request your key hero image early • Use <picture>, srcset + e ff i cient modern image formats • Avoid wasting pixels (compress, don't serve overly high DPR images) • Lazy-load o ff screen images (reduce network contention for key resources) • For a low Cumulative Layout Shift • Set dimensions (width, height) on your images • Use CSS aspect-ratio or aspect-ratio boxes to reserve space otherwise • For a low impact First Input Delay • Avoid images causing network contention with other critical resources like CSS and JS.
  5. Largest Contentful Paint Element Lighthouse Audit function getLCPDebugTarget(entries) { const

    lastEntry = entries[entries.length - 1]; return lastEntry.element; } LCP API (RUM) web.dev/debug-web-vitals-in-the- fi eld/ User devices have di ff erent screen resolutions, which results in di ff erent page layouts and thus di ff erent elements being visible within the viewport. Content may be personalized for the current user, so the LCP candidate element could vary wildly from user to user. 🔬 ⛰
  6. Serving Modern Image Formats <picture> <source srcset="puppy.jxl" type="image/jxl"> <source srcset="puppy.avif"

    type="image/avif"> <source srcset="puppy.webp" type="image/webp"> <source srcset="puppy.jpg" type="image/jpeg"> <img src="puppy.jpg" alt="Cute puppy"> </picture>
  7. Picking an image format Compression • Compression • Speed •

    Limitations • Animation • Features • Tooling
  8. JPEG 80 vs AVIF 70 vs WEBP 85 54% size

    reduction vs JPEG 26% size reduction vs JPEG https://www.industrialempathy.com/posts/avif-webp-quality-settings/
  9. When lossy compression is good enough, both AVIF and JPEG

    XL deliver significantly better results than the existing web codecs, including WebP.
  10. Image Optimization Tooling Squoosh • Imagemin • ImageMagick • Sharp

    / Jimp • Thumbor • ImageOptim • XnConvert • Image CDNs
  11. Layout Shifts from images without dimensions Lighthouse audit function getCLSDebugTarget(entries)

    { const largestShift = entries.reduce(( return a && a.value > b.value ? a : }); if (largestShift && largestShift.sour const largestSource = largestShift. return a.node && a.previousRect.w b.previousRect.width * b.prev }); if (largestSource) { return largestSource.node; } } PerformanceObserver
  12. Lots of factors determine the best image size • Many

    factors determine the best image size • Screen size and resolution • Viewport • Layout and responsive breakpoints • Device pixel ratio (physical resolution) • Art direction Can one size fi t all?
  13. Responsive Images: srcset and sizes <img src="donut-800w.jpg" alt="A delicious pink

    donut." width="400" height="400" srcset="donut-400w.jpg 400w, donut-800w.jpg 800w" sizes="(max-width: 640px) 400px, 800px">
  14. Image Aspect Ratio Reserve space for responsive and lazy-loaded images

    Padding-top hack Mapped aspect-ratio Explicit aspect-ratio
  15. Enhanced image preview in DevTools File size, rendered size, rendered

    aspect ratio, intrinsic size, intrinsic aspect ratio
  16. Lazy-loading responsive images <!-- Lazy-load images in <picture>. <img> is

    the one driving image loading --> <picture> <source media="(min-width: 40em)" srcset="big.jpg 1x, big-hd.jpg 2x"> <source srcset="small.jpg 1x, small-hd.jpg 2x"> <img src="fallback.jpg" loading="lazy"> </picture> <img src="donut.jpg" alt="A delicious pink donut." loading="lazy" width="400" height="400"> Lazy-loading images
  17. Request your image early <link rel="preload" as="image" href="donut.jpg"> <link rel="preload"

    as="image" href="donut.webp" type="image/webp"> <link rel="preload" as="image" href="donut.jpg" imagesrcset=" poster_400px.jpg 400w, poster_800px.jpg 800w, poster_1600px.jpg 1600w" imagesizes="50vw">
  18. Placeholder using background-image <img src="donut-800w.jpg" alt="A delicious donut" width="400" height="400"

    srcset="donut-400w.jpg 400w, donut-800w.jpg 800w" sizes="(max-width: 640px) 400px, 800px" loading="lazy" decoding="async" style="background-size: cover; background-image: url(data:image/svg+xml;base64,[svg text]);"> Placeholder Final image
  19. Next.js Image Component • Automatic srcsets for images • Enforced

    sizing to prevent layout shift • Automatic lazy-loading of o ff screen assets • Framework-speci fi c asset prioritization optimizations • Flexible layout options • Customizable loader support for any image server or CDN Features and bene fi ts Up to 60% faster LCP and up to 100% reduced CLS
  20. Next.js Image Component Features and bene fi ts • Automatic

    srcsets for images • Enforced sizing to prevent layout shift • Automatic lazy-loading of o ff screen assets • Framework-speci fi c asset prioritization optimizations • Flexible layout options • Customizable loader support for any image server or CDN Up to 60% faster LCP and up to 100% reduced CLS
  21. Images in Next.js without Next Image import Head from 'next/head';

    export default function Index() { return ( <div> <Head><title>Create Next App</title></Head> <main> <div> <img src="/donut1.jpeg" alt="Donut" height={700} width={700} /> <img src="/donut2.jpeg" alt="Donut" height={700} width={700} /> </div> </main>
  22. Images in Next.js with Next Image import Head from 'next/head';

    import Image from 'next/image'; export default function Index() { return ( <div> <Head><title>Next.js Image Component</title></Head> <main> <div> <Image src="/donut1.jpeg" alt="Donut" height={700} width={700} /> <Image src="/donut2.jpeg" alt="Donut" height={700} width={700} /> </div>
  23. 31% improvement in LCP increased sales by 8% Optimizations to

    improve LCP included resizing their hero image, optimizing SVGs and using media queries to limit loading o ff screen images. Their optimizations to LCP included a 2.5s saving from switching their fi rst large image from being behind JavaScript (client-side hydration) to being directly in the main HTML document. 70% improvement in LCP correlated with a 76% reduction in load abandonment They determined shifts were caused after their hero images were loaded and snapped in for the fi rst view. They used Aspect Ratio Boxes to reserve space before their image was loaded. Optimizations to CLS helped increase News page views per session by 15% French Fashion house Chloè used Link Preload to preload their 1x and 2x Hero images, which were previously bottlenecked by a render-blocking script. Preloading 1x and 2x Hero images bottlenecked by render- blocking script improved LCP by 500ms (based on CrUX)
  24. Archive Slides that won't make the cut this time. •

    We can still summarize or include as notes.
  25. Automating Image Optimization in frameworks Image Components • Modern image

    components that build on <img>, like Next.js <Image> (for React) and Nuxt image (for Vue) try to bake in as many of these concepts as possible by default. • You can of course also do this manually just using the <img> element directly. • If using 11ty for your static sites, try the 11ty high-performance blog template.
  26. Avoid the download and shrink pattern Better to use srcset,

    sizes, <picture> to serve images w/right dimensions
  27. CLS

  28. Lazy-loading responsive images <!-- Lazy-load images in <picture>. <img> is

    the one driving image loading so <picture> and srcset fall off of that --> <picture> <source media="(min-width: 40em)" srcset="big.jpg 1x, big-hd.jpg 2x"> <source srcset="small.jpg 1x, small-hd.jpg 2x"> <img src="fallback.jpg" loading="lazy"> </picture>
  29. Request your image early <link rel="preload" as="image" href="donut.jpg"> <link rel="preload"

    as="image" href="donut.webp" type="image/webp"> <link rel="preload" as="image" href="donut.jpg" imagesrcset=" poster_400px.jpg 400w, poster_800px.jpg 800w, poster_1600px.jpg 1600w" imagesizes="50vw">
  30. Request your image early <link rel="preload" as="image" href="donut.jpg" imagesrcset=" poster_400px.jpg

    400w, poster_800px.jpg 800w, poster_1600px.jpg 1600w" imagesizes="50vw">
  31. Image decoding <img src="donut-800w.jpg" alt="A delicious donut" width="400" height="400" srcset="donut-400w.jpg

    400w, donut-800w.jpg 800w" sizes="(max-width: 640px) 400px, 800px" loading="lazy" decoding="async">
  32. Optimal image serving for Web Vitals • For a fast

    Largest Contentful Paint • Request your key hero image early • Use srcset + e ffi cient modern image formats • Avoid wasting pixels (compress, don't serve overly high DPR images) • Lazy-load o ff screen images (reduce network contention for key resources) • For a low Cumulative Layout Shift • Set dimensions (width, height) on your images • Use CSS aspect-ratio or aspect-ratio boxes to reserve space otherwise • For a low impact First Input Delay • Avoid images causing network contention with other critical resources like CSS and JS.