WordPress CLS Is Destroying Your Rankings — Fix It Now (2026)

✍️ By Vikas Rohilla 📅 Updated: April 2026 ⏱️ 11 min read 🏷️ Core Web Vitals

You open PageSpeed Insights on your WordPress site and see it — a red CLS score. Or maybe it is orange. Either way, it is dragging your performance score down, and you are not entirely sure what it means or where to even start fixing it.

Here is the thing about WordPress CLS that most guides gloss over: it is not one problem. It is a category of problems. Images without dimensions, fonts loading late and shifting text, ads appearing mid-scroll, cookie banners pushing content down — each of these causes layout shift, and each has a different fix. Applying the wrong fix wastes time. Applying them in the right order is what actually gets your CLS score into the green.

This guide covers everything: what WordPress CLS actually measures, how to identify exactly which elements are causing layout shift on your site, and the complete fix for every common cause — with exact steps for WordPress specifically.

🚨 CLS above 0.1 is hurting your rankings right now. Google’s Core Web Vitals threshold for a “good” CLS score is under 0.1. Between 0.1 and 0.25 is “needs improvement.” Above 0.25 is “poor” — and Google’s Page Experience signals use CLS as a direct ranking factor. Check yours now: run your URL through ToolXray’s free audit or Google PageSpeed Insights.
google search console core web vitals cls score wordpress cumulative layout shift poor
Google Search Console → Core Web Vitals — a red CLS score means Google has classified your pages as “poor” for layout stability. This directly impacts your Page Experience ranking signals and is one of the most fixable Core Web Vitals issues on WordPress.

What Is CLS — And Why Does WordPress Struggle With It?

Cumulative Layout Shift measures how much your page’s visible content unexpectedly moves during loading. Every time an element shifts position after initial render — pushing other content down, left, or right — that movement is scored and added to your CLS total. The score is a unitless number between 0 and 1+, where lower is better and anything under 0.1 is considered “good” by Google.

The reason WordPress CLS is such a common problem is not that WordPress itself is badly built. It is that WordPress makes it extremely easy to install plugins, embed ads, add custom fonts, and upload images — and each of these, done without specific CLS-awareness, introduces layout shift in a different way.

A typical WordPress site might be experiencing CLS from three or four sources simultaneously without the owner realising any of them exist. An image uploaded without dimensions shifts the text below it when it loads. A Google Fonts embed causes a flash of unstyled text that pushes content slightly when the real font arrives. An ad network injects a banner between paragraphs after the page has rendered. A cookie consent plugin slides in from the bottom and pushes the footer up.

Each of these is a separate WordPress CLS cause with a separate fix. The combined score you see in PageSpeed Insights is the sum of all of them.

📖 Related: CLS is one of the three Core Web Vitals signals. If your LCP score also needs work, read the WordPress LCP Fix Guide alongside this one — fixing both together gives you the strongest combined Page Experience improvement.

How to Diagnose Your WordPress CLS — Find the Exact Elements

Before fixing anything, you need to know which specific elements are causing layout shift on your site. PageSpeed Insights gives you a score — but it does not always tell you clearly which elements are responsible. Here is how to find the exact culprits:

Method 1 — PageSpeed Insights (Fastest)

  1. Go to pagespeed.web.dev → enter your URL → Analyze
  2. Scroll to the “Diagnostics” section
  3. Look for “Avoid large layout shifts” — click to expand it
  4. It will show you a list of DOM elements responsible for CLS with their individual shift scores
  5. Note each element — image, ad slot, font, banner — these are your targets
pagespeed insights cls score wordpress avoid large layout shifts elements diagnostic
PageSpeed Insights → Diagnostics → “Avoid large layout shifts” — this section lists the exact DOM elements causing CLS on your WordPress site with individual shift scores. Start fixing the highest-scoring elements first.

Method 2 — Chrome DevTools (Most Detailed)

  1. Open your site in Chrome → press F12 to open DevTools
  2. Click the “Performance” tab
  3. Click the record button (●) → reload the page → stop recording after full load
  4. In the timeline, look for red markers labelled “Layout Shift”
  5. Click on any Layout Shift event → the bottom panel shows exactly which element moved and by how much
  6. This is the most precise way to identify WordPress CLS causes — use it for any element that PageSpeed Insights identifies but does not describe clearly enough
