LCP: como otimizar o Largest Contentful Paint

Como diagnosticar o elemento LCP, o seu recurso e o caminho de entrega, e depois verificar as melhorias na rota afetada com dados de campo e de laboratório.

O Largest Contentful Paint (LCP) é a métrica dos Core Web Vitals que influencia o ranqueamento no Google desde 2021. Não é só um número técnico: ele mostra com que rapidez o usuário percebe a página como carregada. Um LCP ruim significa que o visitante vê uma tela em branco ou uma imagem principal que não carregou, e sai antes de o conteúdo aparecer.

Linha do tempo do carregamento: o LCP é registrado no instante em que o maior elemento da área visível é exibido. A meta é ficar na faixa verde, abaixo de 2,5 s.
Segundo o Google, melhorar o LCP de “ruim” para “bom” reduz a taxa de rejeição em média 24%. Em sites de e-commerce, isso afeta diretamente a conversão.

O que é LCP e por que ele importa

O LCP mede o tempo entre o início da navegação e o momento em que o maior elemento de conteúdo (texto ou imagem) fica visível na área de visualização. Esse é o limite que o Google usa para considerar o carregamento “concluído” do ponto de vista da experiência do usuário.

Diferente do FCP (First Contentful Paint), que é registrado no primeiro pixel, o LCP acompanha especificamente o conteúdo relevante. Uma página pode mostrar um indicador de carregamento em 0,3 s, mas, se a imagem principal aparecer em 5 s, o LCP será de 5 s.

< 2,5 s

LCP bom

Limite verde do Google. A meta para a maioria das páginas

2,5–4 s

Precisa melhorar

Faixa amarela: o LCP é perceptível ao usuário e precisa de otimização

> 4 s

LCP ruim

Faixa vermelha: prejuízo significativo para a UX e para o ranqueamento

75º

Percentil do CrUX

O Google avalia o LCP no 75º percentil dos usuários reais do Chrome

O Google usa os dados do Chrome User Experience Report (CrUX), que são medições reais de usuários reais do Chrome. O seu PageSpeed Insights pode mostrar verde no laboratório enquanto o CrUX mostra amarelo. Use os dados de campo do CrUX: são eles que o Google usa nas decisões de ranqueamento.

Quais elementos o navegador considera candidatos a LCP

O navegador não acompanha todos os elementos da página. Ele observa tipos específicos e, quando o carregamento termina, escolhe o maior deles por área dentro da área visível.

Elementos <img>
Imagens comuns. É o candidato a LCP mais frequente na maioria das páginas. O tempo é o momento em que a imagem decodificada aparece na área visível.
<image> dentro de SVG
Imagens dentro de elementos SVG. Para fins de LCP, são tratadas do mesmo jeito que os elementos img comuns.
background-image no CSS
Imagens de fundo definidas via CSS. Ponto importante: o navegador não começa a carregar um background-image antes de construir o CSSOM. Essa é uma das principais fontes de atraso do LCP.
Blocos de texto
Elementos <p>, <h1>–<h6>, <div> e outros com conteúdo de texto. Se um bloco de texto for maior que qualquer imagem, ele se torna o LCP.
<video> com poster
O quadro de pôster de um elemento de vídeo (atributo poster). Se o vídeo ocupa a maior parte da tela, o poster precisa carregar o mais rápido possível.
Elementos dentro de <iframe> e elementos sem tamanho visual (display: none, visibility: hidden, opacity: 0) não são contados como LCP. Se o seu banner principal estiver oculto até a inicialização do JS, o LCP pode ser medido em um elemento completamente diferente.

Como o tempo de LCP se divide

O Google divide o LCP em 4 subcomponentes. Entender cada um é essencial para diagnosticar corretamente e definir a prioridade das otimizações.

ComponenteO que medeParticipação típica
TTFB (Time to First Byte)Tempo até o primeiro byte do HTML chegar do servidor10–40%
Resource Load DelayIntervalo entre o TTFB e o início do carregamento do recurso do LCP10–30%
Resource Load DurationTempo para baixar o próprio recurso do LCP (imagem, fonte)30–60%
Element Render DelayIntervalo entre o fim do carregamento do recurso e a sua aparição na área visível0–20%

