Cumulative Layout Shift
WordPress CLS vs Next.js: Why Your Page Jumps and How to Make It Stop
A visitor reaches for the Call Now button. A cookie banner slides in above it, the page drops a few rows, and the thumb lands on a blog teaser instead. That small betrayal has a name, layout shift, and WordPress stacks produce it in six predictable ways.
October 9, 2026 · 10 min read
The short answer
WordPress pages shift when images lack dimensions, ads and embeds load without reserved space, web fonts swap in late, scripts make headers sticky or inject bars, cookie banners push content down, and builder animations move layout. Next.js requires image dimensions, self-hosts fonts with matched fallbacks and renders the header in the HTML. WordPress owners can fix most causes by reserving space.
On this page
How Google scores a jump
Every time a visible element moves without being asked, the browser records a layout shift score: the share of the viewport affected multiplied by how far things moved, as a share of the viewport's largest dimension. Google's CLS documentation on web.dev groups shifts into bursts, called session windows, where each shift follows the last by less than one second and the whole window lasts five seconds at most. Your CLS is the worst burst of the visit, not the first one.
Google calls 0.1 or less good and anything above 0.25 poor, measured at the 75th percentile of page loads on mobile and desktop. To feel the scale, take a hypothetical phone page where a banner pushes everything in view down by a quarter of the screen. The whole viewport is affected and the distance is a quarter, so that single shift scores about 0.25, two and a half times the good line.
- Shifts you cause do not count. Movement within 500 milliseconds of a tap, click or key press is treated as expected. Opening an accordion is fine.
- Scrolling is not an excuse. It does not count as that kind of input, so a header that jumps while you scroll still scores.
- Transforms are free. Moving or scaling an element with a CSS transform does not create a layout shift. Changing its top, left or margin does.
- The whole visit counts. CLS is tracked for the life of the page, which is why lab tests that stop after load often miss the worst shifts.
The Core Web Vitals overview covers lab versus field data in general. Here we stay with one question: what moves, and why.
Six ways a WordPress page learns to jump
Images that arrive without a size
Without width and height, the browser reserves no room for an image until the file arrives, then shoves everything below it down. Since version 5.5, WordPress back-fills width and height on content images, but only when the image is a media library attachment carrying its wp-image class. Images in custom HTML blocks, images pulled from another domain and builder modules that write their own markup can all slip through.
Ads, embeds and widgets with no seat saved
An ad slot rarely knows its size until the auction ends. A video or map iframe pasted without a sized wrapper starts tiny. Review carousels, social feeds and booking widgets are usually injected by script after the page has painted. Google's guidance notes that late content near the top of the viewport causes the biggest shifts, which is exactly where marketing teams like to put it.
Fonts that swap in late
With font swapping, the browser shows text in a fallback font, then redraws it when the web font lands. If the two fonts differ in width or line height, paragraphs rewrap and everything below moves. A font served from Google's servers usually arrives later than a local one. Theme settings help with the timing: Astra, Kadence, OceanWP and Neve all offer local Google Fonts hosting. Arriving sooner is not the same as matching, though, so a mismatched fallback can still shift.
Headers that change shape after load
A sticky header built in JavaScript often starts as a normal element, then switches to fixed positioning once you scroll. The moment it leaves the page flow, the content beneath jumps up by the header's height unless a spacer takes its place. Announcement bars and top strips inserted above the header after load push the whole page down. Some themes get this right in CSS: Kadence and Blocksy switch between desktop and mobile headers with media queries in their stylesheets, not with a script after paint.
Cookie banners that push instead of float
A consent banner inserted at the top of the page, in the normal flow, moves everything beneath it. The same banner fixed to the bottom of the screen as an overlay moves nothing. Which one you get depends on the consent plugin and its settings, not on your theme.
Builder animations and styles that land late
Entrance effects that slide sections in by changing margins or positions are layout shifts with good intentions. Late styling does the same at page scale: Hello Elementor's support forum has reports of a flash of unstyled content across several sites running Elementor Pro, and a page that restyles itself after painting reflows. Critical CSS can cause a quieter version. Divi and Avada both generate critical CSS and defer the rest; if the critical slice misses a rule above the fold, things move when the full stylesheet arrives. Avada's own update notes tell owners to rebuild critical CSS after major updates.
Space reserved in code: what Next.js does before anyone asks
Next.js does not have a magic layout-shift switch. It has components that make the stable choice the required one, and a build that refuses some unstable choices outright.
Images must declare their shape
The next/image component needs a width and height, read automatically from images imported into the code and set by hand for remote ones, or a fill mode inside a sized container. The framework's docs say the dimensions are used to infer the aspect ratio so the browser can reserve space.
Fonts with a matched stand-in
next/font self-hosts font files and, by default for Google fonts, generates an adjusted fallback font to reduce layout shift, so the swap moves text less, if at all.
Headers that exist from the first byte
The header lives in a shared layout and arrives in the prerendered HTML. There is no script deciding what it looks like after the page has already painted.
Embeds as components
Videos, maps and widgets are written as components with sized wrappers, once, and every page that uses them inherits the reserved space.
To be fair, a Next.js site can shift too. Content fetched in the browser without a placeholder of the right size will push the page. A fill image inside a container with no height collapses. Ad networks, consent tools and third-party widgets behave the same on any framework. What changes is who decides: on a custom Next.js build, one developer reviews the sizing once, in one template, instead of every plugin vendor making the call separately.
Six causes, two stacks, one table
| How it shows up on WordPress | Next.js default | Fix on WordPress | |
|---|---|---|---|
| Unsized images | Builder modules, custom HTML and remote images without dimensions | Dimensions required by next/image | Add width and height, or an aspect-ratio rule |
| Ads and embeds | Slots and iframes injected with no reserved height | Sized wrapper components | A min-height or aspect-ratio on every container |
| Late fonts | Remote fonts swapping over a mismatched fallback | Self-hosted fonts with an adjusted fallback | Local fonts, a preload, a closer fallback |
| Sticky or injected headers | Scripts switching to fixed position, bars inserted on top | Header in the server-rendered layout | CSS sticky positioning, reserved space for bars |
| Cookie banners | Banner inserted at the top in the page flow | Overlay component, if the developer builds it so | A fixed overlay at the bottom of the screen |
| Builder animations | Entrance effects that animate margins and positions | No animation unless written, usually with transforms | Transform-only effects, none above the fold |
Notice that every fix in the right column is the same idea: tell the browser how much room something needs before it arrives. WordPress lets each vendor decide whether to do that. Next.js makes the developer decide, once.
The third option
Athena CMS, with AI agents on staff.
Not a theme and not a blank Next.js repo. The content system we put behind every custom site: plain fields, a real preview, every version kept, and AI agents that handle the chores a plugin only nags you about.
- PicassoImages
- ApolloSite analysis
- AresCompetitor watch
- PrometheusContent holes
- AtlasPage depth and structure
- DelphiAI search visibility
and 12 more agents. Two come with Athena; the rest are monthly add-ons.