chrome devtools performance tab layout shift wordpress cls diagnostic timeline
Chrome DevTools → Performance tab → Layout Shift events in the timeline. Each red marker represents a shift event. Clicking on it reveals exactly which element moved and its individual CLS contribution — the most precise WordPress CLS diagnostic available.
💡 Field data vs Lab data: PageSpeed Insights shows both “Field data” (real user measurements from Chrome UX Report) and “Lab data” (simulated). For WordPress CLS fixes, focus on field data — it reflects actual user experience on your live site and is what Google uses for ranking. Lab data can look better than field data because it does not include dynamic content like ads or personalised cookie banners.

Fix 1: Add Width and Height to Every Image

This is the single most common cause of WordPress CLS — and the most impactful fix. When a browser loads a page and encounters an image without declared dimensions, it has no idea how much space to reserve for it. So it renders the surrounding content first, then shifts everything down when the image finally loads and the browser realises it needs 400 pixels of vertical space.

The fix is declaring width and height attributes on every <img> tag. This gives the browser the information it needs to reserve the correct space before the image loads — eliminating the shift entirely.

For Images Uploaded Through WordPress Media Library

  1. Go to WordPress Dashboard → Media → Library
  2. Click on any image → in the right panel, note the image dimensions shown
  3. When inserting images into posts via the Block Editor, WordPress automatically adds width and height attributes in modern versions (5.5+)
  4. To verify: open a post in Code editor mode → find your image block → confirm the img tag has both width=”X” and height=”Y” attributes
wordpress media library image dimensions width height cls fix wordpress
WordPress Media Library → image details showing width and height dimensions. Every image inserted into your WordPress posts should have explicit width and height attributes declared — this is the most common WordPress CLS fix and eliminates layout shift from images loading late.

For Images in Custom HTML or Page Builders

If you are using custom HTML blocks or a page builder like Elementor, images may not have dimensions automatically added. Fix manually:

<!– BAD — no dimensions, causes CLS –> <img src=”your-image.jpg” alt=”description”><!– GOOD — dimensions declared, no CLS –> <img src=”your-image.jpg” alt=”description” width=”800″ height=”450″>

For Existing Posts — Bulk Fix via Plugin

If you have hundreds of existing posts with images missing dimensions, manually updating each one is not practical. Use the Smush or Imagify plugin — both have a feature to bulk-add missing image dimensions. Alternatively, the EWWW Image Optimizer plugin includes an option to add missing width/height attributes across your entire media library.

✅ Quick check: Run your URL through PageSpeed Insights after adding image dimensions. The “Avoid large layout shifts” diagnostic should show a reduced CLS contribution from image elements. If images were your primary WordPress CLS cause, you may see your score jump from poor to good with this single fix.

Fix 2: Fix Font Loading — Eliminate Font Swap Layout Shift

WordPress CLS from fonts happens in two ways. First, the browser renders text using a system font (because your custom font has not loaded yet), then swaps to the actual font when it arrives — and if the two fonts have different metrics, text reflows and everything below it shifts. Second, late-loading fonts can cause a flash of invisible text (FOIT) that appears suddenly and causes shift.

For Google Fonts — Add font-display: swap

If you are loading Google Fonts via a plugin or your theme, ensure font-display: swap is set. This tells the browser to use a fallback font immediately and swap when the custom font is ready — preventing invisible text but still potentially causing minor shift.

The better solution for WordPress CLS is hosting fonts locally instead of loading from Google’s servers:

  1. Install the OMGF (Optimize My Google Fonts) plugin — free, specifically designed for this
  2. Go to Settings → OMGF → it will automatically detect Google Fonts used on your site
  3. Click “Save & Optimize” — it downloads the fonts to your server and updates the CSS
  4. Locally hosted fonts load faster and with more consistent timing — reducing the font-swap CLS contribution significantly

For Theme Custom Fonts

In your theme’s style.css or via Appearance → Customize → Additional CSS, add font-display: swap to your @font-face declarations:

@font-face{ font-family: ‘YourFont’; src: url(‘your-font.woff2’) format(‘woff2’); font-display: swap; /* Add this line */ }
📖 Related: Font loading also directly impacts LCP and TTFB scores. After fixing WordPress CLS from fonts, check the TTFB optimization guide to ensure your server is delivering fonts as fast as possible.

Fix 3: Reserve Space for Ads and Embeds

