Your WordPress site loads fast. LCP looks fine, INP is under 200ms, and Core Web Vitals still flags the site as “Poor” or “Needs Improvement.” That’s almost always cumulative layout shift, and WordPress CLS optimization is usually the last fix developers get to because nothing looks technically broken. The page just feels slightly off: a button jumps right as someone taps it, or a paragraph shoves down mid-read because an image above it just finished loading.
What Is Cumulative Layout Shift, and Why Is WordPress Flagging It?
Cumulative Layout Shift (CLS) is a Core Web Vitals metric that scores how much visible content moves around unexpectedly while a page loads. A score under 0.1 is good, 0.1 to 0.25 needs improvement, and anything above 0.25 is poor. WordPress sites land in that middle or poor range constantly because themes, page builders, and plugins routinely skip reserving space for images, fonts, and ads before those elements finish loading.
The gap between WordPress and other platforms is measurable. Search Engine Journal’s 2025 HTTP Archive analysis found that only 43.44% of WordPress sites pass all three Core Web Vitals metrics, the lowest pass rate among the major CMS platforms tracked. CLS is a big part of that gap, since global CrUX data from January 2026 shows 80.9% of web origins overall achieving a good CLS score, meaning WordPress sites are disproportionately dragging their own average down.
Layout shift isn’t just a scorecard problem either. Yahoo! JAPAN fixed a significant CLS issue on its site and saw 15.1% more page views per session and 13.3% longer session duration, according to a case study published by Google on web.dev. That’s a real user behavior change tied directly to a page that stopped jumping around while people were trying to read it.
CLS is one of three Core Web Vitals, alongside Largest Contentful Paint and Interaction to Next Paint. If those two scores are already in good shape, CLS is usually the one metric standing between a site and a fully green Core Web Vitals report in Search Console.
What Causes Layout Shift on a WordPress Site?
Layout shift on WordPress comes from five recurring sources: images and embeds without set dimensions, web fonts that swap in after the page has already rendered, ads or third-party embeds that load late, JavaScript-injected elements like cookie banners and popups, and speed optimization plugins that lazy-load or defer the wrong content. Most WordPress sites are dealing with at least two or three of these at once.
- Images and videos without dimensions: the browser doesn’t know how much space to reserve, so the layout jumps once the file loads.
- Web fonts that swap: text renders in a fallback font first, then reflows when the custom font finishes loading.
- Late-loading ads and embeds: a YouTube video or ad unit that has no reserved container pushes everything below it down the page.
- JavaScript-injected content: cookie consent banners, sticky bars, and popups that insert themselves into the page after it has already rendered.
- Misconfigured optimization plugins: lazy-loading applied to above-the-fold images, or deferred CSS that leaves the page unstyled for a moment.
Fix #1: Add Width and Height to Every Image
Every image and video element needs explicit width and height attributes, or a CSS aspect-ratio value, so the browser can reserve the correct amount of space before the file finishes downloading. This is the single biggest CLS fix available on most WordPress sites, and it’s also the easiest one to get wrong without noticing.
Images added through the WordPress block editor’s native image block usually keep their width and height attributes automatically. The shift shows up when images get pasted in as raw HTML, pulled in through a page builder’s custom code widget, or loaded through a theme template that doesn’t pass dimension data along. A quick way to check is to open the browser’s dev tools, inspect an image element, and confirm both attributes are present.
<img src="hero-banner.jpg" width="1200" height="675" alt="Descriptive alt text" />For responsive layouts where the exact pixel size varies by screen width, pairing the width and height attributes with a CSS aspect-ratio rule keeps the reserved space proportional at every breakpoint, so the browser still knows the shape of the space to hold open even when the final rendered size isn’t fixed.
Fix #2: Stop Web Fonts From Causing a Layout Jump
Web fonts cause layout shift when the browser renders text in a fallback font first, then swaps to the custom font once it finishes downloading, and the two fonts don’t share the same line height or character width. Setting font-display: optional instead of the more common font-display: swap, or self-hosting the font files so they load faster and more predictably, removes most of this shift.
font-display: swap is the default a lot of themes and plugins ship with because it avoids invisible text while a font loads. The tradeoff is a visible reflow the moment the real font arrives. font-display: optional tells the browser to use the fallback font and skip the swap entirely if the custom font isn’t ready fast enough, which trades a small amount of brand consistency for a stable layout.
Sites loading fonts directly from Google’s servers add an extra DNS lookup and connection before the font file even starts downloading, which makes a font swap more likely to happen visibly instead of before the page paints. Self-hosting Google Fonts in WordPress removes that extra round trip and gives the font a better chance of loading before the layout has already settled.
Fix #3: Reserve Space for Ads, Embeds, and Injected Content
Any element that loads after the initial page render, ads, embedded videos, social widgets, needs a fixed-size container reserved for it in advance, or it will push the surrounding content down the moment it finishes loading. A simple CSS min-height on the wrapping div, sized to match the expected ad unit or embed dimensions, holds that space open before the content arrives.
This matters most for anything placed above the fold or inside the main content column, since that’s where a shift is most visible and most likely to move something a visitor was about to click. Ads and embeds placed near the bottom of a page still count toward the CLS score, but they’re less disruptive to the actual reading or browsing experience.
Do Cookie Banners and Popups Hurt Your CLS Score?
Yes. Cookie consent banners and popups that push page content down when they appear count fully toward CLS, even though they exist for compliance reasons and not as a content bug. Google’s measurement doesn’t distinguish between a shift caused by a broken layout and a shift caused by a legally required notice.
The fix is positioning, not removal. A cookie banner set to position: fixed and overlaid on top of the page, rather than inserted into the document flow at the top or bottom, doesn’t push anything else out of place. Most modern consent plugins support this layout option; it’s frequently just not the default one selected during setup.
Is Your Caching or Speed Plugin Making CLS Worse?
Speed optimization plugins can accidentally increase CLS when they lazy-load images that are already visible in the initial viewport, or when they defer CSS in a way that leaves the page unstyled for a moment before the real stylesheet applies. Both settings are meant to speed up perceived load time, and both can backfire into a worse layout shift score if applied without exceptions.
The setting to check first is lazy loading exclusions. Any caching or optimization plugin with a lazy-load feature should have an option to exclude a set number of above-the-fold images, or exclude specific images by class or ID. Leaving the hero image or logo subject to lazy loading is one of the more common self-inflicted CLS problems on WordPress sites running a caching plugin.
How Do You Check Your Site’s CLS Score?
Google’s PageSpeed Insights and the Core Web Vitals report in Search Console are the two most reliable ways to check a CLS score, and each one shows something slightly different. PageSpeed Insights runs a lab test on demand, while Search Console shows real-user field data collected from actual visitors over the past 28 days.
Field data from Search Console is the number that actually affects rankings, since Google’s ranking systems use real-user Core Web Vitals data rather than a single lab test. A page can pass a lab test cleanly and still show a poor CLS score in the field if the shift only happens under certain conditions, like a slow mobile connection or a specific ad network that didn’t fire during the lab run.
Frequently Asked Questions
A CLS score under 0.1 is considered good by Google, 0.1 to 0.25 needs improvement, and anything above 0.25 is classified as poor. This threshold is the same across every platform, not just WordPress.
Caching plugins speed up load time but don’t fix layout shift on their own, and some lazy-loading settings can make CLS worse if they’re applied to images above the fold. CLS needs to be fixed directly through image dimensions, font settings, and reserved space for ads or embeds.
Yes, CLS is one of Google’s three Core Web Vitals and is part of the page experience signals used in ranking. It works alongside content quality and relevance rather than replacing them, but a poor CLS score can hold a page back from ranking as well as it otherwise could.
Yes, lazy loading causes CLS problems when it’s applied to images that are already visible in the initial viewport, since the browser has nothing to reserve space with until the image loads in. Excluding above-the-fold images from lazy loading, usually the header, logo, and hero image, prevents this.
Fix ad-related layout shift by wrapping each ad slot in a container with a fixed minimum height that matches the ad unit’s expected size, so the space is reserved before the ad script loads. This keeps the surrounding content in place whether or not an ad actually fills the slot.
The Takeaway
CLS usually gets fixed last because nothing about it looks broken in a screenshot, it only shows up as a feeling that the page is slightly unstable while it loads. Fix image dimensions first, font-display settings second, and the rest of the causes on this list tend to be smaller adjustments after that. Run PageSpeed Insights or check Search Console after each change to confirm the score is actually moving before assuming a fix worked.

Leave a Reply