Free · Fast · Privacy-first

Check Your CLS Score (Cumulative Layout Shift)

Cumulative Layout Shift (CLS) measures how much your page visually jumps around as it loads, a frustrating experience that causes users to mis-tap, lose their place in long-form content, and abandon transactions mid-flow when a button moves at the wrong moment.

CLS score measurement

🔒

Shift source element identification

Before/after comparison support

No sign-up required

Cost
Free forever
Sign-up
Not required
Processing
In your browser
Privacy
Files stay local
FreeNo signupWhite-label

Add this Website Speed Test to your website

Drop the Website Speed Test into any page — blog post, product docs, intranet, school portal — with a single line of HTML. Your visitors get the full tool, processed entirely in their browser. No backend, no uploads, no signup.

  • Files stay 100% in the visitor's browser
  • Responsive — adapts to any container width
  • Free forever, no API key needed

Embed code

<iframe
  src="https://www.fixtools.io/web-tools/website-speed-test?embed=1"
  width="100%"
  height="780"
  frameborder="0"
  style="border:0;border-radius:16px;max-width:900px;"
  title="Website Speed Test by FixTools"
  loading="lazy"
  allow="clipboard-write"
></iframe>

Attribution-friendly: a small "Powered by FixTools" link appears in the embed footer.

CLS Explained: Why Your Page Moves Around and How to Stop It

Cumulative Layout Shift (CLS) measures the degree to which visible elements unexpectedly move during page loading. It is expressed as a unitless score representing the cumulative impact of all unexpected layout shifts, calculated as the product of the impact fraction (how much of the viewport shifted) and the distance fraction (how far elements moved). A shift that moves 50 per cent of the viewport content by 10 per cent of the viewport height produces a CLS contribution of 0.05. Google's thresholds are Good under 0.1, Needs Improvement between 0.1 and 0.25, and Poor above 0.25. Unexpected layout shifts are particularly damaging to user experience when they cause users to click on the wrong element, for example a button that shifts just as the user taps it, triggering an unintended action such as confirming a purchase the user was still evaluating.

The most common cause of poor CLS is images without explicit width and height attributes in the HTML. When a browser encounters an img tag without dimensions, it cannot reserve the correct space in the layout until the image actually downloads and the browser learns its intrinsic dimensions. When the image eventually loads, all content below it shifts downward to accommodate the now-known dimensions, producing a cumulative shift that registers in the CLS score. The fix is mechanical and immediate: add explicit width and height attributes to every image tag, or use the CSS aspect-ratio property to reserve the correct space before the image loads. Modern browsers use these attributes to calculate the aspect ratio and reserve the correct space immediately during initial layout, preventing any layout shift when the image data eventually arrives.

Three other frequent CLS causes require different fixes that target their specific mechanisms. Web fonts cause layout shift when the fallback font renders at a different size than the loaded font, producing the FOUT or Flash of Unstyled Text problem familiar to anyone who has used custom typography. The fix is to use font-display: optional, which prevents the swap entirely for slow-loading fonts, or font-display: swap combined with size-adjust to match fallback and loaded font metrics so the swap is visually imperceptible. Late-injected banner ads and cookie banners push existing content down when they load after the page has already rendered. Reserve space for ads and banners before they load using min-height CSS on their containers. Dynamically injected content such as navigation menus, promotional banners, and infinite scroll loads can push existing content in ways that surprise users, and the fix is to ensure injections only occur below the viewport or in spaces explicitly reserved for them.

Diagnosing CLS in production requires identifying which specific elements are contributing to the cumulative score, because the fix is element-specific and depends on what that element is. Chrome DevTools' Performance panel includes a Layout Shift section that lists every shift event with its score contribution and the element responsible, played back frame by frame so you can see exactly when each shift occurs. The Web Vitals JavaScript library can also be deployed in production to attribute real-user CLS to specific elements, which is invaluable when lab tests show a healthy CLS but field data in Search Console reveals a problem that only appears under conditions a lab cannot reproduce, such as slow network connections that delay image loading past the user's first interaction with the page.

How to use this tool

💡

Enter your URL to measure CLS and identify the specific elements causing layout shifts on your page.

How It Works

Step-by-step guide to check your cls score (cumulative layout shift):

  1. 1

    Enter your URL

    Paste the URL of the page you want to test for layout shift issues, choosing a page that represents a meaningful traffic pattern rather than a stripped-down development view. Pages with heavy ad inventory, lots of images, or third-party widgets are usually the worst CLS offenders, so test those first if you suspect a problem. The tool measures the page exactly as a real visitor would experience it on a typical mobile device.

  2. 2

    Review the CLS score

    Check the CLS value against Google's standard thresholds. Good is under 0.1, Needs Improvement sits between 0.1 and 0.25, and Poor is anything above 0.25. Note that the score is unitless and represents the cumulative impact of every shift during the measurement window, so a single dramatic shift can push the score into Poor territory even when the rest of the page is visually stable throughout the load.

  3. 3

    Identify the shifting elements

    Review the report to see which specific elements are contributing to the CLS score and how much each one contributes. Note each shift source separately, because the fix for an image-driven shift differs from the fix for an ad-driven shift or a font-driven shift. Capture screenshots of each problematic element so you can show the team exactly what is moving and at which moment in the load sequence, which makes the subsequent fix conversation faster and more concrete.

  4. 4

    Apply targeted fixes

    For image-driven shifts, add explicit width and height attributes or use CSS aspect-ratio. For ad and embed shifts, reserve CSS space with min-height on the container so the slot occupies its eventual size from the first paint. For dynamically injected content, switch to fixed positioning or pre-render the content so it occupies its space at initial load rather than appearing later. Re-test after each fix in isolation so you know which change drove which improvement, rather than batching everything and losing the attribution.