Ads are one of the most persistent causes of WordPress CLS because they are loaded asynchronously — the page renders first, then the ad network injects content into ad slots. If those slots have no pre-reserved dimensions, everything below the ad jumps downward when the ad appears.

The fix is straightforward: give every ad container a fixed minimum height before the ad loads.

/* Add to Appearance → Customize → Additional CSS *//* Fixed height ad containers — prevents layout shift */ .ad-container, .ad-slot, ins.adsbygoogle { min-height: 90px; /* Match your typical ad height */ display: block; }/* For responsive ads */ .ad-responsive { min-height: 250px; width: 100%; }

For Google AdSense specifically — if you are using the Auto Ads feature, it places ads in positions it calculates dynamically, which is a major source of WordPress CLS. Switching from Auto Ads to manual ad placement (where you control exactly where ads appear and can pre-reserve space) gives you full control over the CLS impact.

  • In AdSense: Disable “Auto ads” → use Display Ad units instead → place them in specific widget areas or within content at defined positions → add the CSS min-height fix above to those containers
  • For header banners: Any banner in your header that loads after the initial render should have explicit height reserved. A 728×90 leaderboard should have min-height: 90px on its container.
  • For in-content ads: If ads appear between paragraphs, wrap each ad in a container with fixed dimensions. The ad may not fill the entire space every time — but the space is reserved and content will not shift.

Fix 4: Fix Cookie Banners and Notification Bars

Cookie consent banners are a particularly frustrating source of WordPress CLS because they are often injected by plugins that have no awareness of Core Web Vitals. A banner that slides in from the bottom and pushes the footer up, or appears at the top and shifts all content down, can add 0.1–0.3 to your CLS score on its own.

  • Use a fixed-position banner instead of a document-flow banner: A cookie banner with position: fixed or position: sticky sits on top of your content without occupying space in the document flow. It appears visually but does not cause layout shift because it is not part of the content stack.
  • Check your cookie plugin settings: Most modern GDPR plugins (Complianz, CookieYes, GDPR Cookie Consent) have options for banner position. Choose “bottom fixed” or “top overlay” rather than “top banner” (which inserts into the document flow).
  • Notification bars: Same principle — any notification bar that pushes content down by inserting into the document flow causes CLS. Use position: fixed with a matching padding-top on the body element so the bar overlays rather than shifts content.
/* Cookie/notification bar that doesn’t cause CLS */ .cookie-banner { position: fixed; bottom: 0; left: 0; right: 0; z-index: 9999; /* Does NOT shift page content */ }/* If you need a top bar — use fixed + body padding instead */ .notification-bar { position: fixed; top: 0; left: 0; right: 0; height: 48px; z-index: 9999; } body.has-notification-bar { padding-top: 48px; /* Reserve the space in document flow */ }

Fix 5: Prevent Embed Layout Shifts (YouTube, Twitter, Maps)

Embedded content — YouTube videos, Twitter posts, Google Maps, Loom videos — causes WordPress CLS because these embeds do not have inherent dimensions. The browser renders the surrounding content, then reserves space for the embed when the embed’s own dimensions are discovered. Everything below it shifts.

For YouTube Embeds — Use aspect-ratio CSS

/* Wrap YouTube embeds in this container */ .video-container { position: relative; padding-bottom: 56.25%; /* 16:9 ratio */ height: 0; overflow: hidden; }.video-container iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }

Add this CSS in Appearance → Customize → Additional CSS and wrap your YouTube embeds in <div class=”video-container”>. The browser knows exactly how much space to reserve before the embed loads.

For WordPress Blocks — Use the Video Block

WordPress’s native Video block and the YouTube embed block both apply aspect ratio handling automatically in modern WordPress versions. If you are pasting raw YouTube URLs or using custom HTML embeds, they may not have this protection — switch to the native Embed block for any video content.

For Elementor Users

Elementor’s Video widget reserves space correctly for YouTube embeds. If your CLS analysis shows Elementor video elements as a source of shift — check that you are using the native Video widget rather than an HTML widget with a raw iframe.

Still seeing poor CLS scores after all these fixes?

Server-side performance affects how quickly your browser can lay out the page. Hostinger Business and Cloud plans with LiteSpeed server and built-in caching deliver HTML significantly faster — giving the browser more time to complete layout before user interaction begins.

Upgrade Hosting →

Fix 6: Fix Dynamic Content Injected by Plugins

