CSS e web

Texto com gradiente em CSS, bem feito

Três linhas de CSS põem um gradiente dentro das tuas letras. Torná-lo legível, robusto e de bom gosto exige mais algumas, e saber quando deixar o texto liso.

GradientlyConta Gradiently verificada··6 min de leitura
Capa: Mistral Reel · GR·SXXT·96

A versão curta

  • O texto com gradiente em CSS funciona pintando um gradiente como fundo do elemento, recortando-o à forma das letras com background-clip: text e tornando a cor do texto transparente.
  • Define sempre primeiro uma cor de texto lisa e aplica a cor transparente só dentro de uma verificação @supports, para que as palavras nunca desapareçam.
  • Cada parte do gradiente precisa de contraste suficiente com o fundo, por isso verifica as paragens mais clara e mais escura e não só uma.
  • O texto com gradiente serve linhas curtas de destaque em tamanhos grandes e funciona mal em texto corrente, ligações e etiquetas pequenas.
  • Acrescentar box-decoration-break: clone dá a cada linha de um elemento em linha que quebra o seu próprio gradiente completo.
Nesta página

O texto com gradiente em CSS faz-se pintando um gradiente como fundo do elemento de texto, recortando esse fundo às formas das letras com background-clip: text e tornando o próprio texto transparente para que o gradiente apareça. Bastam três declarações, funciona em todos os navegadores atuais e continua a ser texto real, selecionável e pesquisável, e não uma imagem.