Fixes that hold on a WordPress site
Most CLS problems on WordPress are fixable without a rebuild, and they tend to stay fixed if you check after each update. Our layout shift troubleshooting guide walks through diagnosis in more detail.
- 1
Find what moves
Search Console's Core Web Vitals report shows which URL groups fail. Chrome DevTools' Performance panel marks each layout shift and the elements involved. Record yourself scrolling too, not just loading.
- 2
Size every image
Check builder image modules, custom HTML blocks and logos for width and height. Give background sections a fixed aspect ratio.
- 3
Reserve slots for ads and embeds
Set a minimum height on ad containers equal to the most common size. Wrap videos and maps in a box with an aspect ratio, or use a click-to-load facade.
- 4
Calm the fonts
Host fonts locally, preload the one used above the fold, and pick a fallback with similar proportions. Google notes that the optional display rule can avoid a re-layout entirely.
- 5
Fix the header and banners
Prefer CSS sticky positioning to scripts that toggle fixed positioning. Float cookie banners at the bottom. Render top bars in the HTML, not after load.
- 6
Animate with transforms only
Switch entrance effects to fade and transform, and turn them off for anything visible on first load.
- 7
Retest after every update
A builder update can change image markup overnight. Rerun your checks on key templates after updates land.
If you would rather not spend a weekend in DevTools, our theme speed optimization service handles CLS fixes alongside the rest of the vitals, and a free website health check is a quick place to start.
Theme notes from the layout shift front
Themes differ less in CLS than in raw weight, because most shifts come from what you add. Still, a few details matter. Kadence and Blocksy switch headers in CSS, which removes one common source of jumps. Astra, Neve and OceanWP offer local font hosting, which narrows the swap window but does not match font metrics for you.
Builder themes carry more moving parts. Divi and Avada defer much of their CSS behind generated critical CSS, which speeds up the first paint and puts the burden of completeness on the generator. Avada also offers font-display choices and video facades, both useful here. Hello Elementor sites lean on Elementor for nearly all styling, so the unstyled-flash reports belong to the pairing. Flatsome's vendor says its new Site Builder, in beta as of October 2026, brings lower layout shift; treat that as a claim to test on your own pages, not a result.
A cookie banner that pushes the page down is asking for consent while taking away the button.
Keeping the layout still after launch day
CLS is the vital most often broken by content, not code. Someone pastes an embed into a post, uploads a logo without dimensions, or adds a seasonal banner above the header. On WordPress, nothing stands between that edit and your score. On the sites we build with Athena CMS, editors work in plain fields and the templates decide how each piece is laid out, with sizes set in code. Picasso makes sure images are described and sized, never missing, and Argus watches for slow pages after every change.
That is the pattern across all three metrics, covered alongside this page in WordPress vs Next.js for LCP and WordPress vs Next.js for INP, and argued in full on the WordPress vs Next.js comparison hub. If you want a second pair of eyes on your field data, our WordPress performance consulting starts there. If the answer is a move, the Next.js rebuild keeps your URLs and redirects every old one.
Questions people ask before they call
Lighthouse measures one page load on a simulated device and stops. Field CLS counts every shift for the whole visit, including sticky headers while scrolling, ads that fill late and banners that appear after a delay. Real phones also load fonts and scripts at different speeds. Trust the field data and use our PageSpeed Insights guide to read both halves of the report.
Not by itself. A lazy-loaded image with width and height has its space reserved, so nothing moves when it arrives. Lazy loading causes shifts when the image has no dimensions, or when a script-based lazy loader swaps a small placeholder for a differently shaped image. Fix the dimensions and lazy loading becomes harmless for CLS.
It trades one risk for another. Swap shows text immediately, which helps LCP, but the redraw can shift layout if the fallback font is shaped differently. Google suggests the optional display rule or a closer fallback to avoid the re-layout. Self-hosting and preloading the main font shortens the window either way. See theme fonts not loading if your fonts misbehave.
Yes. Content fetched in the browser without a sized placeholder, unsized ad slots, consent tools and third-party widgets can shift any page. Next.js makes the common cases hard to get wrong, since images need dimensions and fonts get adjusted fallbacks, but a developer still has to size what the framework cannot know about.
No, but unsized ad slots usually do. Reserve the height of the most common ad size in each slot, and avoid inserting ads above content that is already visible. A slot that sometimes stays empty costs some white space; a slot that expands after paint costs you the metric.
Keep reading
- Theme vs frameworkAstra vs Next.js: A Light Theme, a Heavy Stack and a Custom BuildAstra vs Next.js, row by row: the 2026 AI bundles, the 3-site Pro cap, Elementor and Spectra, real failure modes, and when Astra is still the smart buy.
- New owner, old questionKadence vs Next.js: A Block-First Theme Under New Owners, Against Custom CodeKadence vs Next.js after the Liquid Web shake-up: Kadence Blocks, the new $99 to $499 plans, known issues, and which businesses should stay or move.
- WordPress at its leanestGeneratePress vs Next.js: The Fairest Fight WordPress Can OfferGeneratePress vs Next.js, argued fairly: a sub-10kb theme, a $59 license for 500 sites, the coming template engine, and where a custom build still wins.
- A Customizer theme, weighedBlocksy vs Next.js: A Great Free Theme Against a Site With No Plugins at AllBlocksy vs Next.js compared on 22 rows: the free header builder, Companion and Pro, lifetime licenses, the 2.1.5x regressions and when to stay put.
- The Elementor stack, weighedHello Elementor vs Next.js: The Empty Theme and the Builder That Fills ItHello Elementor vs Next.js on 22 rows: the 6KB vs 30KB claims, Theme Builder dependency, Elementor's real weight, and when the builder is the right call.
- The developer's builderBricks Builder vs Next.js: The Best Case for Staying on WordPress, TestedBricks Builder vs Next.js on 22 rows: clean output, no jQuery, the $599 lifetime plan, 2.4 AI editing and its regressions, and where Next.js still wins.
- Everything in WordPress vs Next.jsSee the section
Find out what is moving on your pages
Send us your URL. We will trace your layout shifts to the elements causing them and tell you which fixes will stick, on WordPress or off it.
Which of these sounds like you? (pick any)
Rather talk now? Call (210) 346-0848.
