À medida que uma fonte da Web é carregada, agora é possível ajustar a escala dela para normalizar os tamanhos de fonte do documento e evitar mudanças de layout ao alternar entre fontes.
Considere a seguinte demonstração em que o font-size é um 64px consistente, e a única diferença entre cada um desses cabeçalhos é o font-family. Os exemplos à esquerda não foram ajustados e têm um tamanho final inconsistente. Os exemplos à direita usam size-adjust para
garantir que 64px seja o tamanho final consistente.
Esta postagem explora um novo descritor de
tipo de fonte CSS chamado
size-adjust. Ele também demonstra algumas maneiras de corrigir e normalizar tamanhos de fonte
para uma experiência do usuário mais tranquila, sistemas de design consistentes e um layout de página mais previsível. Um caso de uso importante é otimizar a renderização de fontes da Web para evitar o mudança de layout cumulativa (CLS, na sigla em inglês).
Confira uma demonstração interativa do espaço do problema. Tente mudar a família tipográfica com o menu suspenso e observe:
- As diferenças de altura nos resultados.
- Mudanças de conteúdo visualmente desagradáveis.
- Áreas de destino interativas em movimento (o menu suspenso fica pulando).
Como dimensionar fontes com size-adjust
Introdução à sintaxe:
@font-face {
font-family: "Adjusted Typeface";
size-adjust: 150%;
src: url(some/path/to/typeface.woff2) format('woff2');
}
- Cria um tipo de letra personalizado chamado
Adjusted Typeface. - Usa
size-adjustpara aumentar cada glifo em 150% do tamanho padrão. - Afeta apenas a única família tipográfica importada.
Use o typeface personalizado acima desta forma:
h1 {
font-family: "Adjusted Typeface";
}
Como reduzir o CLS com troca de fontes sem interrupções
No GIF a seguir, confira os exemplos à esquerda e como há uma mudança quando a fonte é alterada. Este é apenas um pequeno exemplo com um único elemento de manchete, e o problema é muito perceptível.
Para melhorar a renderização de fontes, uma ótima técnica é a troca de fontes. Renderize uma fonte do sistema de carregamento rápido para mostrar o conteúdo primeiro e, em seguida, troque por uma webfont quando ela terminar de carregar. Assim, você tem o melhor dos dois mundos: o conteúdo fica visível o mais rápido possível, e você tem uma página bem estilizada sem sacrificar o tempo do usuário para o conteúdo. O problema é que, às vezes, quando a fonte da Web é carregada, ela muda toda a página, já que é apresentada em uma altura de caixa ligeiramente diferente.
Ao colocar size-adjust na regra @font-face, você define um ajuste global de glifo para a família tipográfica. Fazer isso no momento certo vai levar a uma mudança visual mínima e uma troca perfeita. Para criar uma troca perfeita, ajuste manualmente ou use esta calculadora de ajuste de tamanho (link em inglês) de Malte Ubl.
@font-face pré-ajustado.
No início desta postagem, a correção do problema de tamanho da fonte foi feita por tentativa e erro. size-adjust foi ajustado no código-fonte até que o mesmo cabeçalho em
Cookie e Arial renderizasse o mesmo 64px que Press Start 2P naturalmente.
Alinhei duas fontes a um tamanho de fonte de destino.
@font-face {
font-family: 'Adjusted Arial';
size-adjust: 86%;
src: local(Arial);
}
@font-face {
font-family: 'Cookie';
size-adjust: 90.25%;
src: url(...woff2) format('woff2');
}
Calibragem de fontes
Você, como autor, determina as metas de calibragem para normalizar a escala da fonte. Você pode normalizar em Times, Arial ou uma fonte do sistema e ajustar as fontes personalizadas para corresponder. Ou você pode ajustar as fontes locais para corresponder ao que você baixa.
Estratégias para calibragem de size-adjust:
- Destino remoto:
ajuste as fontes locais para as fontes baixadas. - Segmentação local:
ajusta as fontes baixadas para as fontes de segmentação local.
Exemplo 1: destino remoto
Considere o snippet a seguir, que ajusta uma fonte disponível localmente para corresponder ao tamanho de uma fonte personalizada src remota. Uma fonte personalizada remota é o destino da calibragem, talvez uma fonte da marca:
@font-face {
font-family: "Adjusted Regular Arial For Brand";
src: local(Arial);
size-adjust: 90%;
}
@font-face {
font-family: "Rad Brand";
src: url(some/path/to/a.woff2) format('woff2');
}
html {
font-family: "Rad Brand", "Adjusted Regular Arial For Brand";
}
Neste exemplo, a fonte local Arial está sendo ajustada em antecipação a uma fonte personalizada carregada, para uma troca perfeita.
Essa estratégia tem a vantagem de oferecer aos designers e desenvolvedores a mesma família tipográfica para dimensionamento e tipografia. A marca é a meta de calibragem. Essa é uma ótima notícia para sistemas de design.
Ter uma família tipográfica da marca como destino também é como a calculadora de Malte funciona. Escolha uma família tipográfica do Google e ela vai calcular como ajustar a Arial para trocar com ela sem problemas. Confira um exemplo de CSS do Roboto da calculadora, em que a Arial é carregada e chamada de "Roboto-fallback":
@font-face {
font-family: "Roboto-fallback";
size-adjust: 100.06%;
src: local("Arial");
}
Para criar um ajuste totalmente multiplataforma, consulte o exemplo a seguir, que fornece duas fontes de substituição locais ajustadas em antecipação a uma fonte da marca.
@font-face {
font-family: "Roboto-fallback-1";
size-adjust: 100.06%;
src: local("Arial");
}
@font-face {
font-family: "Roboto-fallback-2";
size-adjust: 99.94%;
src: local("Arimo");
}
@font-face {
font-family: "Roboto Regular";
src: url(some/path/to/roboto.woff2) format('woff2');
}
html {
font-family: "Roboto Regular", "Roboto-fallback-1", "Roboto-fallback-2";
}
Exemplo 2: segmentação local
Considere o snippet a seguir, que ajusta uma fonte personalizada da marca para corresponder à Arial:
@font-face {
font-family: "Rad Brand - Adjusted For Arial";
src: url(some/path/to/a.woff2) format('woff2');
size-adjust: 110%;
}
html {
font-family: "Rad Brand - Adjusted For Arial", Arial;
}
Essa estratégia tem a vantagem de renderizar sem ajustes e, em seguida, ajustar as fontes recebidas para corresponder.
Ajuste mais preciso com ascent-override, descent-override e line-gap-override
Se o escalonamento genérico de glifos não for um ajuste suficiente para seu design ou estratégias de carregamento, confira algumas opções de ajuste mais refinadas que funcionam com size-adjust. As propriedades
ascent-override,
descent-override,
e
line-gap-override
estão implementadas no Chromium 87+ e no Firefox 89+.