Real-world examples

Common situations where this approach makes a real difference:

Ad-heavy news site

A news site with CLS of 0.45 across its article template investigates the cause using the FixTools checker. The report shows three ad slots loading at different intervals without reserved height are each contributing to the cumulative shift, with the largest slot near the top of the article responsible for almost half the total score. Adding min-height CSS sized to the largest expected ad creative for each container reduces CLS to 0.08, comfortably back inside the Good range. The site sees improved time-on-page metrics within weeks as readers stop losing their place when ads finally render.

Cookie banner fix

An e-commerce site discovers that its cookie consent banner, which loads roughly 2 seconds after the page first renders, pushes every other element down by 80 pixels and produces a single dramatic shift event that dominates its CLS score. Moving the banner to a fixed-position overlay at the bottom of the viewport, where it overlays content rather than displacing it, eliminates the CLS contribution entirely without sacrificing the banner's legal compliance function. The fix is a single CSS change and ships the same day the cause is identified.

Image gallery improvement

A photographer's portfolio site presents a masonry gallery where images load progressively without reserved dimensions, producing a CLS of 0.38 as each new image arrives and pushes the surrounding tiles into new positions. The developer adds explicit width and height attributes to every image tag and wraps each tile in a CSS aspect-ratio container that reserves the correct space from initial layout. CLS drops to 0.04 with no visual change to the gallery design, and the site moves from the Poor CLS bucket into the Good bucket in Search Console within the next CrUX update window.

When to use this guide

Use this when you notice your page content jumping around for users, when your CLS score is flagged as Poor in Google Search Console, or as part of a Core Web Vitals audit.

Pro tips

Get better results with these expert suggestions:

1

Add width and height to every image tag

The single fastest CLS fix is to add explicit width and height attributes to every img tag in your HTML markup. This allows browsers to calculate the intrinsic aspect ratio and reserve the correct layout space before the image data downloads, which prevents the most common cause of layout shift across the entire web. This is a one-line change per image, takes a single afternoon to implement across most sites, and typically produces immediate CLS improvement that shows up in the next Lighthouse run without any other intervention required.

2

Reserve space for ads and cookie banners

Late-loading ads and cookie consent banners are among the most common sources of high CLS scores because both load on a delay and both insert visual content where there previously was none. Reserve their space with a min-height placeholder before they load by adding a container div sized to the expected dimensions and injecting the ad or cookie banner into that pre-sized container rather than pushing surrounding content out of the way. The same technique works for video embeds, social media widgets, and any other late-loading visual content that lives inline on the page.

3

Use size-adjust to match font fallback dimensions

Web font loading causes CLS when the fallback font renders at different proportions than the loaded font, producing the visible reflow known as FOUT when the custom font finally arrives and the browser re-renders the text. The CSS size-adjust descriptor, supported in all modern browsers, scales the fallback font to match the loaded font's metrics so the swap is visually imperceptible to users. Pair size-adjust with font-display: swap for the best balance of perceived performance and visual stability across the loading sequence.

4

Record CLS as a video to identify shift source

For high CLS scores where the shift source is not immediately obvious, record the page loading as a video using the Chrome DevTools Performance panel and play back frame by frame to identify exactly which element shifts and at what point in the load timeline the shift occurs. This visual debugging method quickly reveals the shift source for complex CLS issues that involve interactions between multiple late-loading elements, and the recording itself becomes useful documentation for explaining the fix to a stakeholder who needs to authorise the work.

5

Always specify width and height on images

The single most common cause of CLS is images without explicit width and height attributes. Without dimensions, the browser reserves no space and content jumps down when the image loads. Adding width and height eliminates this class of CLS entirely.

6

Reserve space for ads and embeds

Ad slots, video embeds, and dynamic content often load asynchronously and push content down when they appear. Use CSS to reserve a minimum space for these elements before they load.

7

Avoid injecting content above existing content

Banners, cookie notices, and notifications injected above the page fold after load cause significant CLS. Load them before initial render or animate them in from outside the viewport to avoid shifting existing content.

FAQ

Frequently asked questions

