Performance
CLS alto: como encontrar e corrigir mudanças inesperadas de layout
Diagnostique Cumulative Layout Shift em imagens, fontes, banners, anúncios e conteúdo assíncrono sem esconder movimentos causados pela própria interação.
Leitura executiva
Principais conclusões
- O elemento que se move é diferente do elemento que causou o movimento.
- Defina dimensões ou proporção para imagens, vídeos e iframes.
- Reserve espaço para banners e conteúdo assíncrono.
- Teste sessões longas e interações, não apenas o carregamento inicial.
Cumulative Layout Shift (CLS) mede mudanças inesperadas de posição ao longo da visita. O problema não é simplesmente uma página que se move. É o conteúdo mudar sem aviso enquanto a pessoa lê, aponta, clica ou preenche uma tarefa.
O limite recomendado é 0,1 no percentil 75. Como deslocamentos podem acontecer depois do carregamento, um teste curto pode não capturar consentimento tardio, anúncio renovado, fonte, recomendação personalizada ou componente aberto durante a jornada.
Diferencie vítima e causa
Ferramentas costumam destacar o elemento que se moveu. Ele pode ser apenas a vítima. Se um banner é inserido acima do título, o título, o texto e o botão se deslocam, mas o causador foi o banner.
Para cada evento, registre:
- elemento deslocado;
- elemento inserido, removido ou redimensionado;
- momento;
- ação do usuário próxima;
- área afetada;
- valor do shift;
- template e dispositivo.
O painel de Performance do Chrome e a visualização de layout shifts ajudam a reproduzir a sequência.
Defina dimensões para imagens e mídia
Quando o navegador conhece largura e altura, consegue reservar a proporção antes de baixar o arquivo:
<img
src="/produto.webp"
width="800"
height="600"
alt="Produto visto de frente"
>
CSS responsivo continua possível:
img {
max-width: 100%;
height: auto;
}
Use o mesmo princípio em vídeo, iframe, mapa e embed. Quando a proporção varia, use contêiner com aspect-ratio coerente.
Não reserve um retângulo arbitrário apenas para zerar a métrica. Espaço vazio excessivo também prejudica a experiência.
Reserve espaço para conteúdo assíncrono
Banners de consentimento, mensagens de frete, avaliações, recomendações, anúncios e alertas podem chegar depois do conteúdo principal.
Escolha uma estratégia:
- reservar altura mínima baseada no conteúdo provável;
- usar overlay quando não cobrir controles ou conteúdo essencial;
- inserir abaixo da área já lida;
- renderizar skeleton com dimensões finais;
- substituir conteúdo dentro de um contêiner estável;
- adiar módulos não essenciais até fora do viewport.
Skeleton que muda de altura ao receber conteúdo apenas troca um shift por outro. Modele o estado final.
Não insira promoções acima do conteúdo
Uma faixa promocional injetada no topo depois do carregamento desloca toda a página. Se a campanha é necessária, renderize o espaço desde a resposta inicial ou use uma posição que não reordene o conteúdo já visível.
Cuidados semelhantes valem para:
- aviso de aplicativo;
- barra de frete;
- alerta de localização;
- pesquisa de satisfação;
- mensagem de login;
- atualização de preço.
Analise o ganho comercial do componente junto ao custo de instabilidade. A solução pode ser mudança de posição, não remoção.
Estabilize o carregamento de fontes
Fontes web podem alterar largura, altura e quebra de linha quando substituem a fonte inicial. O título cresce, um botão desce e o restante da página se move.
Reduza o risco:
- use famílias de fallback com métricas próximas;
- carregue apenas pesos necessários;
- faça subset de caracteres quando apropriado;
- sirva fontes com cache adequado;
- antecipe a fonte realmente crítica;
- use ajustes de métricas como
size-adjustquando o projeto exigir; - teste idioma, negrito e conteúdo longo.
font-display influencia quando a troca acontece, mas não elimina sozinho diferença métrica.
Evite medir layout durante mudanças
Padrões de layout thrashing alternam leitura e escrita no DOM, causando recalculações e estados intermediários. Agrupe leituras, depois escritas. Prefira classes e estilos que produzam a geometria final de uma vez.
Componentes que medem altura após montar podem piscar entre estados. Quando possível, derive dimensões do CSS ou forneça dados suficientes no servidor.
Animações e interações esperadas
Mudanças diretamente associadas a uma interação recente podem ser tratadas de forma diferente pela métrica. Isso não autoriza interfaces que fazem o usuário perder o contexto.
Um accordion pode expandir depois do clique, mas deve:
- manter foco previsível;
- não deslocar o controle para fora de alcance;
- preservar leitura;
- respeitar
prefers-reduced-motion; - usar animação que não bloqueie interação.
Para movimento visual sem recalcular layout, propriedades como transform e opacity costumam ser mais adequadas. Teste acessibilidade e composição.
Investigue anúncios e embeds
Slots de anúncio variam de tamanho e podem atualizar durante a sessão. Defina tamanhos aceitos, reserve o maior espaço razoável por breakpoint e evite colapsar o slot imediatamente quando não houver anúncio.
Embeds sociais e vídeos também chegam com dimensões próprias. Use wrapper estável e valide o estado de erro. Se o fornecedor muda o tamanho depois de carregar, considere isolamento ou alternativa de clique para carregar.
Capture shifts depois do carregamento
Teste uma jornada, não apenas a primeira dobra:
- carregue a página;
- aguarde consentimento e terceiros;
- role lentamente;
- abra menus, filtros e accordions;
- altere orientação ou largura;
- simule conteúdo longo;
- espere atualizações assíncronas;
- navegue como usuário recorrente.
Dados de campo próprios ajudam a identificar URLs e componentes que geram shifts tardios. Preserve privacidade e agregue resultados.
Evite correções cosméticas
Ocultar overflow pode impedir que o deslocamento seja visível sem resolver a causa. Fixar alturas enormes pode cortar conteúdo ou criar espaços vazios. Desativar módulos no teste e mantê-los em produção não melhora usuários reais.
A correção precisa preservar conteúdo, responsividade e acessibilidade.
Exemplo de ação verificável
Observação: após 1,5 segundo, a faixa de frete é inserida acima do título do produto e move toda a primeira dobra. Ação: renderizar o contêiner e a mensagem padrão no HTML, atualizando o texto dentro da mesma altura quando o CEP estiver disponível. Aceite: não há shift no carregamento, o conteúdo continua correto e leitores de tela recebem a atualização sem perder foco.
Depois da implementação, compare laboratório, campo e indicadores do componente. Uma faixa estável que deixa de ser compreendida não é sucesso.
CLS é uma métrica de previsibilidade. Corrigi-lo significa manter a interface coerente enquanto dados, mídia e componentes chegam — sem fazer o usuário perseguir o conteúdo pela tela.
Respostas diretas
Perguntas frequentes
Qual é um bom CLS?
A recomendação atual é CLS de até 0,1 no percentil 75 das visitas, separado entre mobile e desktop.
Toda animação aumenta CLS?
Não. Transformações e movimentos esperados após interação podem não contar da mesma forma. Ainda assim, animações precisam preservar legibilidade, foco e preferência por movimento reduzido.
width e height deixam a imagem sem responsividade?
Não. Os atributos definem a proporção intrínseca. CSS pode manter a imagem responsiva com largura máxima e altura automática.