web design uiNovember 5, 20267 min read

Cores de gradiente em CSS: por que o gradiente fica cinza no meio e 3 jeitos de consertar

Misture azul com amarelo e o meio fica cinza, porque cores hex se misturam em RGB. Adicione uma parada no meio, misture em OKLCH ou escolha vizinhas no círculo cromático. Cinco gradientes prontos incluídos.

By Boone
XLinkedIn
CSS Gradient Colors: Why Gradients Turn Gray in the Middle and 3 Ways to Fix It

Um gradiente fica cinza no meio porque o navegador mistura cores hex em RGB, e duas cores opostas se anulam no meio do caminho. A solução é dar ao meio uma cor de propósito, ou mudar como a mistura é calculada. Aqui estão três soluções e cinco gradientes para você colar.

Por que o meio fica cinza

Olhe para um gradiente que parece barrento e ignore as pontas. As pontas estão ótimas. Você mesmo as escolheu. O meio é a parte que ninguém escolheu.

Um gradiente é uma mistura, e mistura precisa de matemática. Cores hex são valores RGB, então, por padrão, o navegador as mistura canal por canal.

No meio entre azul e amarelo, o vermelho fica no meio entre 0 e 255, o verde fica no meio entre 0 e 255, e o azul fica no meio entre 255 e 0. Todos os canais caem perto de 128. Vermelho, verde e azul iguais é a definição de cinza.

#0000FF para #FFFF00

Um gradiente de azul para amarelo que fica cinza chapado no meio

Com uma parada no meio #0EBAAE

O mesmo gradiente de azul para amarelo com um meio azul-petróleo que continua colorido de ponta a ponta
Mesmas duas pontas. À esquerda, a mistura passa direto por #808080. À direita, o meio é um azul-petróleo, então o gradiente fica vivo o caminho todo.

Isso não é o seu monitor nem um problema de compressão. É aritmética, e aparece sempre que as duas cores estão distantes no círculo cromático. Azul e amarelo são quase opostos exatos, o pior caso.

Solução 1: adicione uma parada no meio

A solução mais direta é parar de deixar o meio ao acaso. Adicione uma terceira parada de cor em 50% com uma cor que você escolheu.

