What does Google say about SEO? /
Quick SEO Quiz

Test your SEO knowledge in 5 questions

Less than a minute. Find out how much you really know about Google search.

🕒 ~1 min 🎯 5 questions

Official statement

John Mueller highlighted the Nuvemshop study published on web.dev to illustrate a common pitfall: the idea that customizable layouts can distort the element the browser measures as LCP. Teams believed they were optimizing the right LCP element, but CSS transitions on carousels delayed detection by the browser, which then identified a lower banner in the page as the real LCP.
His point of view: before optimizing an element identified as the LCP (the hero image), you must first verify that the browser actually treats it as such. Otherwise, all optimization work could focus on the wrong element, as it was the case for Nuvemshop for a time.
📅
Official statement from (15 days ago)
TL;DR

Browsers can identify a different LCP element than the one you are trying to optimize, especially due to CSS transitions that delay detection. At Nuvemshop, carousels with animations masked the hero image, causing the browser to measure a secondary banner as the real LCP. Before doing any optimization work, check which element the browser actually considers as LCP using field tools.

What you need to understand

Why can the browser identify the wrong LCP element?

The Largest Contentful Paint (LCP) measures the loading time of the largest visible element in the initial viewport. But here lies the trap: you do not decide which element will be measured, the browser does. And its detection logic can be skewed by complex CSS effects, especially transitions and animations on carousels.

At Nuvemshop, the teams had identified their hero image as the obvious LCP candidate. However, CSS transitions applied to carousels significantly delayed the appearance of this image to the point where the browser ignored it and identified a banner positioned lower on the page instead. As a result, all optimization efforts were directed at the wrong element, with no measurable impact on the score.

How do customizable layouts worsen the problem?

E-commerce platforms and CMS often offer modular content blocks that merchants can freely rearrange. This flexibility creates variability in the DOM structure, complicating the prediction of the actual LCP. An element placed at the top of the page in HTML can end up visually secondary after styles are applied.

Entry animations (fade-in, slide-in) add a layer of complexity: the browser considers that an element is only visible when it is fully rendered. If your hero takes 300ms to appear via a CSS transition, and a static banner loads in the meantime, that banner will be measured instead. The rendering timing becomes critical.

What is the difference between perceived LCP and measured LCP?

The perceived LCP corresponds to the element that you, as a human, identify as the most visually important—often the hero image or the main visual. The measured LCP is the one that the browser records in its Core Web Vitals metrics, the one that appears in CrUX and determines your score.

These two elements do not always coincide. CSS rules (opacity, visibility, transform), poorly calibrated native lazy loading images, or improperly sized flex/grid containers can shift the measurement cursor. That's why real-world debugging tools (RUM, field data) are essential: lab data will never capture all user configuration variations.

  • Always check which element the browser actually measures as LCP before any optimization, using DevTools or the CrUX dashboard.
  • CSS transitions (opacity, transform, visibility) can delay the detection of an element and skew the identification of the real LCP.
  • Customizable layouts multiply possible DOM configurations, making the prediction of LCP riskier without field validation.
  • The perceived LCP (your hero image) is not always the LCP measured by the browser (sometimes a secondary banner).
  • Field data tools (RUM, CrUX) are the only guarantees of what is actually measured in production, not isolated lab audits.

SEO Expert opinion

Is this recommendation really new for practitioners?

Let’s be honest: any SEO seriously working on Core Web Vitals since their rollout knows they need to check the actual LCP element before optimizing. This is not a revelation. However, the Nuvemshop case illustrates a pitfall I still regularly see on the field: teams optimizing the logical element (the hero image) without validating what the browser actually measures.

What’s missing from Mueller's statement is a comprehensive list of causes for the discrepancy between perceived and measured LCP. CSS transitions are a known vector, but what about improperly sized flex containers? Images in lazy loading with poorly calibrated intersection observers? Web fonts delaying the rendering of the LCP text? [To be verified]: Google does not clearly document all CSS patterns that can skew detection.

Are current tools sufficient to diagnose these discrepancies?

Chrome DevTools (Performance tab, LCP panel) give a first indication, but they remain confined to the lab. The real arbiter is the Chrome User Experience Report (CrUX), which aggregates real field data. Problem: CrUX provides medians over 28 days, leading to a huge feedback delay when you want to test a fix.

Third-party RUM solutions (SpeedCurve, Cloudflare Observatory, Sentry Performance) partially fill this gap by providing segmented real-time data by device, region, and even page version. But they require a budget and technical integration. For small sites, the risk remains to work in the dark with Lighthouse audits that reflect only an isolated case of use.

What use cases escape this verification logic?

On sites with simple editorial content (blogs, media), the LCP element is often predictable: the illustration image of the article. Here, the risk of discrepancy is low unless you deploy an interstitial ad that takes up 80% of the initial viewport. In that case, the ad becomes the LCP, and optimizing the article image serves no purpose.