CLS measures visual stability by quantifying how much visible page elements unexpectedly move during loading. It is calculated as the sum of all unexpected layout shift scores, where each individual shift score is the fraction of the viewport impacted multiplied by the fraction of the viewport the affected element moved. The metric is unitless and additive, so a page with several small shifts can accumulate a worse score than a page with one larger but isolated shift. Google's Good threshold is CLS under 0.1, measured at the 75th percentile of real user visits over a 28-day rolling window, which means three quarters of your visitors must experience CLS under 0.1 for the page to qualify as Good.
The most common causes in production sites are images without explicit width and height attributes, web fonts loading and causing text reflow when the custom font swaps in, late-injected ads or banners pushing existing content down as they appear, dynamically injected content above existing content as part of personalisation or A-B testing, and CSS animations that change element sizes or positions in ways that affect document flow rather than using transform properties that do not trigger reflow. Images without dimensions are by some margin the most frequent cause in real production sites and are also the easiest to fix, which is why they remain such common offenders despite the well-known fix.
The five highest-leverage fixes resolve most CLS issues in production. Add width and height attributes to every img and video tag in your HTML. Reserve space for ads and banners using min-height CSS on their containers before they load. Use font-display: swap combined with the size-adjust CSS descriptor to make web font swaps visually imperceptible. Avoid injecting content above existing page content where possible, and when injection cannot be avoided, ensure the injected content has reserved space. Use transform-based CSS animations, which do not trigger layout recalculations, instead of animating top, left, width, or height properties that force reflow.
Good CLS is 0.1 or lower measured at the 75th percentile of real user visits, Needs Improvement falls between 0.1 and 0.25, and Poor is anything above 0.25. CLS is unitless, so a value of 0.1 means the cumulative shifts moved visual content equivalent to roughly 10 per cent of the viewport area, weighted by how far each element moved. Most well-optimised pages achieve CLS under 0.05 with discipline around image dimensions and ad slot sizing. Pages with heavy advertising or aggressive dynamic content injection struggle most with CLS and typically require structural intervention rather than incremental tweaks to reach the Good range.
Both lab and field measurement exist and they serve different purposes. Lighthouse measures CLS in a controlled lab environment by simulating the page load under fixed conditions, which makes the result reproducible but not necessarily representative of real user experience. Google uses CrUX field data, which is aggregated from real Chrome user measurements, for search ranking. Lab CLS and field CLS can differ significantly because real users trigger interactions such as scrolling and clicking that cause additional layout shifts not captured in a single automated page load test. Always check Search Console's Core Web Vitals report for your real-user CLS values.
Yes, very commonly, because cookie banners typically inject after the initial page render and push existing content downward to create space for themselves, producing a large isolated shift event that can dominate the page's total CLS score. The fix is either to use a fixed-position banner with position: fixed at top or bottom, which overlays content rather than pushing it and therefore does not affect document flow, or to reserve the banner's space with an empty placeholder div before the banner loads. Fixed-position cookie banners do not cause CLS because they sit on a separate layer above the document, and most modern consent management platforms support fixed positioning as a configuration option.
CLS measures visual stability by tracking unexpected element movement during page loading, while FID/INP measures interactivity responsiveness by tracking how quickly the page responds to user clicks, taps, and keyboard input. They target completely different user experience problems and therefore have different fixes. CLS makes pages frustrating to read and use because things move at the wrong moment; poor INP makes pages feel sluggish and unresponsive to user actions. Both are Core Web Vitals ranking signals and both must pass their respective Good thresholds for a page to qualify for the full Page Experience boost in Google search rankings.
Search Console Core Web Vitals data uses a 28-day rolling window of real user measurements, so a fix that genuinely improves CLS will not fully reflect in the report for at least four weeks and typically takes six to eight weeks before the new measurements have completely replaced the older window. During the transition period the reported value gradually shifts toward the new equilibrium as new measurements arrive and old ones age out. Treat the FixTools lab score as the fast-feedback signal that confirms the fix worked technically, and treat Search Console field data as the slower confirmation that real users actually experienced the improvement under their real network and device conditions.
CSS animations can cause CLS when they animate properties that trigger layout recalculation, such as top, left, right, bottom, width, height, margin, or padding. Each frame of such an animation can technically register as a layout shift even though it is intentional. Use transform-based animations instead, including translateX, translateY, scale, and rotate, because these properties are composited by the browser without triggering layout, which means they do not affect CLS at all. Refactoring animations from layout-triggering properties to transform-based properties is usually a small mechanical change with no visual difference, and it eliminates an entire class of CLS contribution in a single pass.
Yes, CLS measures all unexpected layout shifts throughout the entire page lifecycle, not just during initial load, with one important exception: shifts that occur within 500ms of a user interaction are considered expected and excluded from the score. This exclusion exists because users intuitively understand that clicking a button might open a panel or reveal content that legitimately moves other elements. The exclusion does not extend to shifts that occur more than 500ms after an interaction, which are still considered unexpected. Continuously running carousels, infinite scroll loaders, and timer-driven content updates all contribute to CLS during the user's entire session on the page.

Related guides

More use-case guides for the same tool:

Ready to get started?

Open the full Website Speed Test — free, no account needed, works on any device.

Open Website Speed Test →

Free · No account needed · Works on any device