css
.gradient-text {
  background-image: linear-gradient(90deg, #6d28d9, #be185d);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
A técnica base. A linha com prefixo mantém contentes as versões mais antigas do Safari e do Chromium.
Violeta a rosa, para páginas claraslinear-gradient(90deg, #6d28d9, #be185d)
O gradiente dentro dessas letras. As duas pontas são escuras o suficiente para se lerem sobre branco.

O resto deste guia trata do que a versão de três linhas faz mal: falta de alternativas, contraste, texto em várias linhas, descendentes cortados e a questão de design de quando o texto com gradiente ajuda sequer. Para o aspeto das letras com gradiente em redes sociais e trabalho de marca, e não na web, vê os efeitos de texto.

Uma receita robusta de texto com gradiente com alternativas

Se um navegador aplicar o color: transparent mas não o recorte, o texto desaparece. Protege-te: dá ao elemento uma cor lisa tirada do gradiente e passa depois à versão transparente só quando o navegador confirmar o suporte. Acrescenta uma reposição para o modo de cores forçadas, em que o sistema substitui as tuas cores e o texto tem de continuar visível.

css
.gradient-text {
  color: #6d28d9; /* solid fallback from the gradient */
}

@supports (background-clip: text) or (-webkit-background-clip: text) {
  .gradient-text {
    background-image: linear-gradient(90deg, #6d28d9, #be185d);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
  }
}

@media (forced-colors: active) {
  .gradient-text {
    background: none;
    color: CanvasText;
  }
}
Primeiro a cor lisa, o gradiente só onde há suporte e uma cor do sistema quando o utilizador força as suas.

A página da MDN sobre background-clip documenta o valor text e o seu suporte atual.

Contraste: verifica as duas pontas do gradiente

Um verificador de contraste recebe uma só cor de texto, mas o texto com gradiente tem muitas. As palavras só são tão legíveis como a sua parte mais fraca, por isso verifica a paragem mais clara e a mais escura contra o fundo, e olha também para o meio, porque uma mistura sRGB pode ficar mais clara ou mais baça do que qualquer das pontas. Para texto de destaque grande, as WCAG pedem pelo menos 3:1; para texto normal, 4,5:1. O guia sobre contraste de cor explica os rácios.

Gradientes de texto cujas paragens passam todas 5:1 no fundo indicado. Sobre branco, cada paragem mede mais de 5:1; sobre #0b0b12, mais de 7:1.

Corrigir texto com gradiente em várias linhas e letras cortadas

Num elemento em linha que quebra, o navegador estende um só fundo por todas as linhas como se fossem uma única tira, por isso a primeira linha fica com o início do gradiente e a última com o fim. Normalmente queres que cada linha leve o gradiente completo. O box-decoration-break: clone faz isso. Nos elementos de bloco, como um título, o gradiente já se estende por toda a caixa, por isso um gradiente longo num título largo pode mostrar só o meio nas linhas curtas.

css
.gradient-text {
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
  /* stop descenders being cut off */
  line-height: 1.15;
  padding-block-end: 0.08em;
}
Cada linha recebe o seu próprio gradiente completo, e as caudas do g, j, p e y ficam dentro da área pintada.

Os descendentes cortados são a outra surpresa. O fundo só pinta a caixa do elemento, por isso com um line-height muito justo, as partes das letras que pendem por baixo ficam transparentes e desaparecem. Uma altura de linha de cerca de 1,1 ou um pouco de preenchimento em baixo resolve. Os tipos de letra de destaque em itálico podem perder a ponta da última letra à direita pela mesma razão; um toque de preenchimento em linha ajuda.

Quando o texto com gradiente funciona e quando não

Evita

  • Texto corrente, em que a mudança de cor atrasa a leitura
  • Ligações e botões, em que a cor sinaliza o estado
  • Etiquetas pequenas abaixo de cerca de 24px, em que o gradiente é invisível de qualquer forma
  • Gradientes arco-íris com cinco ou mais matizes
  • Texto com gradiente sobre um fundo com gradiente

Usa-o para

  • Uma palavra ou frase curta num título grande
  • O nome de um produto ou marca num herói
  • Números grandes num bloco de estatísticas
  • Dois ou três matizes relacionados com luminosidade parecida
  • Fundos simples e calmos que deixam as letras liderar

Uma boa regra: o texto com gradiente é um destaque, como o itálico. Uma palavra realçada num título chama o olhar; um parágrafo inteiro cansa-o. Os pesos fortes ajudam, porque os traços finos não mostram cor suficiente para se lerem como um gradiente. Se o resto da página já usa fundos em gradiente, a tipografia lisa costuma ser a escolha mais forte; o guia sobre texto sobre fundos em gradiente trata desse caso.

Animar texto com gradiente

Para fazer a cor fluir pelas letras, faz o fundo maior do que o texto e move-o. Dá-lhe 200% de largura e anima o background-position para trás e para a frente com alternate, para nunca haver um salto quando o ciclo recomeça. Respeita as definições de movimento reduzido e mantém-no lento: um brilho a cada poucos segundos lê-se como acabamento, um ciclo rápido lê-se como um aviso.

css
.gradient-text--flow {
  background-image: linear-gradient(90deg, #6d28d9, #be185d, #c2410c);
  background-size: 200% 100%;
  animation: flow 6s ease-in-out infinite alternate;
}

@keyframes flow {
  from { background-position: 0% 50%; }
  to   { background-position: 100% 50%; }
}

@media (prefers-reduced-motion: reduce) {
  .gradient-text--flow { animation: none; }
}
A cor a derivar para trás e para a frente pelas palavras. Combina-a com o recorte e a alternativa da receita acima.

Os mesmos truques de fundo alimentam os gradientes animados em CSS de forma mais geral, e os contornos com gradiente em vez de preenchimentos são tratados nas bordas com gradiente em CSS.

Perguntas frequentes

Como faço texto com gradiente em CSS?

Define um gradiente como background-image, acrescenta -webkit-background-clip: text e background-clip: text e define color: transparent. Põe uma cor lisa fora de uma verificação @supports como alternativa.

Porque é que o meu texto com gradiente está invisível?

O texto é transparente mas o fundo não está a ser recortado, normalmente porque a declaração de recorte falta, está mal escrita ou não é suportada. Aplica o color: transparent só dentro de @supports (background-clip: text).

O texto com gradiente é acessível?

Pode ser, se cada parte do gradiente tiver contraste suficiente com o fundo e o texto continuar a ser texto real. Verifica as paragens mais clara e mais escura e repõe as cores no modo de cores forçadas.

Porque é que as partes de baixo das minhas letras estão cortadas?

O fundo recortado só cobre a caixa do elemento, por isso uma altura de linha justa deixa os descendentes fora dela. Aumenta a altura de linha para cerca de 1,1 ou acrescenta um pouco de preenchimento em baixo.

Posso usar texto com gradiente em emails?

O suporte para background-clip: text é irregular nos clientes de email, por isso usa aí uma cor lisa ou uma imagem com texto alternativo. Vê os gradientes em email.

Partilhar este guia

Escrito pela GradientlyConta Gradiently verificada

A equipa por trás da Gradiently, uma ferramenta de design construída em torno dos Marks: gradientes vivos que fazem tudo o que crias parecer teu.

Ver o nosso perfil