LCP: cómo optimizar el Largest Contentful Paint

Cómo diagnosticar el elemento LCP, su recurso y su ruta de entrega, y luego verificar las mejoras en la ruta afectada con datos de campo y de laboratorio.

El Largest Contentful Paint (LCP) es la métrica de Core Web Vitals que influye en el posicionamiento de Google desde 2021. No es solo un número técnico: refleja lo rápido que el usuario percibe que la página ha cargado. Un LCP malo significa que los visitantes ven una pantalla en blanco o una imagen principal sin cargar, y se van antes de que aparezca el contenido.

Cronología de carga: el LCP se registra en el momento en que se pinta el elemento más grande del viewport. El objetivo es quedar en la zona verde, por debajo de 2,5 segundos.
Según Google, pasar el LCP de «malo» a «bueno» reduce la tasa de rebote un 24 % de media. En las tiendas online, esto afecta directamente a la conversión.

Qué es el LCP y por qué importa

El LCP mide el tiempo desde el inicio de la navegación hasta que el elemento de contenido más grande (texto o imagen) se vuelve visible en el viewport. Es el umbral que Google usa para considerar que la carga ha terminado desde el punto de vista de la experiencia de usuario.

A diferencia del FCP (First Contentful Paint), que se dispara con el primer píxel, el LCP registra específicamente el contenido relevante. Una página puede mostrar un spinner a los 0,3 s, pero si la imagen principal aparece a los 5 s, el LCP es de 5 s.

< 2,5 s

LCP bueno

El umbral verde de Google. El objetivo para la mayoría de las páginas

2,5–4 s

Necesita mejoras

Zona amarilla: el usuario nota el LCP y hay que optimizarlo

> 4 s

LCP malo

Zona roja: daño significativo para la UX y el posicionamiento

75.º

Percentil de CrUX

Google evalúa el LCP en el percentil 75 de los usuarios reales de Chrome

Google usa los datos del Chrome User Experience Report (CrUX): mediciones reales de usuarios reales de Chrome. Tu puntuación de laboratorio en PageSpeed Insights puede salir en verde mientras CrUX muestra amarillo. Usa los datos de campo de CrUX: son los que Google emplea para decidir el posicionamiento.

Qué elementos considera el navegador candidatos a LCP

El navegador no registra todos los elementos: observa tipos concretos y, cuando termina la carga, selecciona el de mayor área dentro del viewport.

Elementos <img>
Imágenes estándar. El candidato a LCP más común en la mayoría de las páginas. Tiempo = momento en que la imagen decodificada aparece en el viewport.
<image> dentro de SVG
Imágenes dentro de elementos SVG. Para el LCP se tratan igual que los elementos img normales.
background-image de CSS
Imágenes de fondo mediante CSS. Matiz clave: el navegador no empieza a cargar una background-image hasta que se construye el CSSOM. Es una de las principales causas del retraso del LCP.
Bloques de texto
Elementos <p>, <h1>–<h6>, <div> y otros con contenido de texto. Si un bloque de texto es más grande que cualquier imagen, se convierte en el LCP.
<video> con poster
El fotograma del atributo poster de un elemento video. Si el vídeo ocupa la mayor parte de la pantalla, el poster debe cargar lo antes posible.
Los elementos dentro de un <iframe> y los elementos sin tamaño visual (display: none, visibility: hidden, opacity: 0) no cuentan para el LCP. Si tu banner principal se oculta antes de inicializar el JS, el LCP puede medirse sobre un elemento completamente distinto.

Cómo se divide el tiempo de LCP

Google descompone el LCP en 4 subcomponentes. Entender cada uno es clave para diagnosticar y priorizar las optimizaciones con precisión.

ComponenteQué mideProporción habitual
TTFB (Time to First Byte)Tiempo hasta que llega el primer byte del HTML desde el servidor10–40 %
Resource Load DelayIntervalo entre el TTFB y el momento en que empieza a cargarse el recurso del LCP10–30 %
Resource Load DurationTiempo de descarga del propio recurso del LCP (imagen, fuente)30–60 %
Element Render DelayIntervalo entre la finalización de la carga del recurso y su aparición en el viewport0–20 %

