Largest Contentful Paint (LCP)

Compatibilidade com navegadores

  • 77
  • 79
  • 122
  • x

Origem

A Largest Contentful Paint (LCP) é uma métrica estável das Core Web Vitals para medir a velocidade de carga percebida. Ele marca o ponto na linha do tempo de carregamento da página em que o conteúdo principal provavelmente foi carregado. Uma LCP rápida ajuda a garantir ao usuário que a página é útil.

Historicamente, os desenvolvedores da Web têm enfrentado um desafio para medir a velocidade com que o conteúdo principal de uma página da Web carrega e fica visível para os usuários. Métricas mais antigas, como load ou DOMContentLoaded, não funcionam bem porque não correspondem necessariamente ao que o usuário vê na tela. Além disso, as métricas de desempenho mais recentes e centradas no usuário, como a Primeira exibição de conteúdo (FCP, na sigla em inglês), capturam apenas o início da experiência de carregamento. Se uma página mostrar uma tela de apresentação ou um indicador de carregamento, esse momento não será muito relevante para o usuário.

No passado, recomendamos métricas de desempenho, como Primeira exibição significativa (FMP, na sigla em inglês) e Índice de velocidade (SI) (ambos disponíveis no Lighthouse) para ajudar a capturar mais da experiência de carregamento após a exibição inicial, mas essas métricas são complexas, difíceis de explicar e muitas vezes erradas, o que significa que ainda não identificam quando o conteúdo principal da página foi carregado.

Com base em discussões no W3C Web Performance Working Group e em pesquisas feitas no Google, descobrimos que uma maneira mais precisa de medir quando o conteúdo principal de uma página é carregado é observar quando o maior elemento é renderizado.

O que é LCP?

A LCP informa o tempo de renderização da maior imagem ou bloco de texto visível na janela de visualização em relação ao momento em que o usuário navegou pela primeira vez à página.

O que é uma boa pontuação de LCP?

Para oferecer uma boa experiência do usuário, os sites precisam ter uma LCP de 2,5 segundos ou menos. Para garantir que essa meta seja atingida para a maioria dos usuários, um bom limite é o 75o percentil de carregamentos de página, segmentado em dispositivos móveis e computadores.

Os valores bons de LCP são de 2,5 segundos ou menos, os valores ruins são maiores do que 4,0 segundos e qualquer valor entre eles precisa ser melhorado
Um bom valor de LCP é de 2,5 segundos ou menos.

Quais elementos são considerados?

Conforme especificado na API Largest Contentful Paint, os tipos de elementos considerados para a Maior exibição de conteúdo são:

Restringir os elementos a esse conjunto limitado foi intencional para reduzir a complexidade. Elementos adicionais (como o suporte completo a <svg>) poderão ser adicionados no futuro, conforme mais pesquisas forem realizadas.

Além de considerar apenas alguns elementos, as medições da LCP usam heurísticas para excluir determinados elementos que os usuários provavelmente consideram "não conteúdo". Para navegadores baseados no Chromium, incluem:

  • Elementos com opacidade 0, o que os torna invisíveis ao usuário.
  • Elementos que cobrem a janela de visualização completa e que provavelmente são elementos de plano de fundo.
  • Imagens de marcador de posição ou outras imagens com baixa entropia, que provavelmente não refletem o verdadeiro conteúdo da página.

É provável que os navegadores continuem melhorando essas heurísticas para garantir que correspondam às expectativas do usuário sobre qual é o maior elemento contentful.

Essas heurísticas de "conteúdo" são diferentes das usadas pela FCP, que pode considerar alguns desses elementos, como imagens de marcador de posição ou imagens de janela de visualização completa, mesmo que não possam ser candidatos à LCP. Apesar de ambos usarem "conteúdo" no nome, o objetivo dessas métricas é diferente. A FCP mede quando qualquer conteúdo é exibido na tela, enquanto a LCP mede quando o conteúdo principal é pintado.

Como o tamanho de um elemento é determinado?

O tamanho do elemento informado para LCP normalmente é o tamanho visível para o usuário na janela de visualização. Se o elemento se estender para fora da janela de visualização, ou se algum elemento for recortado ou tiver um overflow não visível, essas partes não serão contabilizadas no tamanho do elemento.

Para elementos de imagem redimensionados do tamanho intrínseco, o tamanho informado é o visível ou o intrínseco, o que for menor.