css
background: linear-gradient(90deg, #0000FF, #0EBAAE, #FFFF00);

#0EBAAE é um azul-petróleo que fica entre azul e amarelo em cor percebida. A mistura agora vai de azul para azul-petróleo, depois de azul-petróleo para amarelo, e nenhuma das metades cruza o cinza.

Funciona em todos os navegadores e não exige sintaxe nova, então é a escolha segura para um design que precisa ficar igual em qualquer lugar. Escolha a cor do meio a olho, depois confira ao lado das duas pontas. O custo é que agora você cuida de três cores em vez de duas.

Solução 2: misture em OKLCH

A outra solução muda a matemática em vez de adicionar uma cor. O CSS permite escolher o espaço de cor em que a mistura acontece, e o OKLCH descreve cor como luminosidade, croma e matiz. Croma é o quão colorida uma cor é, então uma mistura que preserva o croma continua colorida.

css
background: linear-gradient(in oklch, #0000FF, #FFFF00);

Com in oklch, o navegador viaja ao redor do círculo cromático, passando por verdes e azuis-petróleo, em vez de cortar reto pelo centro cinza. Você mantém duas cores e o código continua curto. A MDN documenta isso como o método de interpolação de cor dentro da função de gradiente, e cores hex legadas só usam RGB quando você não escolhe nenhum, para manter compatibilidade com páginas antigas.

Duas coisas para saber. Algumas das cores desse trajeto podem cair fora do que uma tela consegue mostrar, então os navegadores as cortam para o valor exibível mais próximo. E a rota escolhida é o caminho mais curto ao redor do círculo, então confira se o percurso é um que você gosta. Nosso guia sobre cor OKLCH no CSS moderno explica o espaço com mais profundidade.

Solução 3: escolha vizinhas

A terceira solução não mexe no código. Ela escolhe cores que não conseguem se anular.

#0066FF para #FF8800

Um gradiente de azul para laranja que fica um cinza amarronzado sem graça no meio

#6440E0 para #E040A0

Um gradiente de violeta para rosa que continua vibrante de ponta a ponta
Azul e laranja são opostos, então se encontram num #807780 sem graça. Violeta e rosa são vizinhos, então se encontram num rico #A240C0.

Cores opostas se misturam em cinza. Vizinhas se misturam em algo entre elas que ainda é cor. Se uma marca combina dois opostos, você ainda pode usá-los num gradiente: coloque uma parada no meio entre eles, ou misture em OKLCH.

Azul para laranja, mistura padrão

O gradiente de azul para laranja com um meio cinza amarronzado

Azul para laranja, em oklch

O mesmo gradiente de azul para laranja misturado em OKLCH, passando por violeta e rosa em vez de cinza
As mesmas duas pontas de antes, mudando só a mistura. O cinza sumiu e o meio é um rosa vibrante.

Como conferir o seu próprio gradiente

  1. Olhe para o meio, não para as pontas.
  2. Dê nome à cor que você vê ali. Se o nome for cinza, marrom ou lama, como #808080 ou #807780, esse é o problema.
  3. Escolha uma das soluções acima e compare as duas versões lado a lado.

Um gradiente é tão bom quanto o seu pior ponto, e o pior ponto quase sempre é o meio.

Cinco gradientes para roubar

Cada um foi verificado para ter um meio que continua colorido. O primeiro tem uma parada no meio embutida. Os outros quatro usam matizes vizinhos. Toque em um código para copiar.

Um gradiente de azul passando por azul-petróleo até amarelo
Azul, azul-petróleo, amarelo. Toque em uma cor para copiar o código.
Um gradiente de violeta para rosa
Violeta para rosa. Toque em uma cor para copiar o código.
Um gradiente de azul para azul-petróleo
Azul para azul-petróleo. Toque em uma cor para copiar o código.
Um gradiente de laranja para rosa choque
Laranja para rosa choque. Toque em uma cor para copiar o código.
Um gradiente de verde para lima
Verde para lima. Toque em uma cor para copiar o código.
GradienteInícioMeioFimPor que funciona
Azul, azul-petróleo, amarelo#0000FF#0EBAAE#FFFF00Pontas opostas, salvas por uma parada real no meio
Violeta para rosa#6440E0nenhum#E040A0Vizinhas no círculo
Azul para azul-petróleo#2F5BEAnenhum#14B8A6Vizinhas no círculo
Laranja para rosa choque#FF7A00nenhum#FF2E93Vizinhas no círculo
Verde para lima#00A86Bnenhum#C6F432Vizinhas no círculo

Entregue isto ao seu desenvolvedor

css
.gradient-sunrise { background: linear-gradient(90deg, #0000FF, #0EBAAE, #FFFF00); } .gradient-violet { background: linear-gradient(90deg, #6440E0, #E040A0); } .gradient-ocean { background: linear-gradient(90deg, #2F5BEA, #14B8A6); } .gradient-sunset { background: linear-gradient(90deg, #FF7A00, #FF2E93); } .gradient-meadow { background: linear-gradient(90deg, #00A86B, #C6F432); } /* Two opposite colors, no middle stop: choose the blend space instead. */ .gradient-opposites { background: linear-gradient(in oklch, #0066FF, #FF8800); }

Se um navegador não entender in oklch, ele ignora a declaração inteira. Escreva primeiro uma linha linear-gradient(...) simples como fallback, depois a linha em OKLCH logo após.

FAQ

Por que meu gradiente fica cinza no meio?

Cores hex se misturam em RGB, e duas cores distantes no círculo cromático dão a média cinza. Azul #0000FF e amarelo #FFFF00 se encontram em #808080.

Como evito que um gradiente CSS pareça barrento?

Adicione uma parada de cor no meio com cor de verdade, misture em OKLCH com linear-gradient(in oklch, ...), ou escolha duas cores vizinhas no círculo cromático.

O que "in oklch" faz em um gradiente CSS?

Ele diz ao navegador para misturar as cores no espaço de cor OKLCH em vez de RGB, então o meio mantém a cor em vez de cair para o cinza.

Quais cores de gradiente combinam bem?

Vizinhas no círculo cromático, como violeta #6440E0 para rosa #E040A0 ou verde #00A86B para lima #C6F432. A mistura delas continua vibrante o caminho todo.

Todos os navegadores suportam gradientes em OKLCH?

Os navegadores modernos suportam, mas um que não suporte vai descartar a declaração. Adicione uma linha de gradiente simples antes dela como fallback.

Por que azul para amarelo vira cinza e não verde?

Porque a mistura toma o caminho reto pelo RGB, onde a média das duas é cinza. Um meio verde só aparece se você o adicionar como parada ou misturar em OKLCH.

Fontes

  • CSS Color Module Level 4, interpolation: cores sRGB legadas, como hex, interpolam em sRGB por padrão, e outros espaços são escolhidos com o método de interpolação de cor.
  • MDN, linear-gradient(): a sintaxe <color-interpolation-method>, in oklch.
  • MDN, OKLCH color: luminosidade, croma e matiz.
  • O ponto médio de (0, 0, 255) e (255, 255, 0) é (127,5, 127,5, 127,5), que é #808080 com croma OKLCH 0. Os pontos médios de #0066FF para #FF8800 (#807780) e de #6440E0 para #E040A0 (#A240C0) foram calculados em sRGB por nós. As barras desta página foram renderizadas a partir desses cálculos, e a barra em OKLCH corta as cores fora da faixa da tela, como os navegadores fazem.
  • Publicado originalmente como carrossel no UX Brainy.

Want gradients, color and every other detail designed as one system? Our team designs and builds product UI that holds up on every screen.

Get Started

More from Brainy Papers

Keep reading