This is the hardest category of WordPress CLS to diagnose because it depends entirely on which plugins you have installed. Any plugin that injects content after the initial page render — without reserving space in advance — is a potential CLS source.

Common offenders:

Plugin TypeCLS CauseFix
Live chat widgetsChat bubble injects after render, shifts corner contentUse position:fixed with no document flow impact
Social share barsFloating bars shift sidebar or content on mobileUse fixed positioning or disable on mobile
Popup pluginsExit-intent popups shift content when appearingUse overlay popups, not document-flow injection
Related postsLazy-loaded related posts section shifts content belowReserve fixed height for the section container
WooCommerce notices“Added to cart” notices push content down at topUse fixed/toast-style notices instead of flow injection

The diagnostic approach: temporarily deactivate plugins one by one and re-run PageSpeed Insights after each deactivation. When your CLS score drops significantly, you have found the offending plugin. Then either configure it to use fixed positioning, find an alternative plugin that is CLS-aware, or add the appropriate CSS fix.

🔍

ToolXray Free WordPress Technical Audit

Check your CLS score alongside LCP, TTFB, PageSpeed, broken links and 80+ SEO signals — free scan, no signup required.

Run Free Audit →

How to Verify Your WordPress CLS Fix

After implementing fixes, do not just re-run PageSpeed Insights once and assume you are done. WordPress CLS verification requires checking both lab data and real-world field data.

  1. PageSpeed Insights — Lab data check: Run your URL immediately after making changes. The “Avoid large layout shifts” diagnostic should show reduced or eliminated contributions from the elements you fixed.
  2. GSC Core Web Vitals — Field data check: Go to Google Search Console → Core Web Vitals. Field data updates based on real Chrome user data — it takes 28 days for the rolling average to fully reflect your changes. But you should see a trend improvement starting within 1–2 weeks.
  3. Chrome DevTools — Timeline verification: Run a Performance recording on your fixed pages. The Layout Shift events in the timeline should be reduced or absent for the elements you fixed.
  4. Mobile vs Desktop: Check both separately. CLS scores often differ significantly between mobile and desktop because ad layouts, font rendering, and plugin behaviour can vary by screen size. A fix that resolves desktop CLS may not resolve mobile CLS.
google search console core web vitals cls improved green good score wordpress fix
Google Search Console → Core Web Vitals — after fixing WordPress CLS, the report should show pages moving from “Poor” or “Needs improvement” to “Good” (green). Field data takes 28 days to fully update but trend improvement is visible within 1-2 weeks.

WordPress CLS Fix — Complete Checklist

  • Run diagnosis first: PageSpeed Insights → “Avoid large layout shifts” → identify every element causing CLS before fixing anything.
  • Add width and height to all images: Every img tag must have explicit dimensions. Check existing posts — use Smush or EWWW to bulk-fix missing attributes.
  • Fix font loading: Add font-display: swap to all custom fonts. For Google Fonts — use OMGF plugin to host locally.
  • Reserve space for all ad containers: min-height on every ad slot. Switch from Auto Ads to manual placement if using AdSense.
  • Fix cookie banner position: position: fixed so it overlays rather than shifts content. Check your GDPR plugin settings.
  • Fix video embeds: Use aspect-ratio containers for YouTube. Use native WordPress Embed block where possible.
  • Audit plugins for dynamic injection: Deactivate and re-test if CLS source is unclear. Fix positioning or replace offending plugins.
  • Verify on mobile AND desktop separately: CLS often differs. PageSpeed Insights tests both — check both scores after fixes.
  • Monitor GSC Core Web Vitals for 28 days: Field data takes time to update. Track the trend weekly.
📖 Full picture: CLS is one signal in a full technical SEO audit. After fixing your WordPress CLS, run a complete check with the Technical SEO Audit guide and WordPress Speed Optimization guide to ensure every performance signal is working in your favour.

The Bottom Line

A poor WordPress CLS score is almost never one problem — it is three or four problems stacked on top of each other. Images without dimensions. Fonts loading late. Ads appearing after render. Cookie banners shifting content. Each adds to the cumulative total, and the fix for each is different.

The approach that works is diagnostic first, fix second. Use PageSpeed Insights and Chrome DevTools to identify the exact elements causing shift on your specific site before touching anything. Then work through the fixes in the order of their impact — images and fonts first, because they affect every page, then ads and plugins which may only affect specific pages.