Para elementos de texto, a LCP considera apenas o menor retângulo que pode conter todos os nós de texto.

Em todos os elementos, a LCP não considera margens, preenchimentos ou bordas aplicados usando CSS.

.

Quando a LCP é informada?

As páginas da Web geralmente são carregadas em etapas e, como resultado, o maior elemento da página pode mudar durante o carregamento.

Para lidar com esse potencial de mudança, o navegador envia uma PerformanceEntry do tipo largest-contentful-paint identificando o maior elemento de conteúdo assim que o navegador mostra o primeiro frame. Depois de renderizar os frames subsequentes, ele envia outro PerformanceEntry sempre que o maior elemento de conteúdo muda.

Por exemplo, em uma página com texto e uma imagem principal, o navegador pode renderizar inicialmente apenas o texto e enviar uma entrada largest-contentful-paint cuja propriedade element faz referência a <p> ou <h1>. Depois que a imagem principal termina de carregar, uma segunda entrada largest-contentful-paint é enviada, com uma propriedade element referenciando o <img>.

Um elemento só pode ser considerado o maior elemento de conteúdo depois de ser renderizado e visível para o usuário. As imagens que ainda não foram carregadas não são consideradas "renderizadas". Os nós de texto também não usam fontes da Web durante o período de bloqueio das fontes. Nesses casos, um elemento menor pode ser informado como o maior elemento de conteúdo, mas assim que o elemento maior termina a renderização, outro PerformanceEntry é criado.

Além do carregamento tardio de imagens e fontes, uma página pode adicionar novos elementos ao DOM à medida que novos conteúdos são disponibilizados. Se algum desses novos elementos for maior que o maior elemento de conteúdo anterior, um novo PerformanceEntry será criado.

Se o maior elemento de conteúdo for removido da janela de visualização ou mesmo do DOM, ele continuará sendo o maior elemento de conteúdo, a menos que um elemento maior seja renderizado.

O navegador deixa de informar novas entradas assim que o usuário interage com a página (com um toque, uma rolagem ou um pressionamento de tecla), porque a interação do usuário geralmente muda o que está visível para ele (especialmente ao rolar a tela).

Para fins de análise, informe apenas o PerformanceEntry enviado mais recentemente ao seu serviço de análise.

Tempo de carregamento versus tempo de renderização

Por motivos de segurança, o carimbo de data/hora de renderização das imagens não é exposto para imagens de origem cruzada que não tenham o cabeçalho Timing-Allow-Origin. Em vez disso, apenas o tempo de carregamento, que outras APIs já expõem, ficará disponível.

Isso pode levar à situação aparentemente impossível em que a LCP é informada pelas APIs da Web como anterior à FCP. Isso ocorre apenas por causa dessa restrição de segurança e não representa o que está realmente acontecendo.

Sempre que possível, recomendamos definir o cabeçalho Timing-Allow-Origin para tornar as métricas mais precisas.

Como as mudanças de layout e tamanho do elemento são processadas?

Para manter baixa a sobrecarga de desempenho relacionada ao cálculo e ao envio de novas entradas de desempenho, as mudanças no tamanho ou na posição de um elemento não geram novos candidatos à LCP. Somente o tamanho e a posição iniciais do elemento na janela de visualização são considerados.

Isso significa que as imagens que são inicialmente renderizadas fora da tela e depois passam por ela podem não ser informadas. Isso também significa que os elementos inicialmente renderizados na janela de visualização que são empurrados para fora da visualização ainda informam o tamanho inicial na janela de visualização.

Exemplos

Confira alguns exemplos de quando a Maior exibição de conteúdo ocorre em alguns sites conhecidos:

Linha do tempo da Largest Contentful Paint em cnn.com
Uma linha do tempo da LCP de cnn.com.
Linha do tempo da Largest Contentful Paint em techcrunch.com
Uma linha do tempo da LCP de techcrunch.com.

Em ambas as linhas do tempo, o maior elemento (destacado em verde) muda conforme o conteúdo é carregado. No primeiro exemplo, um novo conteúdo é adicionado ao DOM, alterando qual elemento é o maior. No segundo exemplo, o layout muda, removendo um maior elemento de conteúdo anterior da janela de visualização.

Geralmente, o conteúdo de carregamento tardio é maior do que o conteúdo que já está na página, mas não é necessariamente o caso. Os próximos dois exemplos mostram a LCP acontecendo antes da página ser totalmente carregada.

