CloudRank - SEO, Managed Hosting, Cloud Hosting & Guides
  • Cloud
    • Public Cloud
    • AWS
    • Google Cloud Platform
    • Microsoft Azure
    • PaaS & SaaS
    • CRM
  • CRM
    • Customer Relationship Management
  • Managed Hosting
    • Managed Services & Hosting
    • Hybrid Cloud Connectivity
    • Managed Kubernetes
    • Azure Managed Kubernetes
  • eCommerce
    • WooCommerce
    • WooCommerce Guides
    • WooCommerce Managed Hosting
    • WooCommerce Plugins
    • WooCommerce Cloud Hosting
    • Shopify
    • Shopify Dropshipping
    • Shopify SEO
    • Shopify Themes
    • Shopify Tools
  • WordPress
    • WordPress Guides
    • WordPress Cloud Hosting
    • Managed WordPress Hosting
    • WordPress VPS Hosting
    • WordPress Hosting
  • SEO & Marketing
    • SEO Guides
    • SEO Tools
    • Backlink Tools
CloudRankLogo

Main Menu

  • Cloud
    • Public Cloud
    • AWS
    • Google Cloud Platform
    • Microsoft Azure
    • PaaS & SaaS
    • CRM
  • CRM
    • Customer Relationship Management
  • Managed Hosting
    • Managed Services & Hosting
    • Hybrid Cloud Connectivity
    • Managed Kubernetes
    • Azure Managed Kubernetes
  • eCommerce
    • WooCommerce
    • WooCommerce Guides
    • WooCommerce Managed Hosting
    • WooCommerce Plugins
    • WooCommerce Cloud Hosting
    • Shopify
    • Shopify Dropshipping
    • Shopify SEO
    • Shopify Themes
    • Shopify Tools
  • WordPress
    • WordPress Guides
    • WordPress Cloud Hosting
    • Managed WordPress Hosting
    • WordPress VPS Hosting
    • WordPress Hosting
  • SEO & Marketing
    • SEO Guides
    • SEO Tools
    • Backlink Tools

More from us

Type and hit Enter to search

  • Start Here
  • Ultimate Guides
  • WordPress Hosting
  • WordPress Themes
  • WordPress Plugins
CloudRank - SEO, Managed Hosting, Cloud Hosting & Guides
  • Cloud
    • Public Cloud
    • AWS
    • Google Cloud Platform
    • Microsoft Azure
    • PaaS & SaaS
    • CRM
  • CRM
    • Customer Relationship Management
  • Managed Hosting
    • Managed Services & Hosting
    • Hybrid Cloud Connectivity
    • Managed Kubernetes
    • Azure Managed Kubernetes
  • eCommerce
    • WooCommerce
    • WooCommerce Guides
    • WooCommerce Managed Hosting
    • WooCommerce Plugins
    • WooCommerce Cloud Hosting
    • Shopify
    • Shopify Dropshipping
    • Shopify SEO
    • Shopify Themes
    • Shopify Tools
  • WordPress
    • WordPress Guides
    • WordPress Cloud Hosting
    • Managed WordPress Hosting
    • WordPress VPS Hosting
    • WordPress Hosting
  • SEO & Marketing
    • SEO Guides
    • SEO Tools
    • Backlink Tools
CloudRankLogo

Main Menu

  • Cloud
    • Public Cloud
    • AWS
    • Google Cloud Platform
    • Microsoft Azure
    • PaaS & SaaS
    • CRM
  • CRM
    • Customer Relationship Management
  • Managed Hosting
    • Managed Services & Hosting
    • Hybrid Cloud Connectivity
    • Managed Kubernetes
    • Azure Managed Kubernetes
  • eCommerce
    • WooCommerce
    • WooCommerce Guides
    • WooCommerce Managed Hosting
    • WooCommerce Plugins
    • WooCommerce Cloud Hosting
    • Shopify
    • Shopify Dropshipping
    • Shopify SEO
    • Shopify Themes
    • Shopify Tools
  • WordPress
    • WordPress Guides
    • WordPress Cloud Hosting
    • Managed WordPress Hosting
    • WordPress VPS Hosting
    • WordPress Hosting
  • SEO & Marketing
    • SEO Guides
    • SEO Tools
    • Backlink Tools

More from us

Type and hit Enter to search

  • Start Here
  • Ultimate Guides
  • WordPress Hosting
  • WordPress Themes
  • WordPress Plugins
Aspect RatioAspect Ratio BoxesCLSCore Web VitalsCSSCumulative Layout ShiftImage DimensionsImage OptimizationImage PlaceholdersimagesLayout StabilityLazy LoadingPlaceholdersPreloading ImagesResponsive ImagesWeb PerformanceWeb Vitals

How to Reduce Cumulative Layout Shift from Images

Lula
07/05/2025
18 Mins Read
Cumulative layout shift

