Melhoria da mudança de layout cumulativa no Telegraph Media Group

Em alguns meses, o principal site de notícias do Reino Unido conseguiu melhorar a CLS do percentil 75 em 250%, de 0,25 para 0,1.

O desafio da estabilidade visual

As mudanças de layout podem ser muito perturbadoras. No Telegraph Media Group (TMG), a estabilidade visual é particularmente importante porque os leitores usam principalmente nossos aplicativos para consumir as notícias. Se o layout mudar durante a leitura de um artigo, o leitor provavelmente vai perder o lugar. Isso pode ser uma experiência frustrante e que distrai.

Do ponto de vista da engenharia, garantir que as páginas não mudem e interrompam o leitor pode ser desafiador, especialmente quando áreas do aplicativo são carregadas de forma assíncrona e adicionadas à página dinamicamente.

Na TMG, temos várias equipes que contribuem com o código do lado do cliente:

  • Engenharia de base. Implementação de soluções de terceiros para melhorar áreas como recomendações de conteúdo e comentários.
  • Marketing. Executar testes A/B para avaliar como nossos leitores interagem com novos recursos ou mudanças.
  • Publicidade. Gerenciar solicitações de anúncios e lances prévios de anúncios.
  • Editorial. Incorporação de código em artigos, como tweets ou vídeos, e widgets personalizados (por exemplo, rastreador de casos de coronavírus).

Pode ser difícil garantir que cada uma dessas equipes não causem solavancos no layout da página. Usando a métrica Shift de layout cumulativo para medir a frequência com que isso ocorre para nossos leitores, as equipes tiveram mais insights sobre a experiência real do usuário e uma meta clara a ser alcançada. Isso resultou em uma melhoria da CLS do percentil 75, de 0,25 para 0,1, e no crescimento do bucket de passagem, de 57% para 72%.

250%

Melhoria na CLS do percentil 75

15%

Mais usuários com boa pontuação de CLS

Onde começamos

Usando os painéis do Crux, foi possível determinar que nossas páginas estavam mudando mais do que gostaríamos.

Painel do CrUX mostrando cerca de 55 a 60% de pontuações boas, 15% de pontuações que precisam de melhorias e 25% de pontuações ruins.
Nossas pontuações de Cumulative Layout Shift entre junho de 2020 e fevereiro de 2021.

O ideal era que pelo menos 75% dos nossos leitores tivessem uma "boa" experiência. Por isso, começamos a identificar as causas da instabilidade do layout.

Como medimos as mudanças de layout

Usamos uma combinação de Chrome DevTools e WebPageTest para ajudar a reconhecer o que estava causando a mudança do layout. No DevTools, usamos a seção Experience da guia Performance para destacar instâncias individuais de layout de mudança e como elas contribuíram para a pontuação geral.

A página principal do Telegraph com um anúncio no cabeçalho destacado com uma sobreposição azul.
Como identificar uma mudança de layout causada pelo carregamento do anúncio do lado do cliente acima do cabeçalho usando a seção "Experiência" do Chrome DevTools.

O WebPageTest destaca onde a mudança de layout ocorre na visualização da linha do tempo quando a opção "Destaque de mudanças de layout" está selecionada.

Visualização de filme do WebPageTest do site do Telegraph com o layoutshift destacado com uma sobreposição vermelha.
O WebPageTest destacando onde o layout mudou.

Depois de analisar cada mudança nos modelos mais visitados, criamos uma lista de ideias sobre como melhorar.

Reduzir as trocas de layout

Focamos em quatro áreas em que poderíamos reduzir as mudanças de layout: - anúncios - imagens - cabeçalhos - incorporações

Anúncios

Os anúncios são carregados após a pintura inicial pelo JavaScript. Alguns dos contêineres carregados não tinham altura reservada.

Animação do site do Telegraph. A lista de histórias é empurrada para baixo quando um anúncio é carregado acima dela.
O bloco "Mais histórias" abaixo do anúncio é movido para baixo depois que o anúncio é carregado.

Embora não saibamos a altura exata, podemos reservar espaço usando o tamanho de anúncio mais comum carregado no slot.

Animação do site do Telegraph. Um retângulo marcador de posição para o anúncio é colocado acima da lista de histórias. O anúncio é carregado no lugar do marcador de posição sem causar uma mudança no layout.
Ao reservar espaço para o anúncio, o bloco "Mais histórias" abaixo permanece estático antes e depois do carregamento do anúncio.

Em alguns casos, avaliamos mal a altura média do anúncio. Para leitores de tablets, o slot estava sendo recolhido.

Animação de uma visualização em tablet do site do Telegraph. O slot do marcador de posição é maior que o anúncio, então o conteúdo é movido para cima depois que o anúncio é carregado.
O espaço do anúncio está sendo reduzido depois de carregado para os leitores em dispositivos do tamanho de um tablet.

Revisitamos o slot e ajustamos a altura para usar o tamanho mais comum.

Animação de uma visualização em tablet do site do Telegraph. Com o marcador de posição correspondente ao tamanho do anúncio, não há mudança de layout quando o anúncio é carregado.
Garantir que o espaço reservado para o slot de anúncio correspondesse à altura mais comum do anúncio.

Imagens

Muitas das imagens do site são carregadas de forma lazy e têm espaço reservado para elas.

Animação de cards de visualização de artigos sendo carregados.
Carregamento lento de imagens sem interromper o layout.

No entanto, as imagens inline na parte de cima dos artigos não tinham espaço reservado no contêiner nem atributos de largura e altura associados às tags. Isso fez com que o layout mudasse à medida que eles eram carregados.