Regra: ataque o componente com a maior participação. Se o TTFB ocupa 3 dos 5 s do LCP, otimizar imagens terá efeito mínimo. Primeiro, melhore o tempo de resposta do servidor.

Principais causas de LCP lento

90% dos LCP ruins têm as mesmas causas principais. O diagnóstico leva 15 minutos no DevTools ou no PageSpeed Insights.

TTFB lento

O servidor responde em mais de 600 ms. Causas: falta de cache, hospedagem fraca, consultas pesadas ao banco de dados e ausência de CDN. Com TTFB acima de 800 ms, atingir LCP abaixo de 2,5 s é quase impossível sem outras otimizações.

Imagens não otimizadas

A imagem do LCP pesa mais de 500 KB em JPEG, em vez de 80 KB em WebP/AVIF. Não há o atributo fetchpriority="high" nem preload. O navegador descobre a imagem tarde e a carrega devagar.

Recursos que bloqueiam a renderização

CSS e JS no <head> sem async/defer bloqueiam a renderização. Até o navegador carregar e executar esses arquivos, o elemento do LCP não aparece. Cada script extra no head adiciona atraso.

Carregamento lento de fontes

Se o LCP for um bloco de texto e a fonte demorar 2 s ou mais para carregar, o navegador mostra FOIT (texto invisível) ou FOUT (fonte do sistema). O tempo até o texto correto aparecer é o próprio LCP.

Lazy load no elemento do LCP

O atributo loading="lazy" na imagem principal da seção hero é um dos erros mais comuns. O navegador adia o carregamento de propósito, e isso atinge diretamente o LCP.

LCP na renderização no cliente

Em SPAs (React, Vue, Angular) sem SSR, o conteúdo é gerado no navegador via JavaScript. O navegador recebe um HTML vazio, carrega o JS e só então renderiza o conteúdo. Toda essa cadeia se acumula no LCP.

Como otimizar o LCP: um plano passo a passo

A otimização do LCP não é um truque único, e sim um conjunto de melhorias interligadas. Trabalhe em sequência, começando pelos itens de maior impacto.

Passo 1: reduza o TTFB para 200–400 ms

O TTFB é a base. Se o servidor for lento, todas as outras otimizações esbarram nesse limite.

  1. Configure o cache HTTP: Cache-Control: max-age=31536000 para arquivos estáticos e s-maxage para proxies de CDN.
  2. Ative a compressão: Brotli (preferido) ou gzip para HTML, CSS e JS. O Brotli gera arquivos 15–25% menores que o gzip.
  3. Conecte uma CDN: Cloudflare, Fastly, BunnyCDN. Em sites estáticos, o cache na borda reduz o TTFB para 20–50 ms.
  4. Otimize o banco de dados: índices nos campos mais consultados e cache de consultas via Redis ou Memcached.
  5. Use HTTP/2 ou HTTP/3: várias requisições por uma única conexão, sem head-of-line blocking.
Meta de TTFB: menos de 200 ms com servidor + CDN. Se você tiver Nginx + HTML estático + CDN, isso é viável. Se tiver PHP/Node sem cache e com consultas ao banco em tempo real, primeiro é preciso otimizar no nível da aplicação.

Passo 2: otimize a imagem do LCP

Se o elemento do LCP for uma imagem (banner principal, foto de produto), esta é uma otimização de alto retorno.

  • Converta para formatos modernos: WebP (economia de 25–35% em relação ao JPEG) ou AVIF (40–55% em relação ao JPEG). Use <picture> com um fallback.
  • Adicione fetchpriority="high" à imagem do LCP: o navegador vai carregá-la com prioridade máxima.
  • Remova loading="lazy" do elemento do LCP. O lazy load só é indicado para imagens abaixo da primeira dobra da tela.
  • Adicione <link rel="preload" as="image"> no <head> para a imagem do LCP: o navegador começa o carregamento antes de o body ser analisado.
  • Defina os atributos width e height para evitar CLS. O navegador reserva o espaço antes de a imagem carregar.
  • Configure srcset e sizes para carregamento responsivo: no celular, a imagem será de 400 px em vez de 1600 px.