Table of Contents

  1. Understanding Cumulative Layout Shift
    1. Why CLS Matters
  2. Why Images Cause Layout Shifts
    1. 1. Missing Dimensions
    2. 2. Aspect Ratio Mismatches
    3. 3. Lazy Loading Implementation
    4. 4. Responsive Image Complexity
    5. 5. Image Processing Delay
  3. Strategy 1: Always Specify Image Dimensions
    1. HTML Dimension Attributes
    2. CSS Size Management
    3. Handling Dynamic Content
    4. Impact on CLS
  4. Strategy 2: Implement Aspect Ratio Boxes
    1. The Basic Technique
    2. Common Aspect Ratio Values
    3. Responsive Aspect Ratios
    4. Object-Fit Properties
  5. Strategy 3: Modern CSS Solutions
    1. The aspect-ratio Property
    2. Browser Support and Fallbacks
    3. CSS Container Queries
  6. Strategy 4: Optimize Responsive Images
    1. Consistent Aspect Ratios
    2. Combining with Dimension Attributes
    3. Art Direction with Aspect Ratio Boxes
  7. Strategy 5: Use Image Placeholders
    1. Types of Placeholders
      1. 1. Solid Color Placeholder
      2. 2. LQIP (Low-Quality Image Placeholder)
      3. 3. SQIP (SVG-Based Placeholder)
      4. 4. Dominant Color Extraction
    2. Implementing Progressive Loading
    3. Automatic Placeholder Generation
  8. Strategy 6: Preload Critical Images
    1. Basic Preloading
    2. Prioritized Preloading
    3. Combining with fetchpriority
    4. Strategic Resource Hints
  9. Strategy 7: Consider Content-Visibility
    1. Basic Implementation
    2. Contain-Intrinsic-Size
    3. Selective Application
  10. Common CLS Problems and Solutions
    1. Problem: Banner Ads Causing Shifts
    2. Problem: User-Generated Content with Unpredictable Images
    3. Problem: Embedded Media Players
    4. Problem: Dynamic Content Loading
  11. Measuring and Monitoring CLS
    1. Development Tools
      1. 1. Lighthouse
      2. 2. Performance Panel
      3. 3. Web Vitals Extension
    2. Production Monitoring
      1. 1. Core Web Vitals Report
      2. 2. Real User Monitoring (RUM)
      3. 3. Synthetic Testing
    3. Key Metrics to Track
  12. Implementation with FastPixel
    1. Automatic Dimension Handling
    2. Placeholder Generation
    3. Configuration Options
    4. Advanced Art Direction Support
    5. Implementation Results
  13. Conclusion
  14. Frequently Asked Questions
    1. How does CLS affect SEO rankings?
    2. If I specify width and height attributes, won’t that break my responsive design?
    3. What causes the most significant layout shifts on e-commerce sites?
    4. How do I handle user-uploaded images with unknown dimensions?
    5. Does lazy loading contribute to CLS?
    6. How do I balance CLS prevention with performance for large hero images?
    7. How do dynamically sized images fit into a CLS strategy?
    8. Can CSS-only solutions completely eliminate image-related CLS?
The Ultimate Managed Hosting PlatformThe Ultimate Managed Hosting Platform

Images are one of the primary causes of Cumulative Layout Shift (CLS), a critical Core Web Vital that directly impacts both user experience and SEO rankings. When images load without proper dimensions or optimizations, they can cause frustrating layout shifts that disrupt user interactions and create a poor impression of your website. This comprehensive guide explores practical techniques to eliminate image-related layout shifts and improve your CLS scores.

Table of Contents:

  • Understanding Cumulative Layout Shift
  • Why Images Cause Layout Shifts
  • Strategy 1: Always Specify Image Dimensions
  • Strategy 2: Implement Aspect Ratio Boxes
  • Strategy 3: Modern CSS Solutions
  • Strategy 4: Optimize Responsive Images
  • Strategy 5: Use Image Placeholders
  • Strategy 6: Preload Critical Images
  • Strategy 7: Consider Content-Visibility
  • Common CLS Problems and Solutions
  • Measuring and Monitoring CLS
  • Implementation with FastPixel
  • Conclusion
  • Frequently Asked Questions

Understanding Cumulative Layout Shift

Cumulative Layout Shift (CLS) is a user-centric performance metric that quantifies how much a page’s content unexpectedly moves during loading. It’s calculated by multiplying two factors:

  1. Impact Fraction: The area affected by the shift as a proportion of the viewport
  2. Distance Fraction: How far the elements move relative to the viewport height

The resulting score reflects the severity of layout instability, with lower scores indicating more stable pages:

  • Good: 0.1 or less
  • Needs Improvement: 0.1 to 0.25
  • Poor: Above 0.25

As a Core Web Vital, CLS directly affects Google’s evaluation of page experience and can impact search rankings. More importantly, high CLS scores correlate with frustrating user experiences—like accidentally clicking the wrong button because the page shifted just as they were about to interact with it.

Why CLS Matters

Beyond SEO implications, CLS has tangible business impacts:

  • Conversion rates: Sites with good CLS scores (0.1 or lower) see 25% higher conversion rates on average compared to sites with poor scores
  • User retention: Layout shifts increase bounce rates by up to 30% on mobile devices
  • Brand perception: 38% of users report negative brand associations after experiencing layout shifts
  • Accessibility: Unexpected layout shifts can create serious usability barriers for users with motion sensitivity or cognitive impairments

According to Google’s research, images contribute to approximately 40% of all layout shift issues on the web, making image optimization one of the most effective focus areas for improving CLS.

Why Images Cause Layout Shifts

Images contribute to layout shifts in several common ways:

1. Missing Dimensions

When an image loads without specified width and height attributes, browsers cannot reserve the appropriate space during the initial layout. As images load, they suddenly occupy space, pushing other content down or sideways.

<!– Problem: No dimensions –>

<img src=”example.jpg” alt=”Example image”>

<!– Solution: Defined dimensions –>

<img src=”example.jpg” alt=”Example image” width=”800″ height=”600″>

2. Aspect Ratio Mismatches

Even with dimensions specified, responsive designs that use percentage-based widths can cause shifts if the image’s natural aspect ratio doesn’t match the reserved space.

/* Problem: Width only, height determined by content */

Image showing an advert of Kinsta Hosting free trial

img {

  width: 100%;

  height: auto;

}

3. Lazy Loading Implementation

Improperly implemented lazy loading can cause significant layout shifts as images enter the viewport and suddenly load.

<!– Problem: Lazy loading without dimensions –>

