Pular para o conteúdo principal

HEX vs RGB vs HSL

HEX, RGB e HSL são três notações para as mesmas cores no mesmo gamute, o sRGB. HEX empacota os canais vermelho, verde e azul em hexadecimal compacto; RGB enuncia diretamente essas quantidades aditivas; HSL as reescreve como matiz, saturação e luminosidade, do jeito como humanos raciocinam. A cor nunca muda; muda apenas qual edição é mais fácil.

Só local

HEX vs RGB vs HSL: explicação

Toda cor em uma página web termina a sua jornada como três números: quanta luz vermelha, verde e azul emitir. Os formatos diferem apenas em como esses números são escritos e agrupados. #FF6600, rgb(255, 102, 0) e hsl(24, 100%, 50%) são o mesmo laranja, conversíveis sem perdas nas duas direções, porque todos endereçam os mesmos canais sRGB.

O HEX venceu a cultura do copiar-e-colar: ferramentas de design, sites de paletas e guias de estilo circulam strings de seis caracteres que identificam uma cor como um número de série. RGB é a língua nativa das telas e dos dados de imagem. HSL é o mais novo dos três no CSS e o mais opinativo sobre por que você está buscando uma cor — girar uma matiz, amortecer uma saturação, construir uma escala. Nenhum é mais correto; cada um torna uma edição diferente barata.

Este guia percorre cada notação, as variantes com alfa, a função color() moderna do CSS e a verificação de acessibilidade que supera toda escolha estética. Todas as ferramentas linkadas ao longo do caminho rodam inteiramente no seu navegador.

A maneira mais rápida de se convencer de que as três notações são uma coisa só é ver um valor virar entre elas: cole uma cor em o conversor de cores e todos os formatos se atualizam de uma vez — HEX, RGB, HSL e as opções perceptuais incluídas.

Depois de qualquer decisão de paleta, passe o par de primeiro plano e fundo por o verificador de contraste que reporta a proporção exata do WCAG e se ela passa em cada nível — antes que usuários com telas mais fracas descubram por você.

Um gamute, três notações

O sRGB é o espaço de cores padrão da web: o espectro que uma tela típica mostra, definido para que todo navegador, de um celular a um monitor de estúdio calibrado, queira dizer a mesma cor com os mesmos números. Cada canal vai de 0 a 255, e é por isso que 16,777,216 cores (256 ao cubo) costumavam ser citadas como o tamanho da paleta da web. Uma notação é apenas uma interface de usuário para esses três números — e para o alfa, um quarto número que controla a opacidade.

Como as três notações resolvem para os mesmos canais, a conversão entre elas é aritmética exata, nunca aproximação. Uma ferramenta que reporta #FF6600 como hsl(24, 100%, 50%) não está oferecendo uma opinião; está fazendo a mesma álgebra que a especificação do CSS define. É também por isso que o formato em que você escreve tem efeito zero na renderização — trata-se puramente do humano que edita a linha.

FormatoEscrito comoVariante com alfaMais fácil quando você está
HEX#FF6600 ou #F60#FF6600AA (8 dígitos)Copiando um valor literalmente entre ferramentas
RGBrgb(255, 102, 0)rgba(255, 102, 0, 0.67)Pensando em quantidades de luz por canal
HSLhsl(24, 100%, 50%)hsl(24 100% 50% / 0.67)Girando a matiz ou construindo tons e sombras
color()color(srgb 1 0.4 0)color(srgb 1 0.4 0 / 0.67)Nomeando um espaço explicitamente, além do sRGB

HEX: compacto, portátil, opaco

Um código HEX de seis dígitos são três bytes em hexadecimal: FF é 255, 66 é 102, 00 é zero. A forma data do HTML mais primitivo e sobrevive porque é imbatível como identificador — curta, inequívoca, sem aspas. Se os dois dígitos de cada canal são iguais (FF, 66, 00), o CSS também aceita três dígitos: #F60. Desde o CSS Color 4, acrescentar dois dígitos a mais adiciona alfa: #FF6600AA é o mesmo laranja com cerca de 67% de opacidade.

