Telles Logo
Pular para o conteúdo
Ver todos os artigos
out 24, 2023
·
••• views
·
••• likes
·
10 min

Core Web Vitals: LCP, INP e CLS na Prática

Entenda como cada Core Web Vital é calculado, quais são os thresholds, o que os move e como identificar e corrigir problemas reais.

Os Core Web Vitals são três métricas definidas pelo Google para medir a qualidade real da experiência do usuário. Fazem parte do Page Experience signal e influenciam o ranking no Search desde 2021.

Não confunda "boas métricas no Lighthouse" com "bons Core Web Vitals". O Lighthouse roda em condições de laboratório controladas. Os CWV que o Google usa para ranking vêm do Chrome User Experience Report (CrUX) — dados reais de usuários reais, em dispositivos e conexões reais.

As três métricas medem dimensões diferentes da experiência:

⏱️LCP — Velocidade

Largest Contentful Paint: quando o maior elemento visível terminou de carregar. É a métrica mais próxima de "quando a página parece pronta".

👆INP — Responsividade

Interaction to Next Paint: quanto tempo entre uma interação do usuário e o próximo frame pintado refletindo essa interação.

📐CLS — Estabilidade

Cumulative Layout Shift: quanto o conteúdo "pula" durante o carregamento. Botões que se movem, texto que se desloca.


LCP — Largest Contentful Paint

LCP mede quando o maior elemento de conteúdo visível na viewport terminou de renderizar.

🖼️O que é candidato a LCP

Imagens (img, background-image, image em SVG), elementos video (via poster) e blocos de texto (headings, parágrafos). O browser rastreia o maior e atualiza conforme novos elementos aparecem.

🛑Quando o LCP para de ser rastreado

Na primeira interação do usuário (scroll, clique, teclado). O valor final é o último elemento que apareceu antes dessa interação — elementos que chegam depois não afetam o LCP.

  • ≤ 2.5s — Bom

    75% dos usuários precisam estar nessa faixa para o site ter CWV verde no Search Console.

  • 2.5s – 4.0s — Precisa melhorar

    Experiência degradada. Usuários mobile em conexões lentas provavelmente estão nessa faixa.

  • > 4.0s — Ruim

    Impacto negativo em ranking, bounce rate e conversão. Ação urgente necessária.

O que move o LCP

O browser precisa encontrar a imagem LCP o mais cedo possível no HTML. Se for injetada via JS ou CSS, só é descoberta após esses arquivos serem baixados e executados — tarde demais.

<!-- ✅ Descoberta imediata — está no HTML -->
<img src="/hero.jpg" fetchpriority="high" alt="Hero" />
 
<!-- ❌ Descoberta tardia — só aparece após JS executar -->
<div id="hero"></div>
<script>document.getElementById('hero').innerHTML = '<img src="/hero.jpg">'</script>

INP — Interaction to Next Paint

INP mede a responsividade da página — quanto tempo entre uma interação do usuário e o próximo frame pintado refletindo essa interação. Em março de 2024 substituiu o FID como Core Web Vital. A diferença fundamental: o FID media apenas o delay do primeiro input. O INP mede todas as interações e reporta o percentil 98.

  • ≤ 200ms — Bom

    Interação percebida como imediata. O usuário não sente latência.

  • 200ms – 500ms — Precisa melhorar

    Latência perceptível. Usuários em dispositivos lentos ou com muitas interações simultâneas sentem a demora.

  • > 500ms — Ruim

    Página percebida como travada. Alta correlação com abandono de formulários e cliques duplos acidentais.

Como o INP é calculado

Cada interação tem três fases que somadas formam o INP:

⏳Input delay

Tempo entre o evento físico e o início do event handler. Causado por long tasks bloqueando o main thread quando o usuário interage.

⚙️Processing time

Tempo de execução do event handler em si. Handlers pesados com muita lógica ou manipulação de DOM contribuem aqui.

🎨Presentation delay

Tempo do browser para calcular layout, estilo e pintar o frame após o handler terminar.

O que causa INP alto

