Como adaptar a tipografia às preferências do usuário com CSS

Um método para adaptar uma fonte às preferências dos usuários, para que eles se sintam o mais confortáveis possível ao ler seu conteúdo.

Trazer o usuário para o processo de design foi um momento emocionante para usuários, designers e desenvolvedores. Os usuários podem acessar sua experiência e começar a consumir conteúdo sem problemas, com as preferências deles integradas ao resultado do design.

Esta postagem do blog explica como usar consultas de mídia CSS com uma fonte variável para personalizar ainda mais a experiência de leitura. A graduação e o peso da fonte podem ser personalizados com font-variation-settings, permitindo microajustes de acordo com várias preferências e contextos, como uma preferência pelo modo escuro ou alto contraste. Podemos usar essas preferências e personalizar uma fonte variável para essa experiência do usuário.

  • O modo escuro tem uma gradação um pouco reduzida.
  • O alto contraste tem uma fonte mais ousada.
  • O baixo contraste usa uma fonte mais fina.
https://codepen.io/argyleink/pen/mdQrqvj

Acompanhe para entender cada parte do CSS e da fonte variável que permitem esse momento significativo.

Etapas da configuração

Para ajudar a focar nos valores de configuração do CSS e da variação de fonte, mas também para ter algo para ler e ver, confira a marcação que você pode usar para visualizar o trabalho:

<h1>Variable font weight based on contrast preference</h1>

<p>
  Lorem ipsum dolor sit amet consectetur adipisicing elit.
  Officia, quod? Quidem, nemo aliquam, magnam rerum distinctio
  itaque nisi nam, cupiditate dolorum ad sint. Soluta nemo
  labore aliquid ex, dicta corporis.
</p>

Sem adicionar CSS, o tamanho da fonte já é adaptável às preferências do usuário. Confira um vídeo de outra demonstração mostrando como definir font-size em pixels vai ignorar as preferências do usuário e por que você deve definir o tamanho da fonte em rems:

Por fim, para centralizar e dar suporte à demonstração, um pouco de CSS:

@layer demo.support {
  body {
    display: grid;
    place-content: center;
    padding: var(--size-5);
    gap: var(--size-5);
  }

  h1 {
    text-wrap: balance;
  }
}

Uma
prévia de captura de tela da demonstração até agora, nos temas escuro e claro.

Com essa configuração de demonstração, você pode começar a testar e implementar esse recurso de UX de tipografia.

Carregar a fonte variável Roboto Flex

A estratégia adaptativa depende de uma família tipográfica variável com eixos significativos para personalização, especificamente GRAD e wght. As preferências adaptáveis de usuário segmentadas neste artigo são para esquema de cores e contraste, que vão ajustar esses eixos para corresponder à preferência desejada do usuário.

Carregue a fonte variável usando a API @font-face do CSS:

@font-face {
  font-family: "Roboto Flex";
  src: url('https://assets.codepen.io/2585/RobotoFlex') format('truetype');
}

Em seguida, aplique a fonte a algum conteúdo. O CSS a seguir aplica isso a tudo:

@layer demo.support {
  body {
    font-family: Roboto Flex;
  }
}

Uma prévia de captura de tela da demonstração até agora, com a fonte Roboto Flex nos temas escuro e claro.

Propriedades personalizadas e consultas de mídia do CSS para vencer

Com a fonte carregada, é possível consultar as preferências do usuário e adaptar as configurações de fonte variável para corresponder.

Configurações quando não há preferências (padrão)

Os estilos iniciais a seguir serão os estilos padrão ou, de outra forma, os estilos para usuários sem preferências.

@layer demo {
  body {
    --base-weight: 400;
    --base-grade: 0;

    font-variation-settings:
      "wght" var(--base-weight),
      "GRAD" var(--base-grade)
    ;
  }
}

Configurações quando a preferência é por alto contraste

Para usuários que indicaram uma preferência por alto contraste nas configurações do sistema, aumente o valor de --base-weight de 400 para 700:

@layer demo {
  @media (prefers-contrast: more) {
    body {
      --base-weight: 700;
    }
  }
}

Agora há mais contraste ao ler.

Configurações quando a preferência é por baixo contraste

Para usuários que indicaram uma preferência por baixo contraste nas configurações do sistema, diminua o valor --base-weight de 400 para 200:

@layer demo {
  @media (prefers-contrast: less) {
    body {
      --base-weight: 200;
    }
  }
}

Agora há menos contraste durante a leitura.

Configurações quando a preferência é pelo modo escuro

@layer demo {
  @media (prefers-color-scheme: dark) {
    body {
      --base-grade: -25;
    }
  }
}

Agora as diferenças perceptuais de claro no escuro e escuro no claro foram consideradas.

Tudo junto

@layer demo {
  body {
    --base-weight: 400;
    --base-grade: 0;

    font-variation-settings:
      "wght" var(--base-weight),
      "GRAD" var(--base-grade)
    ;
  }

  @media (prefers-contrast: more) {
    body {
      --base-weight: 700;
    }
  }

  @media (prefers-contrast: less) {
    body {
      --base-weight: 200;
    }
  }

  @media (prefers-color-scheme: dark) {
    body {
      --base-grade: -25;
    }
  }
}

Ou, para se divertir, tudo junto com o encadeamento de CSS:

@layer demo {
  body {
    --base-weight: 400;
    --base-grade: 0;

    font-variation-settings:
      "wght" var(--base-weight),
      "GRAD" var(--base-grade)
    ;

    @media (prefers-contrast: more)     { --base-weight: 700 }
    @media (prefers-contrast: less)     { --base-weight: 200 }
    @media (prefers-color-scheme: dark) { --base-grade: -25 }
  }
}

O resultado é uma experiência de leitura que adapta a fonte para corresponder às preferências do usuário. O código-fonte completo está disponível abaixo no Codepen.