A fraqueza do HEX é a composição. Olhe para #FF6600 e pergunte como ele ficará 15% mais escuro, ou qual é o seu complementar, e a resposta exige decodificar hexadecimal na cabeça. Escurecer #FF6600 a olho produziu uma geração de palpites #E65C00. HEX é o formato para armazenar uma cor, não o formato para raciocinar sobre uma — exatamente a lacuna que o HSL foi inventado para preencher.

RGB: o modelo aditivo, enunciado sem rodeios

Telas não refletem tinta; elas emitem luz, e o RGB é aditivo: preto é todos os canais desligados, branco é todos ligados, e toda cor é uma mistura. rgb(255, 102, 0) diz isso sem rodeios — vermelho total, um pouco de verde, nada de azul. É a notação que combina com a física, o que a torna a escolha natural quando você está depurando um valor renderizado, lendo dados de imagem ou misturando luz de fato (some duas cores RGB e você obtém um resultado mais brilhante, o oposto de misturar tintas).

A sua forma com alfa, rgba(), precede a variante HEX de 8 dígitos. O CSS Color 4 também modernizou a sintaxe: rgb(255 102 0 / 0.67) — espaços e uma barra em vez de vírgulas — é equivalente, e o a agora é opcional, já que rgb() aceita quatro valores. Navegadores suportam as duas grafias desde cerca de 2023.

HSL: a roda legível para humanos

O HSL reescreve os mesmos canais como matiz (um ângulo na roda de cores, de 0 a 360: vermelho em 0, verde em 120, azul em 240), saturação (0% é cinza, 100% é totalmente vívido) e luminosidade (0% preto, 100% branco). O seu superpoder são relações legíveis. Precisa de um estado de hover 10% mais claro? hsl(24, 100%, 50%) vira hsl(24, 100%, 60%) — um número movido, a intenção visível no diff. Precisa de uma escala de marca de cinco passos? Mantenha matiz e saturação, varie a luminosidade. No HEX, cada uma dessas edições é um recálculo.

A ressalva honesta: a luminosidade do HSL não é perceptual. hsl(60, 100%, 50%) (amarelo) e hsl(240, 100%, 50%) (azul) alegam ambas 50% de luminosidade, mas o amarelo incendeia enquanto o azul quase se lê como preto. Escalas construídas sobre a luminosidade do HSL, portanto, parecem desiguais ao olho. O CSS Color 4 adicionou oklch() para corrigir exatamente isso — uma notação cilíndrica cuja luminosidade acompanha a percepção humana, de modo que passos iguais parecem iguais. Para escalas uniformes, oklch é a resposta moderna; as ferramentas de cores deste site calculam rampas em OKLab, o espaço perceptual por trás dela.

MatizÂnguloAssociações comuns
Vermelho0°Alertas, erros, apetite
Amarelo60°Avisos, energia
Verde120°Sucesso, segurança, crescimento
Ciano180°Informação, calma
Azul240°Confiança, links, foco
Magenta300°Destaques, criatividade

Alfa e a função color() moderna

Toda notação acima carrega o alfa da mesma maneira: como uma fração de 0 a 1 da opacidade. As grafias diferem — #RRGGBBAA coloca em hexadecimal (AA é 170, cerca de dois terços de opacidade), rgba() e hsla() recebem uma fração separada por vírgulas, e a sintaxe moderna separada por espaços escreve depois de uma barra. Todas produzem resultados idênticos; a forma HEX de 8 dígitos é simplesmente a mais compacta e a que as ferramentas de design mais exportam.