<img src=”example.jpg” loading=”lazy” alt=”Will cause layout shift”>

4. Responsive Image Complexity

Using responsive image techniques like srcset without consistent aspect ratios across different image versions can cause shifts when browser conditions change.

<!– Problem: Different aspect ratios in srcset –>

<img srcset=”small.jpg 400w, medium.jpg 800w, large.jpg 1200w”

     sizes=”(max-width: 600px) 100vw, 50vw”

     src=”fallback.jpg” alt=”Example”>

5. Image Processing Delay

Some image optimization techniques that run in the browser can cause delays between initial layout and final image display, resulting in shifts.

Now let’s explore the strategies to address these issues and create shift-free experiences.

Strategy 1: Always Specify Image Dimensions

The most fundamental approach to preventing layout shifts is to always specify width and height attributes for images. This practice dates back to the early web but became less common during the responsive design era—a mistake that’s now being corrected.

HTML Dimension Attributes

Modern browsers use width and height attributes to calculate aspect ratio and reserve space before the image loads:

<img src=”example.jpg” width=”800″ height=”600″ alt=”Example image”>

These attributes inform the browser about the image’s natural dimensions, allowing it to calculate and reserve the correct amount of space during the initial layout phase—even if the actual displayed size will be different due to CSS.

CSS Size Management

When dimensions are specified in HTML, you can still use CSS to control the displayed size:

img {

  width: 100%; /* Make image responsive */

  height: auto; /* Maintain aspect ratio */

}

With this approach, browsers will:

  1. Read the natural dimensions from HTML attributes
  2. Calculate the aspect ratio (4:3 in our example)
  3. Reserve the correct space based on the responsive width and calculated height
  4. Display the image correctly when it loads without shifting layout

Handling Dynamic Content

For content management systems or user-generated content where dimensions might not be known in advance:

<?php

// Server-side dimension extraction example

$imageData = getimagesize($imagePath);

$width = $imageData[0];

$height = $imageData[1];

echo “<img src='{$imagePath}’ width='{$width}’ height='{$height}’ alt=’Dynamic image’>”;

?>

Modern frameworks can also handle this automatically:

// React example with dimension handling

import { useState, useEffect } from ‘react’;

function Image({ src, alt }) {

  const [dimensions, setDimensions] = useState({ width: 0, height: 0 });

  useEffect(() => {

    const img = new Image();

    img.src = src;

    img.onload = () => {

      setDimensions({ width: img.width, height: img.height });

    };

  }, [src]);

  return (

    dimensions.width ? 

    <img src={src} width={dimensions.width} height={dimensions.height} alt={alt} /> :

    <div className=”placeholder” style={{ aspectRatio: ’16/9′ }}></div>

  );

}

Impact on CLS

Implementing proper width and height attributes typically reduces image-related CLS by 50-75%, making this the single most effective technique for improving layout stability.

Strategy 2: Implement Aspect Ratio Boxes

For situations where exact dimensions aren’t known in advance or where maintaining a consistent aspect ratio across different image sources is important, aspect ratio boxes provide an elegant solution.

The Basic Technique

The aspect ratio box technique uses a container with a padding-based aspect ratio:

<div class=”aspect-ratio-box”>

  <img src=”example.jpg” alt=”Example image”>

</div>

.aspect-ratio-box {

  position: relative;

  width: 100%;

  padding-top: 75%; /* 4:3 Aspect Ratio (height/width) */

}

.aspect-ratio-box img {

  position: absolute;

  top: 0;

  left: 0;

  width: 100%;

  height: 100%;

  object-fit: cover; /* or contain, depending on requirements */

}

This approach:

  • Creates a container with the desired aspect ratio using the padding-top percentage trick
  • Positions the image absolutely within that container
  • Ensures the container maintains its size regardless of when the image loads

Common Aspect Ratio Values

The Ultimate Managed Hosting PlatformThe Ultimate Managed Hosting Platform
Aspect RatioPadding-Top ValueCommon Use Case
16:956.25%Widescreen video, landscape photos
4:375%Traditional photos, older screens
1:1100%Square images, thumbnails
2:3150%Portrait photos, mobile screenshots
21:942.86%Ultrawide banners

Responsive Aspect Ratios

For art direction needs, aspect ratios can change at different breakpoints:

.hero-container {

  position: relative;

  width: 100%;

  padding-top: 100%; /* 1:1 on mobile */

}

@media (min-width: 768px) {

  .hero-container {

    padding-top: 56.25%; /* 16:9 on larger screens */

  }

}

.hero-container img {

  position: absolute;

  top: 0;

  left: 0;

  width: 100%;

  height: 100%;

  object-fit: cover;

}

Object-Fit Properties

The object-fit property controls how the image fills the container:

/* Fill the container completely, may crop image */

img.cover {

  object-fit: cover;

}

/* Show the entire image, may leave empty space */

img.contain {

  object-fit: contain;

}

/* Fill the container but maintain aspect ratio */

img.fill {

  object-fit: fill;

}

Combining aspect ratio boxes with appropriate object-fit settings ensures consistent layout without shifts, even when image sources or dimensions vary.

Strategy 3: Modern CSS Solutions

CSS has evolved to provide more elegant solutions for handling aspect ratios and preventing layout shifts.

The aspect-ratio Property

Modern browsers now support the aspect-ratio CSS property, which simplifies maintaining consistent proportions:

.image-container {

  width: 100%;

  aspect-ratio: 16 / 9;

}

.image-container img {

  width: 100%;

  height: 100%;

  object-fit: cover;

}

This approach:

  • Eliminates the need for padding-based hacks
  • Provides more intuitive markup
  • Is easier to maintain and modify

Browser Support and Fallbacks