Regla: ataca el componente con mayor peso. Si el TTFB supone 3 de los 5 segundos del LCP, optimizar imágenes apenas tendrá efecto. Primero arregla el tiempo de respuesta del servidor.

Causas principales de un LCP lento

El 90 % de los LCP malos comparten las mismas causas raíz. El diagnóstico lleva 15 minutos en DevTools o en PageSpeed Insights.

TTFB lento

El servidor responde en más de 600 ms. Causas: falta de caché, hosting débil, consultas pesadas a la base de datos y ausencia de CDN. Con un TTFB superior a 800 ms, es casi imposible lograr un LCP inferior a 2,5 s sin otras optimizaciones.

Imágenes sin optimizar

La imagen del LCP pesa 500 KB o más en JPEG, cuando en WebP/AVIF pesaría 80 KB. No tiene el atributo fetchpriority="high" ni preload. El navegador descubre la imagen tarde y la carga despacio.

Recursos que bloquean el renderizado

El CSS y el JS en <head> sin async ni defer bloquean el renderizado. Hasta que el navegador no los carga y ejecuta, el elemento del LCP no puede aparecer. Cada script extra en head añade retraso.

Carga lenta de fuentes

Si el LCP es un bloque de texto y la fuente tarda 2 segundos o más en cargarse, el navegador muestra texto invisible (FOIT) o una fuente del sistema (FOUT). El tiempo hasta que aparece el texto correcto equivale al LCP.

Carga diferida en el elemento del LCP

El atributo loading="lazy" en la imagen principal es uno de los errores más comunes. El navegador aplaza la carga a propósito, lo que perjudica directamente al LCP.

LCP con renderizado en el cliente

En las SPA (React, Vue, Angular) sin SSR, el contenido se genera en el navegador mediante JavaScript. El navegador ve HTML vacío, carga el JS y luego renderiza el contenido. Toda esa cadena se acumula en el LCP.

Cómo optimizar el LCP: plan paso a paso

Optimizar el LCP no es un truco único, sino un conjunto de mejoras relacionadas entre sí. Trabaja en orden, empezando por las de mayor impacto.

Paso 1: reduce el TTFB a 200–400 ms

El TTFB es la base. Si el servidor es lento, todas las demás optimizaciones chocan contra ese techo.

  1. Configura la caché HTTP: Cache-Control: max-age=31536000 para los recursos estáticos y s-maxage para los proxies de CDN.
  2. Activa la compresión: Brotli (preferido) o gzip para HTML, CSS y JS. Brotli entrega archivos entre un 15 y un 25 % más pequeños que gzip.
  3. Conecta un CDN: Cloudflare, Fastly, BunnyCDN. En sitios estáticos, la caché en el edge reduce el TTFB a 20–50 ms.
  4. Optimiza la base de datos: índices en los campos que más se consultan y caché de consultas con Redis o Memcached.
  5. Usa HTTP/2 o HTTP/3: varias peticiones por una única conexión, sin bloqueo head-of-line.
Objetivo de TTFB: < 200 ms con servidor + CDN. Si tienes Nginx + HTML estático + CDN, es alcanzable. Si tienes PHP/Node sin caché y con consultas a la base de datos en tiempo real, primero necesitas optimizar a nivel de aplicación.

Paso 2: optimiza la imagen del LCP

Si el elemento del LCP es una imagen (principal, de producto), esta es una rama de optimización de alto retorno.

  • Pasa a formatos modernos: WebP (entre un 25 y un 35 % de ahorro frente a JPEG) o AVIF (entre un 40 y un 55 %). Usa <picture> con un respaldo.
  • Añade fetchpriority="high" a la imagen del LCP: el navegador la cargará con máxima prioridad.
  • Quita loading="lazy" del elemento del LCP. La carga diferida solo tiene sentido para imágenes que quedan debajo del primer viewport.
  • Añade <link rel="preload" as="image"> en <head> para la imagen del LCP: el navegador empieza a cargarla antes de que termine de analizarse el body.
  • Indica los atributos width y height para evitar el CLS. El navegador reserva el espacio antes de que cargue la imagen.
  • Configura srcset y sizes para una carga adaptada: en móvil se sirve una imagen de 400 px en lugar de una de 1600 px.
