What Is Cumulative Layout Shift (CLS)? Complete Guide (2026)

Saar Twito8 min read
Saar Twito
Saar TwitoFounder & SEO Engineer

Hi, I'm Saar - a software engineer, SEO specialist, and lecturer who loves building tools and teaching tech.

View author profile →

What Is Cumulative Layout Shift?

Cumulative Layout Shift (CLS) is a Core Web Vital that measures the total amount of unexpected movementof visible page elements during a user's session. It's the metric behind every "the button moved right as I tried to click it" experience — and Google uses it as a direct ranking signal.

Key Facts (TL;DR)

  • Good CLS: ≤ 0.1 — Google's threshold for a passing Core Web Vital.
  • Needs Improvement: 0.1 – 0.25 — visitors notice the shifts and friction increases.
  • Poor: > 0.25 — Google flags the page as a poor experience; misclicks and frustration become routine.
  • Performance score weight: CLS accounts for approximately 25% of your overall web performance score — tied with LCP for the highest single-metric weight.
  • Core Web Vitals: CLS is one of Google's three Core Web Vitals alongside Largest Contentful Paint (LCP) and Interaction to Next Paint (INP). All three feed the Page Experience ranking signal.
  • Business impact: Yahoo! JAPAN News reduced CLS to under 0.1 and saw a 15% increase in page views, 13% longer session duration, and 1.72% lower bounce rate (Google Web Vitals case study, 2021).

Think of CLS the way you think of pulling out a chair just as someone sits down. Even one shift is enough to break trust — and on the web, the cost is misclicks on the wrong button, accidental purchases, and visitors who never come back.

Why Layout Shifts Cost You Visitors and Sales

CLS is one of the few metrics where the user pain is immediately visible. It directly affects:

  • Misclicks: A button that shifts the moment a visitor taps it sends them to the wrong destination — including unintended purchases, form submissions, or off-site navigation. On mobile, where touch targets are dense, this is especially destructive.
  • Reading flow: When the paragraph someone is reading jumps down because a late-loading image arrived, they lose their place. Many will not scroll back.
  • Perceived quality: Stable layouts feel professional. Jumpy ones feel broken — even if every other metric is fast.
  • Google rankings: CLS is part of the Page Experience signal. Pages that fail Core Web Vitals lose ranking ground in competitive queries where quality is otherwise equal.
  • AI search visibility: AI-driven search systems (Google AI Overviews, generative answer engines) tend to source from pages that already rank well — and a failing CLS pulls those rankings down.

How CLS Is Calculated

CLS is the sum of layout shift scores for every unexpected movement that occurs during a session window. Each individual shift score is calculated as:

Layout Shift Score = Impact Fraction × Distance Fraction

  • Impact Fraction: The portion of the viewport affected by the moving element. If a banner takes up 40% of the visible screen and it moves, the impact fraction is 0.4.
  • Distance Fraction:How far the element moves, expressed as a fraction of the viewport's longest dimension. An element that drops 25% of the viewport height has a distance fraction of 0.25.

In that example: 0.4 × 0.25 = 0.1— already at Google's "good" ceiling from a single shift.

Session Windows (the 2021 update)

Since the 2021 CLS update, Google measures the worst 5-second windowof consecutive shifts (with no more than 1-second gaps), not the lifetime sum. This means very long pages no longer accumulate "unfair" CLS — only the worst burst counts.

Expected vs. Unexpected Shifts

Layout shifts that occur within 500 ms of a user interaction(a click, tap, or keypress) are flagged as "expected" and excluded from CLS. So a "Read more" button that expands content does not hurt your score. Only shifts that happen on their own — usually during loading — are counted.

How to Check Your CLS Score

CLS, like the other Core Web Vitals, is measured both in the lab (synthetic) and in the field (real user data via the Chrome User Experience Report). Google weights field data for ranking purposes.

  • Greadme's deep scan — surfaces your CLS score alongside the rest of your Core Web Vitals, identifies which page elements are causing the shifts, and pairs each issue with an AI-generated fix or one-click GitHub PR.
  • Greadme's crawler scan — measures CLS across every indexable page on your site, so you can pinpoint which templates (product pages, article pages, listing pages) are dragging your CWV down.
  • Google Search Console → Core Web Vitals report — shows CLS performance across your entire site based on real user data (CrUX), segmented by mobile and desktop.
  • Browser developer tools → Performance tab — record a page load locally; the "Experience" lane in the timeline shows every layout shift event with the offending element highlighted.

9 Proven Ways to Fix Layout Shifts

1. Always Set Width and Height on Images and Videos

The single most common cause of bad CLS is images without dimensions. Without explicit width/height, the browser reserves zero space — then jumps when the image arrives.

Fix: Add width and height attributes to every <img> and <video>. Modern browsers use these to compute an aspect ratio and reserve the correct space before the file loads.

2. Use the CSS aspect-ratio Property

For responsive media (images that scale with the viewport), the aspect-ratio CSS property reserves space proportionally — preventing shifts on every screen size.

img, video {
  aspect-ratio: 16 / 9;
  width: 100%;
  height: auto;
}

3. Reserve Space for Ads and Embeds

Ad slots, social embeds, and chat widgets are repeat CLS offenders because they inject content asynchronously.

Fix: Wrap every ad slot in a fixed-size container that matches the largest expected ad. If the slot fills, no shift. If it stays empty, you keep a tiny bit of whitespace — a far better trade than a full-page jump.

4. Preload and Match Custom Fonts

When a custom font swaps in after the system fallback has already painted, line lengths change and surrounding text reflows.

Fix: Preload critical fonts with <link rel="preload" as="font">, use font-display: optional when feasible, and set size-adjust, ascent-override, and descent-override on the fallback so it occupies the same vertical space as the final font.