Uma long task é qualquer tarefa que bloqueia o main thread por mais de 50ms. Durante ela, o browser não consegue processar eventos de input — o clique do usuário fica na fila.

// ❌ Long task — bloqueia o main thread
function processLargeList(items) {
  return items.map(item => heavyComputation(item));
}
 
// ✅ Yield para o browser entre chunks
async function processLargeList(items) {
  const results = [];
  for (const item of items) {
    results.push(heavyComputation(item));
    await scheduler.yield(); // deixa o browser respirar
  }
  return results;
}

CLS — Cumulative Layout Shift

CLS mede a estabilidade visual — quanto o conteúdo "pula" enquanto carrega. Um botão que se move quando o usuário está prestes a clicar, texto que se desloca quando uma imagem carrega sem dimensão definida.

  • ≤ 0.1 — Bom

    Layout estável. Usuário não percebe movimento inesperado de conteúdo.

  • 0.1 – 0.25 — Precisa melhorar

    Shifts perceptíveis. Botões e links se movem o suficiente para causar cliques errados.

  • > 0.25 — Ruim

    Layout instável. Alta probabilidade de cliques acidentais e experiência frustrante.

Causas mais comuns

  • Imagens sem dimensão definida

    O browser não sabe o tamanho antes de baixar. Quando a imagem carrega, empurra todo o conteúdo abaixo. Fix: sempre defina width e height — o browser calcula o aspect-ratio automaticamente e reserva o espaço.

  • Anúncios e embeds sem espaço reservado

    Slots de anúncios que aparecem do nada são os maiores contribuintes de CLS em produção. Reserve o espaço com min-height antes do anúncio carregar.

  • Fontes web causando FOUT

    Quando a fonte web substitui o fallback, o tamanho do texto pode mudar e causar shift. Use size-adjust no font-face do fallback para aproximar as métricas tipográficas.

  • Conteúdo dinâmico acima de conteúdo existente

    Banners de cookies, toasts e notificações que aparecem no topo empurram conteúdo para baixo. Use posição fixa ou reserve o espaço antecipadamente.

  • Animações nas propriedades erradas

    Animar top, left, margin ou height causa reflow e pode gerar CLS. Use transform: translate() — não afeta o layout, roda só no compositor.


Teste seus valores

Agora que você conhece as três métricas e seus thresholds, simule os valores reais do seu site. Arraste cada slider e veja instantaneamente o diagnóstico — com os mesmos critérios que o Google usa para Page Experience.

Como obter seus valores reais

Acesse o PageSpeed Insights para o seu domínio. Na seção "Descubra o que seus usuários reais estão experienciando", você encontra o p75 de LCP, INP e CLS dos últimos 28 dias — esses são os valores que o Google usa para ranking.

Verificador de Core Web Vitals

0 de 3 no verde
LCP⚠️ Precisa melhorar

Largest Contentful Paint

3.5s
0≤ 2.5s bom≤ 4.0s6.0s
INP⚠️ Precisa melhorar

Interaction to Next Paint

320ms
0≤ 200ms bom≤ 500ms1000ms
CLS⚠️ Precisa melhorar

Cumulative Layout Shift

0.18
0≤ 0.10 bom≤ 0.250.50

Arraste os sliders para simular seus valores reais


Como debugar Core Web Vitals

Identificou um problema no checker acima? Use essas ferramentas para encontrar a causa raiz:

Abra o DevTools e acesse a aba Performance. Grave uma sessão e procure por:

Long tasks marcadas em vermelho — impacto direto no INP. Layout shifts marcados na linha "Experience" — impacto direto no CLS. O LCP candidate é identificado automaticamente na linha "Timings".

O painel Performance Insights (More tools) oferece análise automática com sugestões contextuais — melhor ponto de entrada para quem está começando.


No próximo artigo, exploramos Entrega & Rendering — CDN, estratégias de render (SSR, SSG, ISR, Streaming), lazy loading, resource hints e compressão.

As minhas notas

Selecione um trecho e use Destacar no menu (somente neste aparelho).

Artigos relacionados