La combinación de fetchpriority="high" + preload + WebP/AVIF + srcset bien configurado ofrece una mejora media del LCP de 1–2 segundos en proyectos reales de comercio electrónico.

Paso 3: elimina los recursos que bloquean el renderizado

Cada recurso que bloquea el renderizado añade retraso al LCP. El objetivo: cero recursos bloqueantes en la ruta crítica.

Tipo de recursoProblemaSolución
JavaScript en <head>El navegador detiene el análisis del HTML y ejecuta el scriptdefer o async en todos los scripts no críticos
CSS en <head>El navegador no pinta nada hasta que se carga todo el CSSCSS crítico en línea y loadCSS asíncrono para los estilos no críticos
Scripts de tercerosAnalítica, bots de chat y píxeles que se cargan en <head>Mover al body o cargar con retraso (setTimeout 3000)
Fuentes sin preloadEl navegador descubre la fuente solo después de analizar el CSS<link rel="preload" as="font"> + font-display: swap

Paso 4: optimiza las fuentes (cuando el LCP es texto)

Cuando el elemento del LCP es un bloque de texto (título o entradilla), el problema suele ser el retraso en el renderizado de la fuente.

  1. Añade font-display: swap u optional a @font-face. El navegador muestra al instante la fuente del sistema y cambia a la personalizada cuando termina de cargar.
  2. Usa <link rel="preload" as="font" type="font/woff2" crossorigin> para las fuentes críticas en <head>.
  3. Limita el juego de caracteres: usa subsetting para cargar solo los glifos necesarios (latino, cirílico).
  4. Aloja las fuentes en tu propio servidor en lugar de cargarlas desde Google Fonts: así se elimina una búsqueda DNS y una conexión adicionales.
  5. Configura size-adjust, ascent-override y descent-override en @font-face para reducir el CLS durante el cambio de fuente.

Paso 5: SSR/SSG para frameworks de JavaScript

Si el sitio funciona con React, Vue o Next.js sin SSR, el LCP será alto por defecto: el navegador tiene que descargar y ejecutar el JavaScript antes de renderizar el contenido.

Renderizado en el servidor (SSR)
El HTML se genera en el servidor en cada petición. El navegador recibe el HTML ya listo, lo analiza y el elemento del LCP aparece sin esperar al JS. Es la mejor opción para contenido dinámico.
Generación de sitios estáticos (SSG)
El HTML se genera en el momento de la compilación. El servidor entrega un archivo ya listo, con la máxima velocidad de TTFB y LCP. Ideal para blogs, landing pages y páginas no personalizadas.
Regeneración estática incremental (ISR)
SSG con regeneración periódica (Next.js). Combina la velocidad de los archivos estáticos con la actualidad de los datos. Óptima para la mayoría del contenido de un CMS.
SSR en streaming
El servidor empieza a enviar el HTML antes de terminar el renderizado, así que el navegador muestra el contenido de forma progresiva. React 18 y Next.js 13+ lo soportan de serie.
La hidratación parcial y la arquitectura de islas (Astro, Qwik) son un enfoque aún más eficaz: solo hidratan los componentes interactivos y el contenido estático se muestra al instante. En sitios con mucho contenido, esto supone una mejora del LCP de 0,5–1 s.

Paso 6: background-image de CSS como LCP

Si el elemento del LCP usa una background-image de CSS, el navegador no puede empezar a cargarla hasta que se construye el CSSOM. Es una de las causas más traicioneras de un LCP lento.

  • Sustituye la background-image de CSS por <img fetchpriority="high">: el navegador la descubre durante el análisis del HTML.
  • Si no es posible sustituirla, usa <link rel="preload" as="image"> para iniciar la carga manualmente.
  • Para fondos adaptables, usa imagesrcset e imagesizes en la etiqueta preload.
  • Mueve el CSS que contiene la background-image del LCP a un <style> en línea: así se elimina una petición de red.

Herramientas para medir y diagnosticar el LCP

Un diagnóstico correcto importa más que optimizar a ciegas. Usa los dos tipos de herramientas: de laboratorio (pruebas sintéticas) y de campo (usuarios reales).