Animação do carregamento da página do artigo. Quando a imagem principal é carregada na parte de cima da página, o texto se move para baixo.
Uma mudança de layout causada pela imagem principal do artigo.

Basta adicionar os atributos de largura e altura às imagens para garantir que o layout não seja alterado.

Animação da página do artigo sendo carregada com marcador de posição reservado para a imagem principal. Quando a imagem principal é carregada na parte de cima da página, não há mudança de layout.
A imagem do artigo principal carrega sem causar mudanças no layout.

O cabeçalho estava abaixo do conteúdo na marcação e foi posicionado na parte de cima usando CSS. A ideia original era priorizar o carregamento do conteúdo antes da navegação, mas isso fez com que a página mudasse momentaneamente.

ALT_TEXT_HERE
O cabeçalho da página carrega de forma não elegante.

Mover o cabeçalho para a parte de cima da marcação permitiu que a página fosse renderizada sem essa mudança.

ALT_TEXT_HERE
O layout não é mais interrompido pelo cabeçalho do carregamento da página.

Incorporações

Alguns dos embeds usados com frequência têm uma proporção definida. Por exemplo, vídeos do YouTube. Enquanto o player está carregando, extraímos a miniatura do YouTube e a usamos como marcador enquanto o vídeo é carregado.

O slot do player de vídeo carregando uma miniatura de baixa resolução enquanto o player de vídeo é carregado.
O slot do player de vídeo carregando uma miniatura de baixa resolução enquanto o player de vídeo é carregado.

Como medir o impacto

Foi possível medir o impacto no nível do recurso com bastante facilidade usando as ferramentas mencionadas no início do artigo. No entanto, queríamos medir a CLS no nível do modelo e do site. De forma sintética, usamos SpeedCurve para validar as mudanças na pré-produção e na produção.

Gráfico SpeedCurve mostrando uma queda acentuada na pontuação de CLS.
Rastreamento da progressão do CLS de forma sintética usando o SpeedCurve.

Depois que o código chegar à produção, poderemos validar os resultados nos dados do RUM (fornecidos pelo mPulse).

Gráfico do mPulse mostrando uma queda na pontuação de CLS.
Validação de melhorias de CLS em todo o site com dados de RUM do mPulse antes e depois de fazer mudanças.

A verificação dos dados do RUM nos dá um bom nível de confiança de que as mudanças que estamos fazendo estão tendo um impacto positivo para nossos leitores.

Os números finais que analisamos são referentes aos dados do RUM coletados pelo Google. Isso é especialmente relevante agora, porque em breve eles vão afetar a classificação da página. Para começar, usamos o Relatório de UX do Chrome, tanto nos dados mensais da origem disponíveis no painel CrUX quanto consultando o BigQuery para recuperar dados históricos de p75. Dessa forma, foi fácil notar que, para todo o tráfego medido pelo CrUX, nossa CLS de percentil 75 melhorou em 250%, de 0,25 para 0,1, e nosso bucket de passagem cresceu de 57% para 72%.

O painel do CrUX que mostra o CLS p75 para telegraph.co.uk é 0,1.
Resultados do painel do Crux.
O BigQuery mostra que os valores de p75 melhoraram mês a mês, de 0,25 para 0,1.
Execução do BigQuery mostrando os valores de p75 de 2021 até o momento.

Além disso, foi possível usar a API do Relatório de UX do Chrome e criar alguns painéis internos divididos em modelos.

Painel interno mostrando uma pontuação média boa de 76,2, uma pontuação de 9,3 que precisa de melhorias e uma pontuação ruim de 14,6.
Painéis internos que usam a API Chrome UX Report destacando a pontuação média e as páginas com o pior desempenho usando esse modelo.

Como evitar regressões de CLS

Um aspecto importante para melhorar a performance é evitar regressões. Configuramos alguns orçamentos de performance básicos para nossas principais métricas e incluímos o CLS neles.

Um painel de orçamento de performance que mostra verificações sintéticas que medem a CLS em alguns dos nossos modelos de tráfego intenso. O orçamento está definido como 0,025.

Se o teste exceder o orçamento, uma mensagem será enviada para um canal do Slack para que possamos investigar a causa. Também configuramos relatórios semanais para que, mesmo que os modelos permaneçam dentro do orçamento, saibamos de qualquer mudança que tenha um impacto negativo.

Também planejamos expandir nossos orçamentos para usar dados do RUM e dados sintéticos, usando o mPulse para definir alertas estáticos e, potencialmente, detecção de anomalias, que nos informariam sobre qualquer mudança fora do comum.

É importante que abordemos novos recursos pensando na CLS. Muitas das mudanças que mencionei são aquelas que tivemos que corrigir depois de serem lançadas para nossos leitores. A estabilidade do layout será uma consideração para o design da solução de qualquer novo recurso daqui para frente, para que possamos evitar mudanças de layout inesperadas desde o início.

Conclusão

As melhorias que fizemos até agora foram muito fáceis de implementar e tiveram um impacto significativo. Muitas das mudanças que descrevi neste artigo não levaram muito tempo para serem implementadas e foram aplicadas a todos os modelos mais usados, o que significa que elas tiveram um impacto positivo generalizado para nossos leitores.

Ainda há áreas do site que precisamos melhorar. Estamos buscando maneiras de fazer mais da nossa lógica do lado do cliente no lado do servidor, o que vai melhorar a CLS ainda mais. Vamos continuar rastreando e monitorando nossas métricas com o objetivo de melhorá-las constantemente e oferecer aos nossos leitores a melhor experiência de usuário possível.