Linha do tempo de &quot;Maior exibição de conteúdo&quot; do instagram.com
Um cronograma da LCP de instagram.com.
Linha do tempo da Largest Contentful Paint do google.com
Um cronograma da LCP de google.com.

No primeiro exemplo, o logotipo do Instagram é carregado relativamente cedo e permanece o maior elemento, mesmo à medida que outro conteúdo é adicionado. No exemplo da página de resultados da Pesquisa Google, o maior elemento é um parágrafo de texto exibido antes de qualquer uma das imagens ou do logotipo terminar de carregar. Como cada imagem individual é menor que esse parágrafo, ela continua sendo o maior elemento durante todo o processo de carregamento.

Como medir a LCP

A LCP pode ser medida no laboratório ou no campo e está disponível nas seguintes ferramentas:

Ferramentas de campo

Ferramentas de laboratório

Medir a LCP no JavaScript

Para medir a LCP em JavaScript, use a API Maior Contentful Paint. O exemplo a seguir mostra como criar um PerformanceObserver que detecta entradas largest-contentful-paint e as registra no console.

new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    console.log('LCP candidate:', entry.startTime, entry);
  }
}).observe({type: 'largest-contentful-paint', buffered: true});

No exemplo anterior, cada entrada largest-contentful-paint registrada representa o candidato à LCP atual. Em geral, o valor startTime da última entrada emitida é o valor da LCP. No entanto, nem todas as entradas largest-contentful-paint são válidas para medir a LCP.

A seção a seguir lista as diferenças entre o que a API informa e como a métrica é calculada.

Diferenças entre a métrica e a API

  • A API envia entradas largest-contentful-paint para páginas carregadas em uma guia em segundo plano, mas essas páginas precisam ser ignoradas no cálculo da LCP.
  • A API continua enviando entradas largest-contentful-paint depois que uma página fica em segundo plano, mas essas entradas precisam ser ignoradas no cálculo da LCP. Os elementos só podem ser considerados se a página ficou em primeiro plano o tempo todo.
  • A API não informa entradas largest-contentful-paint quando a página é restaurada do cache de avanço e retorno, mas a LCP precisa ser medida nesses casos porque os usuários as veem como visitas distintas à página.
  • A API não considera os elementos dentro de iframes, mas a métrica faz isso porque eles fazem parte da experiência do usuário na página. Em páginas com uma LCP em um iframe, por exemplo, uma imagem do pôster em um vídeo incorporado, isso será exibido como uma diferença entre o CrUX e o RUM. Para medir a LCP corretamente, você deve incluir iframes. Os subframes podem usar a API para informar as entradas largest-contentful-paint ao frame pai para agregação.
  • A API mede a LCP desde o início da navegação. Para páginas pré-renderizadas, meça a LCP de activationStart, porque ele corresponde ao tempo de LCP conforme a experiência do usuário.

Em vez de memorizar todas essas diferenças sutis, recomendamos que os desenvolvedores usem a biblioteca JavaScript web-vitals para medir a LCP, que processa a maioria dessas diferenças para você. Ele não cobre o problema do iframe.

import {onLCP} from 'web-vitals';

// Measure and log LCP as soon as it's available.
onLCP(console.log);

Consulte o código-fonte de onLCP() para ver um exemplo completo de como medir a LCP em JavaScript.

E se o elemento maior não for o mais importante?

Em alguns casos, os elementos mais importantes da página não são iguais aos maiores. Por isso, os desenvolvedores podem estar mais interessados em medir os tempos de renderização desses outros elementos. Isso é possível usando a API Element Timing, conforme descrito no artigo sobre métricas personalizadas.

Como melhorar a LCP

Um guia completo sobre como otimizar a LCP está disponível para orientar você no processo de identificação de tempos de LCP no campo e como usar dados de laboratório para detalhar e otimizá-los.

Outros recursos

Registro de alterações

Às vezes, bugs são descobertos nas APIs usadas para medir as métricas e, às vezes, nas definições das próprias métricas. Por isso, às vezes é necessário fazer alterações, que podem aparecer como melhorias ou regressões nos seus relatórios e painéis internos.

Para ajudar você a gerenciar isso, todas as mudanças na implementação ou definição dessas métricas são exibidas neste registro de alterações.

Se você tiver feedback sobre essas métricas, envie-o no Grupo do Google web-vitals-feedback.