A WordPress CLS score under 0.1 is achievable on almost any site with the fixes in this guide. The improvement shows in Google Search Console within a few weeks — and the ranking impact from moving from “poor” to “good” on CLS is measurable, particularly in competitive niches where most sites are still ignoring Core Web Vitals entirely.

🔍 Check Your WordPress CLS Score Right Now

Free technical audit — CLS, LCP, TTFB, PageSpeed and 80+ signals in one scan

Run Free Audit at ToolXray →

Related Articles

🖼️

Fix WordPress LCP

LCP and CLS are the two most impactful Core Web Vitals. Fix both together for maximum Page Experience score improvement.

Fix INP in WordPress

INP is the third Core Web Vital. After fixing CLS and LCP, INP is the final piece of a perfect Core Web Vitals score.

🚀

WordPress Speed Optimization

CLS fixes improve layout stability. Speed optimization improves overall load performance — do both for PageSpeed 90+ scores.

⏱️

Why TTFB Is Critical in 2026

Fast TTFB gives the browser more time to complete layout before user interaction — directly reducing CLS risk.

📊

How to Use PageSpeed Insights

Learn to read every section of PageSpeed Insights — the tool you will use most to diagnose and verify CLS fixes.

🔬

Complete Technical SEO Audit

CLS is one signal in a full audit. Run all 80+ checks after fixing your Core Web Vitals to catch everything else.

Frequently Asked Questions

❓ What is a good CLS score for WordPress?
Google’s threshold for a “good” CLS score is under 0.1. Between 0.1 and 0.25 is classified as “needs improvement,” and above 0.25 is “poor.” For competitive SEO, aim for under 0.05 — this puts you in the top tier of CLS performance and gives you a meaningful Page Experience advantage over competitors in the 0.1–0.25 range. Most WordPress sites that have not specifically addressed CLS sit between 0.1 and 0.4 due to unoptimised images, font loading, and ad injection. The fixes in this guide typically bring scores from the 0.2–0.4 range down to under 0.1.
❓ Does WordPress CLS affect SEO rankings directly?
Yes, directly. CLS is one of Google’s three Core Web Vitals signals, which are confirmed ranking factors as part of the Page Experience update. Google uses field data from the Chrome User Experience Report to classify pages as “good,” “needs improvement,” or “poor” for CLS. Pages classified as “good” receive a positive Page Experience ranking signal. Pages classified as “poor” receive a negative signal. The magnitude of the ranking impact is not enormous on its own — it is a tiebreaker signal rather than a dominant factor — but in competitive niches where other signals are equal between sites, CLS can be the difference between page one and page two rankings.
❓ Why is my WordPress CLS score different on mobile vs desktop?
Mobile and desktop CLS scores differ because the layout behavior of many WordPress elements changes significantly between screen sizes. Ads that are fixed-width on desktop may reflow on mobile and cause different shift patterns. Cookie banners may behave differently on smaller screens. Images that have correct dimensions on desktop may have CSS overrides on mobile that remove the dimension constraints. PageSpeed Insights tests both separately — always check your CLS score on both views and fix each independently. Mobile CLS is generally harder to fix because responsive CSS can override the dimension declarations that fix desktop CLS.
❓ How long does it take for CLS fixes to show in Google Search Console?
Google Search Console Core Web Vitals field data is based on a 28-day rolling window of real Chrome user data. After implementing CLS fixes, it takes up to 28 days for the report to fully reflect the improvement — but you will typically see the trend moving in the right direction within 1–2 weeks. Lab data in PageSpeed Insights reflects your fixes immediately. If PageSpeed Insights shows improvement but GSC still shows “poor” — the fixes are working, you just need to wait for enough real user sessions to accumulate in the new scoring window.
❓ Can a caching plugin help fix WordPress CLS?
Caching plugins do not directly fix CLS — they improve load speed, which helps the browser complete layout faster, but they do not address the root causes of layout shift like missing image dimensions or late-injected ads. However, LiteSpeed Cache and WP Rocket both include CSS optimization features that can help — specifically, inlining critical CSS ensures layout-critical styles are applied before the page renders, which prevents some font and layout-related CLS. The direct CLS fixes (image dimensions, font-display, ad containers, cookie banner positioning) must be implemented separately from your caching setup.

    Leave a Comment

    Your email address will not be published. Required fields are marked *

    Scroll to Top