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.
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.
LCP bueno
El umbral verde de Google. El objetivo para la mayoría de las páginas
Necesita mejoras
Zona amarilla: el usuario nota el LCP y hay que optimizarlo
LCP malo
Zona roja: daño significativo para la UX y el posicionamiento
Percentil de CrUX
Google evalúa el LCP en el percentil 75 de los usuarios reales de Chrome
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.
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.
| Componente | Qué mide | Proporción habitual |
|---|---|---|
| TTFB (Time to First Byte) | Tiempo hasta que llega el primer byte del HTML desde el servidor | 10–40 % |
| Resource Load Delay | Intervalo entre el TTFB y el momento en que empieza a cargarse el recurso del LCP | 10–30 % |
| Resource Load Duration | Tiempo de descarga del propio recurso del LCP (imagen, fuente) | 30–60 % |
| Element Render Delay | Intervalo entre la finalización de la carga del recurso y su aparición en el viewport | 0–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.
- Configura la caché HTTP: Cache-Control: max-age=31536000 para los recursos estáticos y s-maxage para los proxies de CDN.
- 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.
- Conecta un CDN: Cloudflare, Fastly, BunnyCDN. En sitios estáticos, la caché en el edge reduce el TTFB a 20–50 ms.
- Optimiza la base de datos: índices en los campos que más se consultan y caché de consultas con Redis o Memcached.
- Usa HTTP/2 o HTTP/3: varias peticiones por una única conexión, sin bloqueo head-of-line.
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.
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 recurso | Problema | Solución |
|---|---|---|
| JavaScript en <head> | El navegador detiene el análisis del HTML y ejecuta el script | defer o async en todos los scripts no críticos |
| CSS en <head> | El navegador no pinta nada hasta que se carga todo el CSS | CSS crítico en línea y loadCSS asíncrono para los estilos no críticos |
| Scripts de terceros | Analítica, bots de chat y píxeles que se cargan en <head> | Mover al body o cargar con retraso (setTimeout 3000) |
| Fuentes sin preload | El 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.
- 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.
- Usa <link rel="preload" as="font" type="font/woff2" crossorigin> para las fuentes críticas en <head>.
- Limita el juego de caracteres: usa subsetting para cargar solo los glifos necesarios (latino, cirílico).
- 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.
- 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.
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).
| Herramienta | Tipo de datos | Qué ofrece | Cuándo usarla |
|---|---|---|---|
| PageSpeed Insights | Laboratorio + campo (CrUX) | Puntuación del LCP, desglose por subcomponentes y recomendaciones concretas | Auditoría inicial y verificación de cambios |
| Chrome DevTools Performance | Laboratorio | Cascada de carga, causa exacta del retraso del LCP, gráfico de llamas | Diagnóstico en profundidad de un problema concreto |
| Lighthouse CI | Laboratorio | Comprobaciones automáticas en CI/CD e historial del LCP por versión | Control de regresiones |
| WebPageTest | Laboratorio | Pruebas desde varias regiones, comparación en vídeo, filmstrip y cascada | Verificació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 incidencias | Monitorización en producción |
| web-vitals.js | Campo | API de JavaScript para recoger el LCP de usuarios reales en una analítica propia | Monitorizació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.
- Abre DevTools → Performance, pulsa Record, recarga la página y detén la grabación.
- En Timings, busca el marcador del LCP: muestra el tiempo exacto y el elemento.
- Analiza la cascada: localiza el recurso del elemento del LCP y comprueba cuándo empezó a cargarse respecto al TTFB.
- Busca las barras rojas: son recursos que bloquean el renderizado y aparecen justo antes del LCP.
- En la pestaña Network, filtra por tipo Image, localiza la imagen del LCP y comprueba su prioridad (debe ser High).
- 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.
Preguntas frecuentes
¿Por qué el LCP sale en «verde» en PageSpeed Insights y en «rojo» en Search Console?
¿Se puede mejorar el LCP sin tocar el código?
¿Qué pasa si el LCP es texto y no una imagen?
¿El LCP influye directamente en el posicionamiento?
¿Hay que optimizar el LCP en todas las páginas o solo en la página de inicio?
Check it with SpiderHead
Free and local: run the audit on your own machine.