ascent-override
O descritor ascent-override define a altura acima da linha de base de uma fonte.
@font-face {
font-family: "Ascent Adjusted Arial Bold";
src: local(Arial Bold);
ascent-override: 71%;
}
O título vermelho (não ajustado) tem espaço acima das letras maiúsculas A e O, enquanto o título azul foi ajustado para que a altura da maiúscula se encaixe perfeitamente na caixa delimitadora geral.
descent-override
O descritor descent-override define a altura abaixo da linha de base da fonte.
@font-face {
font-family: "Ascent Adjusted Arial Bold";
src: local(Arial Bold);
descent-override: 0%;
}
O título vermelho (não ajustado) tem espaço abaixo das linhas de base D e O, enquanto o título azul foi ajustado para que as letras fiquem bem na linha de base.
line-gap-override
O descritor line-gap-override define a métrica de espaçamento entre linhas da fonte.
Esse é o espaçamento entre linhas ou o espaçamento externo recomendado para a fonte.
@font-face {
font-family: "Line Gap Adjusted Arial";
src: local(Arial);
line-gap-override: 50%;
}
O título vermelho (não ajustado) não tem line-gap-override, ou seja, está em 0%, enquanto o título azul foi ajustado em 50%, criando espaço acima e abaixo das letras.
Como tudo funciona em conjunto
Cada uma dessas substituições oferece uma maneira adicional de cortar o excesso da caixa delimitadora de texto seguro da Web. Você pode personalizar a caixa de texto para uma apresentação precisa.
Conclusão
O recurso CSS @font-face size-adjust é uma maneira interessante de personalizar a caixa delimitadora de texto dos seus layouts da Web para melhorar a experiência de troca de fontes e evitar mudanças de layout para os usuários. Para saber mais, confira estes recursos:
- Especificação do nível 5 de fontes CSS
- Ajuste de tamanho no MDN
- Troca simples do gerador @font-face
- Cumulative Layout Shift (CLS) no web.dev
- Uma nova maneira de reduzir o impacto do carregamento de fontes: descritores de fontes CSS
Foto de Kristian Strand no Unsplash