CSS e web

Texto com gradiente em CSS, bem feito

Três linhas de CSS colocam um gradiente dentro das suas letras. Deixá-lo legível, robusto e de bom gosto leva mais algumas, e saber quando deixar o texto liso.

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

Resumindo

  • O texto com gradiente em CSS funciona pintando um gradiente como fundo do elemento, recortando-o no formato das letras com background-clip: text e deixando a cor do texto transparente.
  • Defina sempre primeiro uma cor sólida de texto e aplique a cor transparente só dentro de uma verificação @supports, para que as palavras nunca sumam.
  • Cada parte do gradiente precisa de contraste suficiente com o fundo, então confira as paradas mais clara e mais escura, não só uma.
  • O texto com gradiente combina com linhas curtas de destaque em tamanhos grandes e funciona mal em texto corrido, links e rótulos pequenos.
  • Acrescentar box-decoration-break: clone dá a cada linha de um elemento inline quebrado o seu próprio gradiente completo.
Nesta página

O texto com gradiente em CSS é feito pintando um gradiente como fundo do elemento de texto, recortando esse fundo no formato das letras com background-clip: text e deixando o próprio texto transparente para o gradiente aparecer. São três declarações, funciona em todos os navegadores atuais e continua sendo texto de verdade, 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 básica. 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 bastante para se ler no branco.

O resto deste guia trata do que a versão de três linhas faz de errado: alternativas ausentes, contraste, texto em várias linhas, descendentes cortadas e a questão de design de quando o texto com gradiente ajuda. Para o visual de letras com gradiente em redes sociais e trabalhos de marca, e não na web, veja efeitos de texto.

Uma receita robusta de texto com gradiente, com alternativas

Se um navegador aplica o color: transparent, mas não o recorte, o texto some. Proteja-se: dê ao elemento uma cor sólida tirada do gradiente e só troque para a versão transparente quando o navegador confirmar o suporte. Acrescente uma redefinição para o modo de cores forçadas, em que o sistema substitui suas cores e o texto precisa 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;
  }
}
Cor sólida primeiro, gradiente só onde há suporte e uma cor do sistema quando o usuário força as suas.

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

Contraste: confira as duas pontas do gradiente

Um verificador de contraste recebe uma cor de texto, mas o texto com gradiente tem várias. As palavras são tão legíveis quanto sua parte mais fraca, então confira a parada mais clara e a mais escura contra o fundo, e olhe o meio também, porque uma mistura em sRGB pode ficar mais clara ou mais sem graça que qualquer das pontas. Para texto grande de destaque, o WCAG pede pelo menos 3:1; para texto normal, 4,5:1. Contraste de cores explica as razões.

Gradientes de texto cujas paradas passam todas de 5:1 no fundo indicado. No branco, cada parada mede mais de 5:1; em #0b0b12, mais de 7:1.

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

Em um elemento inline que quebra, o navegador estende um só fundo por todas as linhas como se fossem uma única tira, então a primeira linha recebe o começo do gradiente e a última recebe o fim. Em geral você quer que cada linha carregue o gradiente completo. O box-decoration-break: clone faz isso. Em elementos de bloco, como um título, o gradiente já abrange a caixa inteira, então um gradiente longo em um 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 próprio gradiente completo, e as caudas do g, j, p e y ficam dentro da área pintada.

As descendentes cortadas são a outra surpresa. O fundo só pinta a caixa do elemento, então, com um line-height muito justo, as partes das letras que ficam abaixo dela ficam transparentes e somem. Uma altura de linha de cerca de 1,1 ou um pouco de padding embaixo resolve. Fontes de destaque em itálico podem perder a ponta da última letra à direita pelo mesmo motivo; um toque de padding inline ajuda.

Quando o texto com gradiente funciona e quando não

Evite

  • Texto corrido, em que a mudança de cor atrapalha a leitura
  • Links e botões, em que a cor indica estado
  • Rótulos pequenos, abaixo de cerca de 24px, em que o gradiente é invisível de qualquer jeito
  • Gradientes arco-íris com cinco ou mais matizes
  • Texto com gradiente sobre fundo com gradiente

Use para

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

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

Animando texto com gradiente

Para fazer a cor fluir pelas letras, deixe o fundo maior que o texto e mova-o. Dê a ele 200% de largura e anime o background-position de ida e volta com alternate, para nunca haver um salto quando o ciclo recomeça. Respeite as configurações de movimento reduzido e mantenha lento: um brilho a cada poucos segundos parece acabamento, um ciclo rápido parece 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 derivando de um lado a outro pelas palavras. Combine com o recorte e a alternativa da receita acima.

Os mesmos truques de fundo alimentam os gradientes animados em CSS de modo mais amplo, e contornos em vez de preenchimentos com gradiente estão em bordas com gradiente em CSS.

Perguntas frequentes

Como faço texto com gradiente em CSS?

Defina um gradiente como background-image, acrescente -webkit-background-clip: text e background-clip: text e defina color: transparent. Coloque uma cor sólida fora de uma verificação @supports como alternativa.

Por que meu texto com gradiente está invisível?

O texto está transparente, mas o fundo não está sendo recortado, em geral porque a declaração de recorte está ausente, escrita errada ou sem suporte. Aplique 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 sendo texto de verdade. Confira as paradas mais clara e mais escura e redefina as cores no modo de cores forçadas.

Por que a parte de baixo das minhas letras está cortada?

O fundo recortado só cobre a caixa do elemento, então uma altura de linha justa deixa as descendentes fora dela. Aumente a altura da linha para cerca de 1,1 ou acrescente um pouco de padding embaixo.

Posso usar texto com gradiente em e-mails?

O suporte a background-clip: text é irregular entre os clientes de e-mail, então use uma cor sólida ou uma imagem com texto alternativo nesse caso. Veja gradientes em e-mail.

Compartilhar este guia

Escrito pelo GradientlyConta verificada do Gradiently

A equipe por trás do Gradiently, uma ferramenta de design criada em torno dos Marks: gradientes vivos que fazem tudo o que você cria ter a sua cara.

Ver nosso perfil