5. Animate with Transform, Not Layout Properties

Animating top, left, width, or margin triggers full layout recalculation and can cascade shifts to siblings.

Fix: Use transform: translate() and opacity for animations. They run on the compositor thread and never trigger layout.

6. Don't Inject Content Above the Fold

Cookie banners, promo bars, and notifications inserted at the top of the page push everything else down — typically a large impact fraction × large distance fraction = a very high shift score.

Fix: Either render these elements server-side so they're present at first paint, or position them with position: fixed so they overlay rather than displace content.

7. Use Skeleton Screens for Async Content

When data-driven sections (related posts, comments, product recommendations) appear after the initial render, they push surrounding content unless you reserve space.

Fix: Render skeleton placeholders with the same dimensions as the final content. When real content arrives, the swap is in-place.

8. Avoid min-height: auto on Carousels and Tabs

When a carousel or tabs widget reflows to its content height on each slide change, the surrounding page can shift unexpectedly.

Fix: Set a fixed min-height based on the tallest expected slide so the container size stays constant across states.

9. Be Careful with Infinite Scroll

Footers and CTAs that re-position when new content loads at the bottom of an infinite-scroll feed can register as shifts in the user's active session window.

Fix: Pre-load the next batch before the user reaches the end, and remove or fix-position any element that would otherwise be displaced.

Common CLS Culprits and Fixes

Problem: Images Without Dimensions

What's happening: Images load without reserved space, pushing every element below them downward as they arrive.

Fix: Add width and height attributes (or aspect-ratio CSS) to every image. This is the single highest-impact CLS fix on most sites.

Problem: Cookie Consent Banner Pushes Content

What's happening: The banner is inserted at the top of the body after first paint, displacing everything below it.

Fix: Use position: fixed at the bottom or top of the viewport so the banner overlays content instead of moving it. Alternatively, render it server-side so it's present at first paint.

Problem: Late-Loading Third-Party Widgets

What's happening: Social embeds, review widgets, and chat icons inject themselves asynchronously into containers with no reserved size.

Fix: Wrap each widget in a fixed-size container. If the widget fails to load, the container holds the space — preventing a delayed shift.

Problem: Web Fonts Reflow Text

What's happening: The fallback system font and the loaded custom font have different metrics, causing line breaks to change when the swap happens.

Fix: Use size-adjust, ascent-override, and descent-override on a @font-face fallback declaration to match the custom font's vertical metrics.

How CLS Compares to Other Core Web Vitals

CLS is the only Core Web Vital that doesn't measure speed. It can be excellent on a slow site or terrible on a fast one — they measure entirely different aspects of the experience.

MetricWhat It MeasuresGood ThresholdDifference From CLS
Largest Contentful Paint (LCP)When the largest visible element finishes loading≤ 2.5 sLCP is about speed; CLS is about stability.
Interaction to Next Paint (INP)Responsiveness to clicks, taps, and keypresses≤ 200 msINP measures input delay; CLS measures unprompted visual movement.
First Contentful Paint (FCP)When any visible content first appears≤ 1.8 sFCP marks the start of the render; CLS measures what happens during and after.
Total Blocking Time (TBT)How long the main thread is blocked during load≤ 200 msTBT is about JavaScript responsiveness; CLS is about visual movement.

FAQ

What is a good CLS score?

Google defines a good CLS as 0.1 or less. Scores between 0.1 and 0.25 "need improvement," and anything above 0.25 is considered poor. The threshold applies to the 75th percentile of real-user sessions — meaning 75% of visits must come in under 0.1 to pass.

Is CLS a Google ranking factor?

Yes. CLS is one of the three Core Web Vitals that became a confirmed ranking signal in June 2021 via the Page Experience update. Google uses field data from the Chrome User Experience Report (CrUX), not synthetic lab scores, for the ranking signal.

What changed in the 2021 CLS update?

Originally, CLS summed every layout shift across the entire page lifetime, which unfairly penalized long-lived single-page apps. The 2021 update introduced session windows: the score is now the maximum 5-second window of consecutive shifts (with no more than 1-second gaps). The headline number you optimize against is that worst burst.

Do shifts after user interaction count toward CLS?

No — shifts that occur within 500 ms of a user input (click, tap, keypress) are excluded. So an accordion expanding when someone clicks "Read more" does not affect your score. Only shifts that happen without user prompting are counted.

Why are images the biggest cause of bad CLS?

Because images without explicit width and height attributes default to taking zero space until they finish downloading. Once the image arrives, the browser inserts its full dimensions, pushing every element below it down — usually with a large impact fraction and a meaningful distance fraction, which multiply into a high shift score.

Does CLS affect AI search engines like ChatGPT and Perplexity?

Indirectly. Generative search systems most often surface pages that are already ranking well in traditional search — and CLS is part of that ranking signal. Additionally, Google AI Overviews preferentially cites pages that pass Core Web Vitals. A failing CLS reduces both your search visibility and your odds of being chosen as a citation.

Can a single-page app have good CLS?

Yes — but it requires deliberate effort. Reserve space for every async section with skeletons, animate route transitions with transform rather than layout properties, and ensure modals and toasts use position: fixedoverlays. The 5-second session window means a single bad transition can dominate your score, so it's worth profiling each route change.

Conclusion

CLS is the Core Web Vital users feel most viscerally — the missed click, the lost reading position, the cookie banner that pushed your headline off the screen. It's also one of the easiest to fix: reserving image dimensions, wrapping ads in sized containers, and preloading fonts will get most sites under the 0.1 threshold without architectural changes.

The business case is clear — Yahoo! JAPAN News drove a 15% increase in page views by getting CLS under 0.1. Run a Greadme deep scan to identify exactly which elements are shifting on each page, then fix them in order of impact.