Evite a mudança de layout e o flash de texto invisível (FOIT, na sigla em inglês) pré-carregando fontes opcionais

A partir do Chrome 83, o link rel="preload" e font-display: optional podem ser combinados para remover completamente o problema de instabilidade do layout.

Ao otimizar os ciclos de renderização, o Chrome 83 elimina a mudança de layout ao carregar com antecedência as fontes opcionais. Combinar <link rel="preload"> com font-display: optional é a maneira mais eficaz de garantir que não haja instabilidade no layout ao renderizar fontes personalizadas.

Compatibilidade com navegadores

Confira os dados do MDN para informações atualizadas sobre o suporte a vários navegadores:

Renderização de fontes

O deslocamento de layout, ou relayout, ocorre quando um recurso em uma página da Web muda dinamicamente, resultando em um "deslocamento" do conteúdo. A busca e renderização de fontes da Web podem causar mudanças no layout de duas maneiras:

  • Uma fonte substituta é trocada por uma nova fonte ("flash de texto sem estilo")
  • O texto "invisível" é mostrado até que uma nova fonte seja renderizada na página ("flash de texto invisível")

A propriedade CSS font-display oferece uma maneira de modificar o comportamento de renderização de fontes personalizadas com uma variedade de valores com suporte (auto, block, swap, fallback e optional). A escolha do valor a ser usado depende do comportamento preferido para fontes carregadas de forma assíncrona. No entanto, até agora, cada um desses valores com suporte pode acionar o redimensionamento de uma das duas maneiras listadas acima.

Fontes opcionais

A propriedade font-display usa uma linha do tempo de três períodos para processar fontes que precisam ser transferidas antes de serem renderizadas:

  • Bloquear:renderizar texto "invisível", mas mudar para a fonte da Web assim que o carregamento terminar.
  • Troca:renderizar texto usando uma fonte do sistema de fallback, mas mudar para a fonte da Web assim que ela terminar de carregar.
  • Falha:renderizar texto usando uma fonte do sistema substituta.

Antes, as fontes designadas com font-display: optional tinham um período de bloqueio de 100 ms e nenhum período de troca. Isso significa que o texto "invisível" aparece por um breve período antes de mudar para uma fonte substituta. Se a fonte não for transferida por download em 100 ms, a fonte de substituição será usada e nenhuma troca ocorrerá.

Diagrama mostrando o comportamento opcional anterior da fonte quando ela não é carregada
Comportamento anterior do font-display: optional no Chrome quando a fonte é transferida por download após o período de bloqueio de 100 ms

No entanto, se a fonte for transferida antes do término do período de bloqueio de 100 ms, a fonte personalizada será renderizada e usada na página.

Diagrama mostrando o comportamento opcional anterior da fonte quando ela é carregada a tempo
Comportamento anterior do font-display: optional no Chrome quando a fonte é baixada antes do período de bloqueio de 100 ms

O Chrome renderiza a página duas vezes nas duas instâncias, independentemente de a fonte padrão ser usada ou se a fonte personalizada terminar de carregar a tempo. Isso causa um leve tremor de texto invisível e, nos casos em que uma nova fonte é renderizada, um tremor de layout que move parte do conteúdo da página. Isso ocorre mesmo se a fonte for armazenada no cache do disco do navegador e puder ser carregada antes do período de bloqueio ser concluído.

Otimizações foram lançadas no Chrome 83 para remover completamente o primeiro ciclo de renderização de fontes opcionais que são pré-carregadas com <link rel="preload'>. Em vez disso, a renderização é bloqueada até que a fonte personalizada termine de carregar ou um determinado período de tempo tenha passado. Esse período de tempo limite está definido como 100 ms, mas pode mudar em breve para otimizar o desempenho.

Diagrama mostrando o novo comportamento opcional de fontes pré-carregadas quando não é possível carregar a fonte
Novo comportamento do font-display: optional no Chrome quando as fontes são pré-carregadas e são baixadas após o período de bloqueio de 100 ms (sem flash de texto invisível)
Diagrama mostrando o novo comportamento opcional de fontes pré-carregadas quando a fonte é carregada a tempo
Novo comportamento do font-display: optional no Chrome quando as fontes são pré-carregadas e são baixadas antes do período de bloqueio de 100 ms (sem flash de texto invisível)

O pré-carregamento de fontes opcionais no Chrome elimina a possibilidade de instabilidade do layout e flash de texto sem estilo. Isso corresponde ao comportamento necessário conforme especificado no Nível 4 do módulo de fontes do CSS, em que as fontes opcionais nunca podem causar relayout, e os user agents podem atrasar a renderização por um período adequado.

Embora não seja necessário pré-carregar uma fonte opcional, isso aumenta muito a chance de ela ser carregada antes do primeiro ciclo de renderização, especialmente se ela ainda não estiver armazenada no cache do navegador.

Conclusão

A equipe do Chrome quer saber sobre suas experiências de pré-carregar fontes opcionais com essas novas otimizações. Registre um problema se tiver dificuldades ou quiser enviar sugestões de recursos.