A combinação de fetchpriority="high" + preload + WebP/AVIF + srcset bem configurado gera, em média, 1–2 segundos de melhoria no LCP em projetos reais de e-commerce.

Passo 3: elimine recursos que bloqueiam a renderização

Cada recurso que bloqueia a renderização adiciona atraso ao LCP. A meta: nenhum recurso bloqueante no caminho crítico.

Tipo de recursoProblemaSolução
JavaScript no <head>O navegador interrompe a análise do HTML e executa o scriptdefer ou async em todos os scripts não críticos
CSS no <head>O navegador não renderiza nada até todo o CSS carregarCSS crítico inline + loadCSS assíncrono para os estilos não críticos
Scripts de terceirosAnalytics, chats e pixels carregados no headMover para o body ou carregar com atraso (setTimeout 3000)
Fontes sem preloadO navegador só descobre a fonte depois de analisar o CSS<link rel="preload" as="font"> + font-display: swap

Passo 4: otimize as fontes, se o LCP for um texto

Quando o elemento do LCP é um bloco de texto (título, lead), o problema costuma ser o atraso na renderização da fonte.

  1. Adicione font-display: swap ou optional no @font-face. O navegador mostra a fonte do sistema na hora e troca pela personalizada quando ela carregar.
  2. Use <link rel="preload" as="font" type="font/woff2" crossorigin> para as fontes críticas no <head>.
  3. Limite o conjunto de caracteres: use subsetting para carregar apenas os glifos necessários (latino, cirílico).
  4. Hospede as fontes no próprio servidor, em vez de carregá-las do Google Fonts. Isso elimina uma consulta DNS e uma conexão extras.
  5. Configure size-adjust, ascent-override e descent-override no @font-face para reduzir o CLS na troca da fonte.

Passo 5: SSR/SSG para frameworks JavaScript

Se o site roda em React, Vue ou Next.js sem SSR, o LCP tende a ser alto por padrão: o navegador precisa baixar e executar o JavaScript e só então renderizar o conteúdo.

Server-Side Rendering (SSR)
O HTML é gerado no servidor a cada requisição. O navegador recebe o HTML pronto, faz a análise e o elemento do LCP aparece sem esperar pelo JS. É a melhor opção para conteúdo dinâmico.
Static Site Generation (SSG)
O HTML é gerado no momento do build. O servidor entrega um arquivo pronto, com TTFB e LCP no máximo de velocidade. Ideal para blogs, landing pages e páginas sem personalização.
Incremental Static Regeneration (ISR)
SSG com regeneração periódica (Next.js). Combina a velocidade dos arquivos estáticos com a atualidade dos dados. Ótimo para a maioria dos conteúdos de CMS.
Streaming SSR
O servidor começa a enviar o HTML antes de terminar a renderização, e o navegador exibe o conteúdo progressivamente. React 18 + Next.js 13+ oferecem isso e funcionam sem configuração adicional.
Hidratação parcial e Islands Architecture (Astro, Qwik) são uma abordagem ainda mais eficiente: só os componentes interativos são hidratados, e o conteúdo estático é renderizado na hora. Em sites com muito conteúdo, isso gera um ganho de 0,5–1 s no LCP.

Passo 6: background-image em CSS como LCP

Se o elemento do LCP usa background-image via CSS, o navegador não consegue começar a carregá-lo antes de construir o CSSOM. É uma das causas mais traiçoeiras de LCP lento.

  • Troque o background-image do CSS por <img fetchpriority="high">: o navegador a descobre durante a análise do HTML.
  • Se a troca não for possível, use <link rel="preload" as="image"> para iniciar o carregamento manualmente.
  • Para fundos responsivos, use imagesrcset e imagesizes na tag de preload.
  • Mova o CSS que contém o background-image do LCP para um <style> inline. Isso elimina uma requisição de rede.

Ferramentas para medir e diagnosticar o LCP

Diagnóstico correto importa mais do que otimizar às cegas. Use os dois tipos de ferramenta: Lab (testes sintéticos) e Field (usuários reais).