As of 2025, the aspect-ratio property has excellent browser support (>95% of global users). For older browsers, you can implement a simple fallback:

.image-container {

  width: 100%;

  /* Fallback for older browsers */

  position: relative;

  padding-top: 56.25%;

  /* Modern approach */

  aspect-ratio: 16 / 9;

}

@supports (aspect-ratio: 1 / 1) {

  .image-container {

    padding-top: 0; /* Remove padding when aspect-ratio is supported */

  }

}

.image-container img {

  width: 100%;

  height: 100%;

  object-fit: cover;

  position: absolute;

  top: 0;

  left: 0;

}

@supports (aspect-ratio: 1 / 1) {

  .image-container img {

    position: static; /* Remove absolute positioning when aspect-ratio is supported */

  }

}

CSS Container Queries

For more advanced responsive scenarios, CSS container queries allow aspect ratios to adapt based on container size rather than viewport size:

.card-container {

  container-type: inline-size;

}

.card-image {

  width: 100%;

  aspect-ratio: 1 / 1;

}

@container (min-width: 400px) {

  .card-image {

    aspect-ratio: 16 / 9;

  }

}

This creates more flexible components that maintain proper aspect ratios even when reused in different layout contexts.

Strategy 4: Optimize Responsive Images

Responsive image techniques like srcset and picture elements can contribute to layout shifts if not properly implemented. Here’s how to use them while maintaining layout stability.

Consistent Aspect Ratios

The most important rule for responsive images is to maintain the same aspect ratio across all source variations:

<!– Good: All images share 16:9 aspect ratio –>

<img srcset=”small-16×9.jpg 400w,

             medium-16×9.jpg 800w,

             large-16×9.jpg 1200w”

     sizes=”(max-width: 600px) 100vw, 50vw”

     src=”fallback-16×9.jpg”

     width=”1200″ height=”675″

     alt=”Responsive image with consistent ratio”>

Combining with Dimension Attributes

Always include width and height attributes that match the largest/fallback image’s natural dimensions:

<picture>

  <source media=”(max-width: 600px)” srcset=”mobile-3×4.jpg”>

  <source media=”(max-width: 1200px)” srcset=”tablet-3×4.jpg”>

  <img src=”desktop-3×4.jpg” width=”1200″ height=”1600″ alt=”Art directed image”>

</picture>

Art Direction with Aspect Ratio Boxes

When art direction requires different aspect ratios at different screen sizes, combine the picture element with aspect ratio containers:

<div class=”hero-container”>

  <picture>

    <source media=”(max-width: 768px)” srcset=”mobile-square.jpg”>

    <source media=”(max-width: 1200px)” srcset=”tablet-4×3.jpg”>

    <img src=”desktop-16×9.jpg” alt=”Art directed hero image”>

  </picture>

</div>

.hero-container {

  position: relative;

  width: 100%;

  aspect-ratio: 1 / 1; /* Default square for mobile */

}

@media (min-width: 768px) {

  .hero-container {

    aspect-ratio: 4 / 3; /* 4:3 for tablets */

  }

}

@media (min-width: 1200px) {

  .hero-container {

    aspect-ratio: 16 / 9; /* 16:9 for desktop */

  }

}

.hero-container img {

  width: 100%;

  height: 100%;

  object-fit: cover;

}

This combination ensures the container always maintains the appropriate aspect ratio for the current breakpoint, preventing shifts even when image proportions change across devices.

Strategy 5: Use Image Placeholders

Placeholders maintain visual stability while images load, improving perceived performance and preventing layout shifts.

Types of Placeholders

Several placeholder strategies can enhance the loading experience:

1. Solid Color Placeholder

The simplest approach uses a solid background color:

<div class=”image-wrapper” style=”background-color: #f0f0f0; aspect-ratio: 16 / 9;”>

  <img src=”example.jpg” width=”800″ height=”450″ alt=”Example image” loading=”lazy”>

</div>

2. LQIP (Low-Quality Image Placeholder)

A tiny, heavily compressed version of the image (typically 10-20KB) loads instantly:

<div class=”image-wrapper” style=”aspect-ratio: 16 / 9;”>

  <img 

    src=”tiny-placeholder.jpg” 

    data-src=”full-image.jpg”

    width=”800″ 

    height=”450″ 

    alt=”Example with LQIP”

    onload=”if(this.dataset.src) { this.src = this.dataset.src; delete this.dataset.src; }”

  >

</div>

3. SQIP (SVG-Based Placeholder)

An SVG representation of the image outline provides a preview:

<div class=”image-wrapper” style=”aspect-ratio: 16 / 9;”>

  <svg class=”placeholder” viewBox=”0 0 800 450″>

    <!– Simple SVG representation of image –>

    <path d=”M0,0H800V450H0Z” fill=”#f0f0f0″/>

    <path d=”M120,180Q200,100,280,180T440,180″ stroke=”#333″ fill=”none”/>

    <!– More path data representing image outline –>

  </svg>

  <img 

    src=”example.jpg” 

    width=”800″ 

    height=”450″ 

    alt=”Example with SVG placeholder”

    loading=”lazy”

    style=”position: absolute; top: 0; left: 0; opacity: 0; transition: opacity 0.3s;”

    onload=”this.style.opacity = 1;”

  >

</div>

4. Dominant Color Extraction

Use the image’s dominant color as a placeholder:

<div class=”image-wrapper” style=”background-color: #3a5795; aspect-ratio: 16 / 9;”>

  <img src=”example.jpg” width=”800″ height=”450″ alt=”Example with dominant color” loading=”lazy”>

</div>

Implementing Progressive Loading

For a smooth transition from placeholder to full image:

.image-wrapper {

  position: relative;

  width: 100%;

  aspect-ratio: 16 / 9;

  background-color: #f0f0f0; /* Placeholder color */

  overflow: hidden;

}

.image-wrapper img {

  width: 100%;

  height: 100%;

  object-fit: cover;

  transition: opacity 0.3s ease;

  opacity: 0;

}

.image-wrapper img.loaded {

  opacity: 1;

}

// Progressive loading with JavaScript

document.addEventListener(‘DOMContentLoaded’, function() {

  const lazyImages = document.querySelectorAll(‘.image-wrapper img’);

  lazyImages.forEach(img => {

    if (img.complete) {

      img.classList.add(‘loaded’);

    } else {

      img.addEventListener(‘load’, function() {

        this.classList.add(‘loaded’);

      });

    }

  });

});

Automatic Placeholder Generation

Tools and services can generate placeholders automatically as part of your workflow:

  • Build-time tools: Plugins for Webpack, Gulp, or other build systems
  • Server-side processing: On-demand generation using image processing libraries
  • CDN services: FastPixel and similar services can generate and serve placeholders automatically

Strategy 6: Preload Critical Images

For the most important images—particularly those that contribute to Largest Contentful Paint (LCP)—preloading ensures they begin downloading early in the page lifecycle.

Basic Preloading

Use the preload link to fetch critical images as early as possible:

<head>

  <!– Preload hero image –>

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

</head>

<body>

  <!– Later in the content –>

  <div class=”hero-container”>

    <img srcset=”hero-400.jpg 400w, hero-800.jpg 800w, hero-1600.jpg 1600w”

         sizes=”100vw”

         src=”hero.jpg” 

         width=”1600″ 

         height=”900″ 

         alt=”Hero image”>

  </div>

</body>

This tells the browser to download the image earlier in the page loading process, increasing the likelihood it’s available when the browser is ready to render it.

Prioritized Preloading

To avoid resource contention, only preload the most critical resources:

<head>

  <!– Critical CSS –>

  <link rel=”preload” href=”critical.css” as=”style”>

  <!– Hero image (visible in viewport) –>

  <link rel=”preload” as=”image” href=”hero.jpg”>

  <!– Don’t preload below-the-fold images –>

  <!– <link rel=”preload” as=”image” href=”below-fold.jpg”> –>

</head>

Combining with fetchpriority

The fetchpriority attribute provides additional signals to the browser about resource importance:

<img src=”hero.jpg” 

     fetchpriority=”high” 

     width=”1200″ 

     height=”600″ 

     alt=”Critical hero image”>

<img src=”below-fold.jpg” 

     fetchpriority=”low” 

     loading=”lazy” 

     width=”800″ 

     height=”600″ 

     alt=”Non-critical image”>

Strategic Resource Hints

For more advanced scenarios, combine preloading with other resource hints:

<!– Preconnect to image origin –>

<link rel=”preconnect” href=”https://images.example.com”>

<!– DNS-prefetch as fallback for older browsers –>

<link rel=”dns-prefetch” href=”https://images.example.com”>

<!– Preload critical image –>

<link rel=”preload” as=”image” href=”https://images.example.com/hero.jpg”>

Preloading critical images typically improves LCP scores by 15-30% while helping to prevent layout shifts caused by late-loading priority content.

Strategy 7: Consider Content-Visibility

The newer CSS content-visibility property can help prevent layout shifts for off-screen images by deferring their rendering until needed.

Basic Implementation

.below-fold-section {

  content-visibility: auto;

  contain-intrinsic-size: 1px 1000px; /* Estimated section height */

}

<section class=”below-fold-section”>

  <img src=”example.jpg” width=”800″ height=”600″ alt=”Example image”>

  <!– Other content –>

</section>

This tells the browser it can skip rendering this section (including image loading) until it approaches the viewport, while still reserving appropriate space to prevent layout shifts.

Contain-Intrinsic-Size

The contain-intrinsic-size property is crucial for preventing layout shifts when using content-visibility:

/* For sections with predictable height */

.product-card {

  content-visibility: auto;

  contain-intrinsic-size: 1px 500px; /* Average card height */

}

/* For variable content, provide dimensions range */

.article-content {

  content-visibility: auto;

  contain-intrinsic-size: 1px 2000px; /* Estimated article length */

}

Selective Application

Apply content-visibility strategically rather than globally:

/* Good candidates for content-visibility */

.comments-section,

.related-products,

.image-gallery {

  content-visibility: auto;

  contain-intrinsic-size: 1px 800px;

}

/* Avoid on potentially shifting content */

.dynamic-height-content,

.third-party-embed {

  /* Don’t use content-visibility here */

}

While powerful, content-visibility should be used judiciously since it requires accurate size estimates to prevent layout shifts when content becomes visible.

Common CLS Problems and Solutions

Beyond the general strategies, here are solutions for specific image-related CLS challenges:

Problem: Banner Ads Causing Shifts

Third-party advertisements frequently cause layout instability.

Solution: Reserved Space with Fallbacks

<div class=”ad-container” style=”min-height: 250px; aspect-ratio: 4 / 1;”>

  <!– Ad content loads here –>

  <script async src=”https://ads.example.com/script.js”></script>

</div>

.ad-container {

  display: flex;

  justify-content: center;

  align-items: center;

  background-color: #f0f0f0;

  margin-bottom: 20px;

  overflow: hidden;

}

.ad-container::before {

  content: “Advertisement”;

  font-size: 12px;

  color: #888;

  position: absolute;

  top: 5px;

  right: 5px;

}

Problem: User-Generated Content with Unpredictable Images

Content management systems and forums often deal with user-uploaded images of varying dimensions.

Solution: Server-Side Dimension Extraction and Normalization

<?php

