Zum Inhalt springen
Core Web Vitals specialists
Performance

Avoid Cumulative Layout Shift: Stable Shops

13 min read
CLSCore Web VitalsLayout ShiftShopwareFrontend

An online shop whose content jumps around while loading erodes trust and revenue. That is exactly what Cumulative Layout Shift (CLS) captures as one of the three Core Web Vitals: the unexpected movement of visible elements during page rendering. In 2025, 72 percent (HTTP Archive Web Almanac 2025) of desktop pages and 81 percent (HTTP Archive Web Almanac 2025) of mobile pages reach a good CLS value below 0.1 -- yet data-dense shop templates with images, reviews, ad slots and late-loading scripts regularly belong to the unstable minority. This article explains the common causes of CLS, their measurable impact and concrete countermeasures for stable layouts. Anyone who takes their performance strategy seriously treats layout stability not as a cosmetic detail but as a conversion and ranking lever.

Cumulative Layout Shift - unstable vs. stable shop layoutUnstable - CLS 0.28HeaderImage without width/heightloads in lateProduct title and priceCookie banner injected lateButton shifts downwardWeb font swap shifts textAd without reserved spaceStable - CLS 0.02HeaderImage reserved via aspect-ratiospace reserved upfrontProduct title and priceButton stays in placeFont fallback metrically matchedAd slot with fixed heightOverlay as position fixedCLS thresholdsGoodMidPoor0.10.250.25+Top causesUnsized images, fontsAds, late injectionsBanners without placeholdersSession windowlargest shift burstmax 5s window1s gap per window

What Cumulative Layout Shift Actually Measures

Cumulative Layout Shift quantifies how much visible elements shift unexpectedly during loading -- movements the user did not trigger themselves. A CLS value below 0.1 is considered good, between 0.1 and 0.25 needs improvement and above that is poor (Source: Google web.dev). Unlike loading metrics, this is not about speed but about visual stability: if the order button jumps down at the moment of the click because a banner snaps in above it, the click lands on the wrong element.

The CLS score of an individual layout shift is calculated from two factors: the impact fraction (what share of the viewport is affected by the shift) and the distance fraction (how far the element moves relative to viewport height). An element covering half the visible area that shifts down by a quarter of the viewport height yields a shift score of 0.125 (0.5 times 0.25) (Source: Google web.dev). These scores are not added up arbitrarily but grouped within session windows.

Session Windowing: How the Final CLS Value Is Formed

Since the metric was revised, CLS is no longer summed over the entire page lifetime but over a session window: a burst of consecutive shifts with at most 1 second gap between them and a maximum total duration of 5 seconds. The reported CLS value is the sum of the largest such window (Source: Google web.dev). This means several small, distributed shifts weigh less than a single large jump during initial rendering.

Important for evaluation: for ranking, Google uses only real-user field data from the 75th percentile. A value that looks clean in the lab says little if real users on slower devices or connections experience stronger shifts. A robust performance analysis therefore combines lab and field data to capture both the cause and the real frequency of a shift.

0.1

CLS good threshold (Google web.dev)

72%

desktop pages good (Web Almanac 2025)

81%

mobile pages good (Web Almanac 2025)

5s

max. session window (Google web.dev)

Images Without Dimensions: The Most Common Cause

By far the most common source of CLS is images and media without reserved dimensions. According to the Web Almanac 2025, 62 percent (HTTP Archive Web Almanac 2025) of all mobile pages have at least one image without explicit dimensions, and the median page contains two such images -- rising to 25 at the 90th percentile (Source: HTTP Archive Web Almanac 2025). Without a width and height attribute, the browser does not know how much space the image needs before loading, renders the following content upward and then pushes it down once the image arrives.

The fix is unspectacular but effective: every ,