FerramentaTipo de dadosO que ofereceQuando usar
PageSpeed InsightsLab + Field (CrUX)Pontuação do LCP, detalhamento por subcomponente, recomendações específicasAuditoria inicial, verificação de mudanças
Chrome DevTools PerformanceLabWaterfall de carregamento, causa exata do atraso do LCP, flame chartDiagnóstico detalhado de um problema específico
Lighthouse CILabVerificações automatizadas no CI/CD, histórico do LCP por releaseControle de regressão
WebPageTestLabTestes a partir de várias regiões, comparação em vídeo, filmstrip, waterfallVerificação de CDN e do LCP regional
Google Search Console (CWV)Field (CrUX)LCP real por grupos de URLs, páginas com problemasMonitoramento em produção
web-vitals.jsFieldAPI JavaScript para coletar o LCP de usuários reais no seu próprio analyticsMonitoramento personalizado, RUM

Como diagnosticar o LCP no Chrome DevTools

O DevTools é a ferramenta mais precisa para entender o que está atrasando o LCP em uma página específica.

  1. Abra o DevTools → Performance → clique em Record, recarregue a página e pare a gravação.
  2. Em Timings, encontre o marcador de LCP: ele mostra o tempo exato e o elemento.
  3. Analise o waterfall: encontre o recurso do elemento do LCP e veja quando o carregamento dele começou em relação ao TTFB.
  4. Observe as barras vermelhas: são recursos que bloqueiam a renderização. Elas aparecem logo antes do LCP.
  5. Na aba Network, filtre por tipo Image, encontre a imagem do LCP e confira a prioridade (deve ser High).
  6. Na aba Coverage, veja o CSS e o JS não utilizados. Muito código não utilizado = atraso no LCP.
Na aba Network do DevTools, a imagem do LCP deve mostrar: Priority: High, Initiator: Preload ou Parser (não um script). Se o Initiator for um script ou XHR, a imagem está sendo descoberta tarde demais.

Perguntas frequentes

O LCP está “verde” no PageSpeed Insights, mas “vermelho” no Search Console. Por quê?
O PageSpeed Insights mostra dados de laboratório (Lighthouse) e dados de campo (CrUX). Se aparecer verde, provavelmente você está vendo a pontuação do Lighthouse. O CrUX no PSI e no Search Console reflete usuários reais do Chrome, que podem ter conexões lentas, aparelhos mais antigos ou outras geolocalizações. Use sempre os dados de campo (CrUX), pois são eles que o Google usa para o ranqueamento.
Dá para melhorar o LCP sem mexer no código?
Parcialmente, sim. Conectar uma CDN, configurar o cache HTTP e ativar a compressão Brotli são mudanças de configuração do servidor. Converter imagens para WebP/AVIF e comprimi-las também não exige mexer no código do site. Mas fetchpriority, preload, remover o lazy load do hero e SSR exigem alterações no código.
E se o LCP for texto, e não uma imagem?
Foque nas fontes e no TTFB. Adicione preload para a fonte web, use font-display: swap e hospede as fontes no próprio servidor. Se o texto estiver em um bloco grande sem CSS crítico, garanta que o CSS que afeta esse bloco não bloqueie a renderização. Também verifique o TTFB: mesmo sem imagem, um servidor lento significa LCP alto.
O LCP influencia o ranqueamento diretamente?
Sim. O LCP faz parte dos Core Web Vitals, o sinal de Page Experience que o Google usa oficialmente como fator de ranqueamento desde 2021. Um LCP ruim não derruba o ranqueamento da noite para o dia, mas, em igualdade de condições, um site com LCP bom leva vantagem. O efeito é mais visível no celular.
Preciso otimizar o LCP em todas as páginas ou só na home?
Priorize as páginas com muito tráfego orgânico e as páginas de destino do tráfego pago. O Google Search Console mostra quais URLs têm LCP “Ruim”: comece por elas. Home, páginas de categoria e cards de produto em e-commerce costumam ser as primeiras da fila. As melhorias técnicas (fontes, CDN, Brotli) se aplicam a todo o site.

Check it with SpiderHead

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

Try it