One-page sites (landing, SaaS homepage) with little DOM variation are also less exposed. However, as soon as you have A/B tests that modify the structure of the page, or conditional blocks based on user segments, variability explodes. A static audit will never capture all configurations. That’s when RUM becomes essential, but Google never says it outright.

Practical impact and recommendations

How to identify the LCP element actually measured by the browser?

Open Chrome DevTools, go to the Performance tab, and record a page load. Look for the "Largest Contentful Paint" event in the timeline: it will display the exact DOM element measured. Compare it to what you thought was the LCP. If it doesn’t match, you have a detection issue.

For large-scale diagnostics, use the CrUX dashboard (BigQuery or API) to retrieve field data on your origin. Cross-reference with RUM tools if you have them. If the median LCP is poor but your hero image loads fast in the lab, it's likely that the browser is measuring something else in production. Segment by device (mobile/desktop) and by page: LCP can vary by templates.

What technical errors most often skew LCP detection?

CSS transitions (opacity:0 with fade-in via JavaScript) are the number one trap. If your hero element takes 200-300ms to become visible after DOM readiness, the browser may have already identified another candidate. Remove these animations, or switch them to will-change and transform to optimize rendering.

Native lazy loading (loading='lazy') applied to an image above-the-fold artificially delays its loading. The browser loads it too late and measures a secondary element in the meantime. Switch to eager or preload it using link rel='preload'. Lastly, containers without explicit dimensions (no width/height on the image or container) cause reflows that delay visual stability and skew the LCP timing.

Should we audit every page variation or focus on critical templates?

First, focus on high-traffic pages: homepage, flagship product pages, category pages. These are the ones that weigh the most in the aggregated CrUX score of your origin. If you manage a platform with customizable layouts, isolate the most frequent configurations and audit them individually. A generic audit won’t tell you anything.

If your site offers A/B tests or conditional blocks, segment RUM data by variant. One variant may have a perfect LCP, while another could be catastrophic, and you’ll never see it in a global median. This is tedious, but it’s the only way to avoid working on the wrong element. These optimizations can quickly become complex, particularly on modular architectures or custom CMSs. If you lack internal expertise or the right monitoring tools, it may be wise to consult a specialized SEO agency for a thorough diagnostic and tailored support.

  • Record a Performance profile in DevTools and check which element is marked as the actual LCP.
  • Cross-reference lab data (Lighthouse, WebPageTest) with field data (CrUX, RUM) to detect discrepancies.
  • Remove CSS transitions (opacity, visibility) on candidate LCP elements above-the-fold.
  • Never apply loading='lazy' on an image located in the initial viewport.
  • Define explicit width/height on all image containers to avoid reflows.
  • Segment your audits by template, device, and A/B test variant if your architecture is modular.
Before optimizing an LCP element, always validate that it is indeed the one measured by the browser in production. CSS transitions, poorly calibrated lazy loading, and customizable layouts are the main causes of discrepancies between perceived LCP and real LCP. Prioritize field data (CrUX, RUM) over isolated lab audits for reliable diagnostics.

❓ Frequently Asked Questions

Comment savoir si mon LCP est faussé par des transitions CSS ?
Enregistrez un profil Performance dans DevTools et comparez l'élément marqué LCP avec votre image hero. Si ce n'est pas le même, inspectez les règles CSS (opacity, visibility, transform) appliquées à votre hero au chargement.
Le CrUX suffit-il pour diagnostiquer un décalage de LCP ?
Le CrUX donne une médiane globale utile, mais il ne segmente pas par variant de page ou configuration utilisateur. Pour un diagnostic fin, croisez avec un outil RUM qui capture les éléments LCP réels par session.
Les animations JavaScript (GSAP, Framer Motion) posent-elles le même problème que les transitions CSS ?
Oui, si elles retardent l'affichage visible de l'élément. Le navigateur considère qu'un élément n'est candidat LCP que lorsqu'il est complètement rendu. Évitez les animations sur les éléments above-the-fold critiques.
Peut-on forcer le navigateur à mesurer un élément LCP spécifique ?
Non, la logique de détection LCP est définie par la spec et implémentée par le navigateur. Vous pouvez seulement optimiser la structure et le CSS pour que l'élément souhaité soit le plus grand et le plus rapide à charger.
Faut-il auditer le LCP sur mobile et desktop séparément ?
Absolument. Le viewport, les images servies (responsive) et les performances réseau diffèrent. Un élément peut être LCP sur mobile mais pas sur desktop, et inversement. Segmentez toujours vos analyses par device.
🏷 Related Topics
Domain Age & History Content AI & SEO Images & Videos JavaScript & Technical SEO Web Performance

Related statements

💬 Comments (0)

Be the first to comment.

2000 characters remaining
🔔

Get real-time analysis of the latest Google SEO declarations

Be the first to know every time a new official Google statement drops — with full expert analysis.

No spam. Unsubscribe in one click.