// Extract dimensions and normalize aspect ratio

function processUserImage($imagePath) {

  $dimensions = getimagesize($imagePath);

  $width = $dimensions[0];

  $height = $dimensions[1];

  // Create standardized derivatives

  $standardFormats = [

    ‘square’ => createCrop($imagePath, 1, 1),

    ‘widescreen’ => createCrop($imagePath, 16, 9),

    ‘portrait’ => createCrop($imagePath, 3, 4)

  ];

  return [

    ‘original’ => [

      ‘path’ => $imagePath,

      ‘width’ => $width,

      ‘height’ => $height

    ],

    ‘standardized’ => $standardFormats

  ];

}

?>

Problem: Embedded Media Players

Video thumbnails loading before the player initializes often cause shifts.

Solution: Aspect-Ratio Container with Poster Image

<div class=”video-container” style=”aspect-ratio: 16 / 9;”>

  <img src=”video-thumbnail.jpg” 

       width=”1280″ 

       height=”720″ 

       alt=”Video thumbnail” 

       class=”video-poster”

       style=”position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover;”>

  <iframe class=”video-player”

          width=”1280″

          height=”720″

          style=”position: absolute; top: 0; left: 0; width: 100%; height: 100%;”

          src=”about:blank”

          data-src=”https://www.youtube.com/embed/VIDEO_ID?autoplay=1″

          frameborder=”0″

          allow=”accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture”

          allowfullscreen

          loading=”lazy”></iframe>

  <button class=”play-button” 

          onclick=”this.parentNode.querySelector(‘.video-player’).src = this.parentNode.querySelector(‘.video-player’).dataset.src; this.parentNode.querySelector(‘.video-poster’).style.display = ‘none’; this.style.display = ‘none’;”>

    Play Video

  </button>

</div>

Problem: Dynamic Content Loading

Infinite scroll or “Load More” features often introduce layout shifts.

Solution: Content Placeholders with Smooth Transitions

function loadMoreContent() {

  // Create placeholder containers with appropriate dimensions

  const contentContainer = document.querySelector(‘.content-feed’);

  // Add placeholders with estimated dimensions

  for (let i = 0; i < 5; i++) {

    const placeholder = document.createElement(‘div’);

    placeholder.className = ‘content-placeholder’;

    placeholder.style.aspectRatio = ‘3 / 2’;

    placeholder.style.backgroundColor = ‘#f0f0f0’;

    placeholder.style.marginBottom = ’20px’;

    contentContainer.appendChild(placeholder);

  }

  // Fetch new content

  fetch(‘/api/content?page=2’)

    .then(response => response.json())

    .then(items => {

      // Remove placeholders

      document.querySelectorAll(‘.content-placeholder’).forEach(p => p.remove());

      // Add actual content

      items.forEach(item => {

        const element = createContentElement(item);

        contentContainer.appendChild(element);

      });

    });

}

// Helper to create content with proper dimensions

function createContentElement(item) {

  const element = document.createElement(‘article’);

  element.className = ‘content-item’;

  const imageContainer = document.createElement(‘div’);

  imageContainer.className = ‘content-image’;

  imageContainer.style.aspectRatio = ’16 / 9′;

  const image = document.createElement(‘img’);

  image.src = item.imageUrl;

  image.width = item.imageWidth;

  image.height = item.imageHeight;

  image.alt = item.imageAlt;

  image.style.width = ‘100%’;

  image.style.height = ‘100%’;

  image.style.objectFit = ‘cover’;

  imageContainer.appendChild(image);

  element.appendChild(imageContainer);

  // Add text content

  const title = document.createElement(‘h2’);

  title.textContent = item.title;

  element.appendChild(title);

  return element;

}

Measuring and Monitoring CLS

To effectively optimize layout stability, you need to measure CLS throughout your development process and in production.

Development Tools

During development, these tools help identify and fix CLS issues:

1. Lighthouse

Chrome’s built-in auditing tool provides CLS scores and highlights elements contributing to shifts:

  1. Open Chrome DevTools (F12)
  2. Navigate to the Lighthouse tab
  3. Select “Performance” or “Core Web Vitals”
  4. Run the audit and review the CLS section

2. Performance Panel

Chrome DevTools Performance panel provides detailed layout shift visualization:

  1. Open Chrome DevTools (F12)
  2. Navigate to the Performance tab
  3. Check “Layout Shifts” in the options
  4. Record a page load
  5. Examine red rectangles indicating shifts

3. Web Vitals Extension

Google’s Web Vitals extension provides real-time CLS monitoring during development:

  1. Install the Web Vitals Extension
  2. Load your page
  3. View the real-time CLS score

Production Monitoring

For production environments, implement these monitoring systems:

1. Core Web Vitals Report

Google Search Console provides aggregated CLS data based on real user experiences:

  1. Access Google Search Console
  2. Navigate to “Core Web Vitals” report
  3. Review CLS performance across your site

2. Real User Monitoring (RUM)

Implement RUM to collect actual user experience data:

// Using web-vitals library

import {getCLS} from ‘web-vitals’;

getCLS(({name, value, rating}) => {

  console.log(`CLS: ${value} (${rating})`);

  // Send to analytics

  sendToAnalytics({

    metric: name,

    value: value,

    rating: rating

  });

});

// Send data to your analytics platform

function sendToAnalytics(data) {

  // Example using Google Analytics 4

  gtag(‘event’, ‘web_vitals’, {

    event_category: ‘Web Vitals’,

    event_label: data.rating,

    value: Math.round(data.value * 1000),

    metric_id: data.metric,

    metric_value: data.value,

    metric_rating: data.rating,

  });

}

3. Synthetic Testing

Regularly test your pages with automated tools to catch regressions:

// Example WebPageTest API script

const WebPageTest = require(‘webpagetest’);

const wpt = new WebPageTest(‘www.webpagetest.org’, ‘YOUR_API_KEY’);

wpt.runTest(‘https://example.com’, {

  connectivity: ‘4G’,

  location: ‘ec2-us-east-1:Chrome’,

  firstViewOnly: true,

  runs: 3,

  video: true

}, (err, result) => {

  console.log(‘CLS Score:’, result.data.average.firstView.chromeUserTiming.CumulativeLayoutShift);

});

Key Metrics to Track

When monitoring CLS, track these supplementary metrics:

  1. Element-specific shifts: Identify which elements contribute most to CLS
  2. LCP correlation: Check if LCP images are causing shifts
  3. Device breakdown: Compare CLS across different devices and screen sizes
  4. Page template analysis: Compare CLS across different page templates
  5. Time to Stability: How long until the page stops shifting

Implementation with FastPixel

FastPixel provides automated solutions for preventing image-related layout shifts while optimizing overall image performance.

Automatic Dimension Handling

FastPixel automatically extracts and preserves image dimensions:

<!– Before FastPixel: Missing dimensions –>

<img src=”example.jpg” alt=”Example image”>

<!– After FastPixel: Automatic dimension calculation –>

<img src=”https://fastpixel.io/cdn/example.jpg” width=”800″ height=”600″ alt=”Example image”>

Placeholder Generation

FastPixel generates appropriate placeholders based on image content:

<!– Simple integration –>

<script async src=”https://cdn.fastpixel.io/v2/main.js”></script>

<!– Original image –>

<img src=”product.jpg” alt=”Product image”>

<!– After FastPixel processing: –>

<div class=”fp-container” style=”aspect-ratio: 3/4; background-color: #f3f3f3;”>

  <!– Tiny placeholder –>

  <img src=”data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAA…” class=”fp-placeholder”>

  <!– Main image (lazy loaded) –>

  <img src=”product.jpg” width=”1200″ height=”1600″ loading=”lazy” class=”fp-main” alt=”Product image”>

</div>

Configuration Options

FastPixel offers customizable CLS prevention settings:

<script>

window.FastPixelConfig = {

  layout: {

    preserveDimensions: true,

    usePlaceholders: true,

    placeholderType: ‘dominant-color’, // Options: blur, skeleton, color, lqip

    transitionDuration: 300, // Fade-in duration in ms

    preloadLCP: true // Automatically preload largest image

  }

};

</script>

Advanced Art Direction Support

FastPixel handles complex responsive scenarios with consistent layout stability:

<img src=”image.jpg” 

     data-fp-breakpoints=”

       {‘max-width’: ‘600px’, ‘src’: ‘mobile.jpg’, ‘aspect-ratio’: ‘1/1’},

       {‘max-width’: ‘1024px’, ‘src’: ‘tablet.jpg’, ‘aspect-ratio’: ‘4/3’},

       {‘src’: ‘desktop.jpg’, ‘aspect-ratio’: ’16/9′}

     “

     alt=”Art-directed image”>

FastPixel will automatically:

  1. Create containers with appropriate aspect ratios for each breakpoint
  2. Generate placeholders to prevent layout shifts
  3. Load the correct image version and size for each device
  4. Transition smoothly between placeholder and final image

Implementation Results

Websites implementing FastPixel typically see:

  • 85-100% reduction in image-related CLS
  • 30-50% improvement in LCP scores
  • 60-75% reduction in image payload
  • 15-25% increase in conversion rates for e-commerce sites

Conclusion

Cumulative Layout Shift represents one of the most significant yet addressable performance challenges on the web today. By implementing the strategies outlined in this guide, you can create visually stable experiences that improve both user satisfaction and search rankings.

The most effective approach combines multiple techniques:

  1. Always specify dimensions as the foundation of layout stability
  2. Implement aspect ratio boxes to handle varying content
  3. Use modern CSS solutions like aspect-ratio where supported
  4. Optimize responsive images with consistent aspect ratios
  5. Implement appropriate placeholders for visual continuity
  6. Preload critical images that may impact LCP
  7. Consider content-visibility for off-screen content
  8. Measure and monitor CLS throughout development and in production

For teams seeking the simplest implementation path, services like FastPixel provide automated solutions that address multiple aspects of image optimization and layout stability simultaneously.

By prioritizing layout stability in your image strategy, you create experiences that feel more polished and professional while directly improving key performance metrics that impact both user satisfaction and business outcomes.

Frequently Asked Questions

How does CLS affect SEO rankings?

CLS is one of Google’s Core Web Vitals, which are direct ranking factors in Google’s search algorithm. Sites with good CLS scores (0.1 or lower) have a competitive advantage in search rankings compared to sites with poor scores, particularly when other ranking signals are similar. Google has explicitly stated that page experience signals, including CLS, can be the determining factor between pages with similar content.

If I specify width and height attributes, won’t that break my responsive design?

No. Modern browsers use width and height attributes to calculate aspect ratio rather than to determine the displayed size. You can still use CSS to make the image responsive (e.g., width: 100%; height: auto;) while benefiting from the browser’s ability to reserve space based on the aspect ratio derived from dimensions.

What causes the most significant layout shifts on e-commerce sites?

On e-commerce sites, the most common causes of layout shifts are:

  1. Product images loading without dimensions
  2. Dynamic content like personalized recommendations
  3. Third-party elements like reviews and chat widgets
  4. Size variation between product listing images
  5. Cart updates and notifications

Addressing image dimensions and implementing consistent aspect ratios for product images typically reduces e-commerce CLS by 40-60%.

How do I handle user-uploaded images with unknown dimensions?