A color() é a mudança maior. Ela nomeia o espaço de cores explicitamente — color(srgb r g b) é o gamute familiar escrito por extenso, enquanto color(display-p3 ...) endereça o gamute mais amplo das telas modernas, e color(oklch ...) expõe o modelo perceptual. O sRGB continua sendo o padrão seguro — conteúdo criado nele renderiza de forma previsível em todo lugar —, enquanto cores display-p3 só chegam onde a sintaxe é suportada, essencialmente todos os navegadores evergreen desde 2023.

  • #RRGGBBAA — alfa em hex, AA = 170 ≈ 67% de opacidade.
  • rgba(255, 102, 0, 0.67) — sintaxe legada com vírgulas, ainda universal.
  • rgb(255 102 0 / 0.67) — sintaxe do CSS Color 4; o a agora é opcional.
  • color(display-p3 1 0.4 0 / 0.67) — cor de gamute mais amplo, espaço nomeado logo de início.

Contraste: a verificação que supera o gosto

Nenhuma escolha de notação importa se os usuários não conseguem ler o texto. O contraste do WCAG exige uma proporção de pelo menos 4.5:1 entre o texto e o seu fundo para texto normal no nível AA, 3:1 para texto grande (aproximadamente 24 px regular ou 19 px negrito e acima) e 7:1 para o nível AAA mais estrito. A proporção é calculada a partir da luminância relativa, que é uma propriedade da própria cor — a notação em que você a escreveu é irrelevante, o que é mais uma maneira de todos esses formatos serem a mesma cor.

O fluxo prático é mecânico: escolha as cores como quiser, depois verifique os pares antes de publicar. Texto corrido sobre o seu fundo, texto de placeholder sobre inputs, texto branco sobre a cor da marca — cada par precisa do seu número. Um verificador de contraste o reporta instantaneamente — mais barato do que adaptar uma paleta inacessível sob prazo.

Perguntas frequentes

As ferramentas de cores deste site enviam o que eu colo?

Não. Conversão, seleção e verificações de contraste rodam como JavaScript na aba do seu navegador — não há etapa de envio. Confirme no DevTools: abra o painel Network, converta algo e veja a lista de requisições permanecer vazia. A Content-Security-Policy do site também proíbe que os scripts da página façam conexões de saída.

HEX e RGB produzem cores diferentes em algum caso?

Nunca, quando ambos descrevem sRGB. #FF6600 e rgb(255, 102, 0) são byte a byte os mesmos três valores de canal, e a conversão entre as notações é aritmética definida. Diferenças só aparecem quando um espaço de cores é nomeado explicitamente — color(display-p3 ...) pode alcançar cores que o sRGB não representa, o que é uma propriedade do espaço, não da notação.

Qual formato devo usar no meu CSS?

Use HEX para valores armazenados e copiados como identificadores — tokens de marca, variáveis de design system. Use HSL quando o valor será derivado: estados de hover, tons, sombras, temas que giram a matiz. RGB serve para trabalho próximo de imagens e onde as quantidades de canal são o modelo mental. Consistência dentro de uma base de código vence qualquer resposta única certa.

O que é #RRGGBBAA e quando devo usá-lo?

Um código HEX de oito dígitos em que os dois últimos são alfa: 00 totalmente transparente, FF totalmente opaco, AA cerca de 67%. É o equivalente compacto de rgba(255, 102, 0, 0.67) e é suportado em todo lugar em que o antigo rgba() é. Recorra a ele quando uma ferramenta de design entregar oito dígitos.

A luminosidade do HSL é o mesmo que o quão brilhante uma cor parece?

Não, e essa é a armadilha que morde quem constrói paletas. A luminosidade do HSL é um remapeamento matemático dos canais RGB, não perceptual: amarelo e azul com a mesma luminosidade de 50% parecem muito diferentes em brilho. Para escalas com aparência uniforme, use oklch() do CSS Color 4, cuja luminosidade acompanha a percepção humana — ou uma ferramenta cujas rampas são calculadas em um espaço perceptual, como as deste site.

Que proporção de contraste preciso para acessibilidade?

WCAG AA exige 4.5:1 para texto normal e 3:1 para texto grande (cerca de 24 px regular ou 19 px negrito e acima); AAA eleva esses valores para 7:1 e 4.5:1. A proporção vem da luminância relativa, então a notação é irrelevante. Verifique cada par de texto e fundo, incluindo placeholders e estados desabilitados.

Onde posso ler os padrões citados aqui?