HerramientaTipo de datosQué ofreceCuándo usarla
PageSpeed InsightsLaboratorio + campo (CrUX)Puntuación del LCP, desglose por subcomponentes y recomendaciones concretasAuditoría inicial y verificación de cambios
Chrome DevTools PerformanceLaboratorioCascada de carga, causa exacta del retraso del LCP, gráfico de llamasDiagnóstico en profundidad de un problema concreto
Lighthouse CILaboratorioComprobaciones automáticas en CI/CD e historial del LCP por versiónControl de regresiones
WebPageTestLaboratorioPruebas desde varias regiones, comparación en vídeo, filmstrip y cascadaVerificación de la CDN y LCP por región
Google Search Console (CWV)Campo (CrUX)LCP real por grupos de URL y páginas con incidenciasMonitorización en producción
web-vitals.jsCampoAPI de JavaScript para recoger el LCP de usuarios reales en una analítica propiaMonitorización a medida, RUM

Cómo diagnosticar el LCP en Chrome DevTools

DevTools es la herramienta más precisa para entender qué frena exactamente el LCP en una página concreta.

  1. Abre DevTools → Performance, pulsa Record, recarga la página y detén la grabación.
  2. En Timings, busca el marcador del LCP: muestra el tiempo exacto y el elemento.
  3. Analiza la cascada: localiza el recurso del elemento del LCP y comprueba cuándo empezó a cargarse respecto al TTFB.
  4. Busca las barras rojas: son recursos que bloquean el renderizado y aparecen justo antes del LCP.
  5. En la pestaña Network, filtra por tipo Image, localiza la imagen del LCP y comprueba su prioridad (debe ser High).
  6. En la pestaña Coverage verás el CSS y el JS sin usar. Una gran cantidad de código sin usar significa retraso del LCP.
En Network de DevTools, la imagen del LCP debería mostrar: Priority: High, Initiator: Preload o Parser (no un script). Si el Initiator es un script o un XHR, la imagen se descubre demasiado tarde.

Preguntas frecuentes

¿Por qué el LCP sale en «verde» en PageSpeed Insights y en «rojo» en Search Console?
PageSpeed Insights muestra datos de laboratorio (Lighthouse) y datos de campo (CrUX). Si sale en verde, es posible que estés mirando la puntuación de Lighthouse. Los datos de CrUX en PSI y en Search Console reflejan a usuarios reales de Chrome, que pueden tener conexiones lentas, dispositivos antiguos o ubicaciones geográficas distintas. Usa siempre los datos de campo o CrUX: son los que Google usa para el posicionamiento.
¿Se puede mejorar el LCP sin tocar el código?
En parte, sí. Conectar un CDN, configurar la caché HTTP o activar la compresión Brotli son cambios de configuración del servidor. Convertir las imágenes a WebP/AVIF y comprimirlas tampoco requiere cambiar el código del sitio. Pero fetchpriority, preload, quitar la carga diferida de la imagen principal y el SSR sí requieren cambios de código.
¿Qué pasa si el LCP es texto y no una imagen?
Céntrate en las fuentes y en el TTFB. Añade preload para la fuente web, usa font-display: swap y aloja las fuentes en tu servidor. Si el texto está en un bloque grande sin CSS crítico, asegúrate de que el CSS que afecta a ese bloque no bloquee el renderizado. Revisa también el TTFB: aunque no haya imágenes, un servidor lento significa un LCP alto.
¿El LCP influye directamente en el posicionamiento?
Sí. El LCP forma parte de Core Web Vitals, la señal de experiencia de página que Google usa oficialmente como factor de posicionamiento desde 2021. Un LCP malo no hunde el posicionamiento de un día para otro, pero, en igualdad de condiciones, un sitio con buen LCP tiene ventaja. El efecto se nota sobre todo en móviles.
¿Hay que optimizar el LCP en todas las páginas o solo en la página de inicio?
Empieza por las páginas con mucho tráfico orgánico y por las landing pages del tráfico de pago. Google Search Console muestra qué URL tienen un LCP «malo»: empieza por ahí. En comercio electrónico, lo habitual es empezar por la página de inicio, las páginas de categoría y las tarjetas de producto. Las mejoras técnicas (fuentes, CDN, Brotli) se aplican a todo el sitio.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it