For user-generated content, implement server-side dimension extraction. When images are uploaded, read their dimensions and store this information in your database. Then, when rendering pages, include these dimensions as width and height attributes. Additionally, consider normalizing user uploads to standard aspect ratios to maintain design consistency.

Does lazy loading contribute to CLS?

Improperly implemented lazy loading can significantly increase CLS. However, when implemented correctly—with proper dimension attributes and placeholder strategies—lazy loading actually helps reduce perceived performance issues. The key is ensuring space is reserved before the image loads, regardless of when it loads.

How do I balance CLS prevention with performance for large hero images?

For large hero images, use these balanced approaches:

  1. Implement LQIP (Low-Quality Image Placeholder) to show a tiny version immediately
  2. Use the fetchpriority=”high” attribute to prioritize loading
  3. Consider a progressive enhancement approach where a placeholder loads immediately and the high-quality image fades in
  4. Ensure the aspect ratio is consistent across all device breakpoints

This strategy maintains layout stability while optimizing both perceived and actual performance.

How do dynamically sized images fit into a CLS strategy?

For cases where image dimensions aren’t fixed (like user-generated content):

  1. Set a standard aspect ratio for the container (e.g., 16:9 or 4:3)
  2. Use object-fit: contain to display the entire image within that container
  3. Add a subtle background color to make the non-image area of the container visually cohesive
  4. Consider cropping techniques that focus on the image’s subject rather than preserving all content

Can CSS-only solutions completely eliminate image-related CLS?

CSS-only solutions like aspect ratio boxes can dramatically reduce CLS but may not eliminate it entirely if image dimensions are completely unknown. The most effective approach combines:

  1. Server-side dimension determination where possible
  2. Consistent aspect ratios through CSS
  3. Appropriate placeholder strategies
  4. Progressive enhancement for image loading
Image showing an advert of Kinsta Hosting free trial

This multi-layered approach addresses CLS at multiple points in the rendering process.

Tags:

Aspect Ratio BoxesCLSCore Web VitalsCumulative Layout ShiftImage DimensionsImage OptimizationImage PlaceholdersLazy LoadingResponsive Images

Share Article

Other Articles

WooCommerce speed optimization
Previous

WooCommerce Speed Optimization: The Ultimate Guide

Next

E-commerce Image Optimization: Conversion Rate Study in 2025

Next
07/05/2025

E-commerce Image Optimization: Conversion Rate Study in 2025

Previous
07/05/2025

WooCommerce Speed Optimization: The Ultimate Guide

WooCommerce speed optimization

Want 30 Days Free Trial Managed WordPress Free Migration Included Edge Caching Super Secure GCP 24/7 Support Enterprise-Level Firewall DDoS Protection Isolation Technology Proprietary API APM Tool Included Cloudflare Compatible Hosting?

try kinsta free for 30 days

Want DigitalOcean Droplets Vultr High-Frequency VPS Linode Dedicated VPS AWS EC2 Instances Google Cloud Compute One-Click Vertical Scaling Pay-As-You-Go Billing Automated Daily Backups Redis & Memcached Caching 24/7 Expert Support Free Managed Migrations Isolated Container Architecture Git & WP-CLI Integration Hosting?

Load WordPress Sites in as fast as 37ms!

Disclaimer

This website may include affiliate links to third-party products and services; if you click through and make a purchase, we may earn a commission at no additional cost to you. These commissions help fund the ongoing development and maintenance of the site.

Popular

Cumulative layout shift
How to Reduce Cumulative Layout Shift from Images
By Lula
WooCommerce speed optimization
WooCommerce Speed Optimization: The Ultimate Guide
By Lula

Menu

  • Cloud
    • Public Cloud
    • AWS
    • Google Cloud Platform
    • Microsoft Azure
    • PaaS & SaaS
    • CRM
  • CRM
    • Customer Relationship Management
  • Managed Hosting
    • Managed Services & Hosting
    • Hybrid Cloud Connectivity
    • Managed Kubernetes
    • Azure Managed Kubernetes
  • eCommerce
    • WooCommerce
    • WooCommerce Guides
    • WooCommerce Managed Hosting
    • WooCommerce Plugins
    • WooCommerce Cloud Hosting
    • Shopify
    • Shopify Dropshipping
    • Shopify SEO
    • Shopify Themes
    • Shopify Tools
  • WordPress
    • WordPress Guides
    • WordPress Cloud Hosting
    • Managed WordPress Hosting
    • WordPress VPS Hosting
    • WordPress Hosting
  • SEO & Marketing
    • SEO Guides
    • SEO Tools
    • Backlink Tools

Newsletter

Join our mailing list!

© 2025 All Rights Reserved.

  • Our Blog
  • About Us
  • Contact
  • Our Guides
  • Cloud
    • Public Cloud
    • AWS
    • Google Cloud Platform
    • Microsoft Azure
    • PaaS & SaaS
    • CRM
  • CRM
    • Customer Relationship Management
  • Managed Hosting
    • Managed Services & Hosting
    • Hybrid Cloud Connectivity
    • Managed Kubernetes
    • Azure Managed Kubernetes
  • eCommerce
    • WooCommerce
    • WooCommerce Guides
    • WooCommerce Managed Hosting
    • WooCommerce Plugins
    • WooCommerce Cloud Hosting
    • Shopify
    • Shopify Dropshipping
    • Shopify SEO
    • Shopify Themes
    • Shopify Tools
  • WordPress
    • WordPress Guides
    • WordPress Cloud Hosting
    • Managed WordPress Hosting
    • WordPress VPS Hosting
    • WordPress Hosting
  • SEO & Marketing
    • SEO Guides
    • SEO Tools
    • Backlink Tools