What Is CLS (Cumulative Layout Shift)? Causes and Fixes
Cumulative Layout Shift measures how much a page's content jumps around unexpectedly. Learn how CLS is scored, the thresholds, the common causes such as images without dimensions and late-loading banners, and how to see shifts in real sessions.
Short answer: Cumulative Layout Shift is a score for how much visible content moves unexpectedly while a page is in use. A score of 0.1 or less at the 75th percentile is considered good. It is caused mostly by images and embeds without reserved space, content inserted above what the visitor is reading, and fonts that change size when they load. The visible symptom is a visitor tapping the wrong thing because the page jumped.
Table of Contents
What CLS Measures
Each time a visible element moves without the visitor causing it, the browser records a layout shift. Its score combines how much of the viewport was affected with how far things moved. CLS reports the worst burst of shifts during the page's life.
It is a unitless score, not a time. Shifts within half a second of a user's own action, such as tapping a button that expands a panel, are excluded because they are expected.
Thresholds
| CLS | Rating |
|---|---|
| 0.1 or less | Good |
| 0.1 to 0.25 | Needs improvement |
| Over 0.25 | Poor |
Measured at the 75th percentile of real visits.
Common Causes
| Cause | What happens |
|---|---|
| Images without width and height | The page reflows when each image arrives |
| Ads, embeds, and iframes without reserved space | Content below is pushed down |
| Banners inserted at the top | Cookie notices, promo bars, app-install prompts |
| Web fonts | Text re-wraps when the font swaps in |
| Content loaded after render | Reviews, recommendations, personalised blocks |
| Animations using top, left, or height | Each frame is a layout change |
| Late-arriving sticky headers | Everything shifts down by the header's height |
Shifts are worse on mobile, where a narrow screen means any inserted element moves everything.
Fixes
Reserve space for media.
<img src="/product.webp" width="600" height="600" alt="Blue cotton shirt">With width and height, the browser keeps the right space before the image loads. For responsive containers, use the CSS aspect-ratio property.
Reserve space for anything loaded later. Give ad slots, embeds, and asynchronous blocks a minimum height. A skeleton placeholder of the final size does this (loading states).
Do not insert content above existing content. Overlay banners instead of pushing the page down, or reserve their space in the initial HTML. This applies to cookie banners and sticky bars.
Stabilise fonts. Use a fallback with similar metrics and preload the main font (font loading).
Animate with transform and opacity, which do not trigger layout.
Seeing Shifts in Real Sessions
A CLS score tells you a page is unstable. It does not show you what moved, or what it cost.
Layout shifts leave recognisable traces in behavior:
- Mis-taps. A visitor taps where a button was, and hits something else. They go back immediately.
- Rage clicks shortly after page load.
- A click on an advert or unrelated link, followed by an instant return.
- Scroll corrections, where the reader loses their place and scrolls back up.
In a session recording you can watch the page as it loaded for that visitor and see the element arrive and push the rest down. Because CLS depends on network timing, it often does not reproduce on a fast office connection, which is why field data and recordings matter more here than a lab test.
A practical routine:
- Find pages with poor CLS in real-user performance data, by device.
- Open mobile sessions on that page.
- Watch the first five seconds of several.
- Note which element arrives late.
- Reserve its space and re-measure.
The worst case is a shift at the moment of commitment: a "Place order" button that moves as a late banner loads, so the tap lands on "Cancel" or an upsell. On checkout pages, treat any shift as a bug (mobile checkout).
Throttle your network when testing
Layout shifts hide on fast connections. Use the slow network profile in browser developer tools and reload.
Key Takeaways
- CLS scores unexpected movement; aim for 0.1 or less.
- Reserve space for everything that loads late.
- Never push content down with a late banner.
- Recordings show exactly what moved and what the visitor mis-tapped.
Conclusion
A page that jumps feels broken even when it is fast. Give every late element a reserved place and the problem mostly disappears.
Frequently Asked Questions
Related articles
Stay in the loop
Get the latest insights on product analytics and user behavior delivered to your inbox.



