CSS moderno

Guia do Modelo OKLCH no CSS Moderno

O OKLCH mudou a forma como desenvolvedores podem pensar em cor no CSS. Enquanto HEX descreve canais de tela e HSL parece intuitivo mas distorce brilho entre matizes, OKLCH aproxima a escrita da cor da forma como percebemos luminosidade, saturação e tonalidade. Isso permite criar paletas mais equilibradas, escalas mais previsíveis e temas que parecem consistentes aos olhos, não apenas aos números.

L Luminosidade perceptiva. Controla o quanto a cor parece clara ou escura.
C Croma. Controla a intensidade perceptiva da cor.
H Matiz. Define a posição da cor no círculo cromático em graus.

Guia do Modelo OKLCH no CSS Moderno para frontend

Durante muitos anos, HEX foi o formato padrão para declarar cores na web. Ele é compacto, amplamente suportado e fácil de copiar. O problema é que HEX não explica nada sobre percepção. Um azul e um amarelo podem ter valores numéricos parecidos em RGB, mas parecerem radicalmente diferentes em brilho. Isso dificulta a criação de escalas equilibradas para design systems.

O HSL tentou resolver esse problema separando matiz, saturação e luminosidade. A ideia é boa, mas a luminosidade do HSL não corresponde bem à luminosidade percebida pelo olho humano. Quando você mantém o mesmo valor de lightness e muda apenas o hue, algumas cores parecem muito mais claras ou muito mais escuras. Amarelos ficam visualmente luminosos demais, azuis e roxos podem parecer profundos demais, e a escala deixa de ser uniforme.

O OKLCH parte de um espaço perceptual mais moderno. Ele foi projetado para que alterações em luminosidade e croma se comportem de forma mais próxima da percepção humana. Isso é especialmente útil para criar paletas de interface, variações de hover, estados desabilitados, escalas de tema claro e escuro e tokens que precisam manter coerência visual.

Como a luminosidade perceptiva funciona

O olho humano não percebe todos os matizes com a mesma intensidade. Em geral, verdes e amarelos podem parecer mais luminosos que azuis com valores digitais semelhantes. Isso acontece porque nossa percepção visual responde de maneira desigual ao espectro. Sistemas como RGB e HEX descrevem emissão de luz em canais técnicos. Eles são ótimos para tela, mas não são ideais para desenhar escalas visuais coerentes.

Em uma paleta HSL, mudar o hue enquanto mantém a lightness pode gerar botões que parecem ter pesos diferentes. Um botão amarelo e um botão azul com o mesmo valor de HSL lightness raramente parecem igualmente claros. No OKLCH, o valor L tenta estabilizar essa percepção. Se você cria uma família de cores com L semelhante, a chance de elas parecerem equilibradas é muito maior.

Formato Ponto forte Limitação Uso recomendado
HEX Compatível e compacto Não expressa percepção visual Tokens finais, compatibilidade e documentação simples
HSL Sintaxe intuitiva para matiz e saturação Lightness varia visualmente entre matizes Ajustes rápidos e protótipos simples
OKLCH Mais coerente com a percepção humana Exige cuidado com gamut em cores muito intensas Design systems, escalas, temas e paletas consistentes

Estrutura de oklch com luminosidade, croma e matiz

A sintaxe básica usa três valores. O primeiro é a luminosidade, normalmente escrita como porcentagem ou número. O segundo é o croma, que define a intensidade da cor. O terceiro é o matiz em graus, equivalente ao ângulo no círculo cromático. A estrutura fica clara quando você lê a cor como intenção visual.

.button {
  background: oklch(58% 0.18 260);
  color: white;
}

Guia visual do código

A cor resultante fica em uma região azul intensa. O valor L em 58% mantém o botão escuro o bastante para texto branco, enquanto o croma 0.18 dá presença visual sem parecer neon.

L 58%
C 0.18
H 260

Nesse exemplo, 58% controla o brilho percebido, 0.18 controla a força cromática e 260 aponta para uma região azul. Para criar uma versão de hover mais escura, você pode reduzir apenas a luminosidade e preservar croma e matiz. Isso mantém a identidade da cor sem mudar sua personalidade.

.button {
  background: oklch(58% 0.18 260);
}

.button:hover {
  background: oklch(50% 0.18 260);
}

Comparação de estado

Normal
oklch(58% 0.18 260)
Hover
oklch(50% 0.18 260)

O hover reduz apenas a luminosidade. A cor continua sendo a mesma família azul, mas ganha profundidade visual e comunica interação sem mudar a identidade do componente.

Criando paletas consistentes com poucas linhas de CSS

O maior ganho do OKLCH aparece quando você define tokens a partir de uma mesma família cromática. Em vez de escolher manualmente dez tons e torcer para que eles pareçam coerentes, você pode variar a luminosidade de forma controlada, manter matiz estável e ajustar croma conforme o tom fica mais claro ou mais escuro.

:root {
  --brand-50: oklch(97% 0.03 260);
  --brand-100: oklch(93% 0.05 260);
  --brand-300: oklch(78% 0.11 260);
  --brand-500: oklch(58% 0.18 260);
  --brand-700: oklch(45% 0.17 260);
  --brand-900: oklch(31% 0.12 260);
}

.card-info {
  background: var(--brand-50);
  border-color: var(--brand-100);
  color: var(--brand-900);
}

.button-primary {
  background: var(--brand-500);
  color: white;
}

.button-primary:hover {
  background: var(--brand-700);
}

Escala visual gerada pelos tokens

50 97% 0.03 260
100 93% 0.05 260
300 78% 0.11 260
500 58% 0.18 260
700 45% 0.17 260
900 31% 0.12 260
Card de informação usando a escala

O fundo usa o tom 50, a borda usa o tom 100 e o texto usa o tom 900. A interface parece coerente porque todos os tokens compartilham a mesma família perceptiva.

Também é possível criar temas com `color-mix()` e OKLCH. Isso permite misturar cores em um espaço mais previsível, evitando resultados acinzentados ou desequilibrados. Em interfaces complexas, esse tipo de técnica reduz variações aleatórias e facilita manter consistência entre componentes.

:root {
  --brand: oklch(58% 0.18 260);
  --surface: oklch(98% 0.01 260);
  --brand-soft: color-mix(in oklch, var(--brand) 14%, white);
  --brand-strong: color-mix(in oklch, var(--brand) 82%, black);
}

Resultado visual do color-mix

Brand
oklch(58% 0.18 260)
Brand soft
14% brand, white
Brand strong
82% brand, black

A mistura em OKLCH preserva melhor a sensação da cor base. Isso ajuda a criar fundos suaves e tons fortes sem perder a relação visual com a marca.

Cuidados práticos ao usar OKLCH

O OKLCH é poderoso, mas ainda exige validação. Cores com croma muito alto podem sair do gamut em alguns monitores ou navegadores, especialmente em matizes muito vivos. Por isso, teste em dispositivos reais e sempre valide contraste. Uma paleta perceptualmente coerente ainda pode falhar em acessibilidade se texto e fundo não atingirem a razão mínima exigida.

Outra boa prática é manter fallbacks quando o projeto precisa suportar ambientes antigos. Você pode declarar primeiro uma cor em HEX e depois sobrescrever com OKLCH. Navegadores modernos usam a segunda declaração, enquanto ambientes sem suporte permanecem com a primeira.

.notice {
  background: #eef2ff;
  background: oklch(96% 0.03 260);
  color: #172033;
}

Fallback visual

Fallback HEX

Cor segura para navegadores antigos. O visual fica próximo e mantém a leitura.

background: #eef2ff;
Versão OKLCH

Navegadores modernos usam esta declaração e preservam melhor a intenção perceptiva.

background: oklch(96% 0.03 260);

Conclusão do Guia do Modelo OKLCH no CSS Moderno

OKLCH é superior ao HEX e ao HSL quando o objetivo é construir sistemas visuais consistentes. Ele não substitui completamente os formatos antigos, mas oferece uma base muito melhor para pensar em luminosidade, intensidade e matiz de forma perceptual. Para profissionais de frontend, isso significa menos ajustes manuais, paletas mais equilibradas e componentes que mantêm identidade visual em estados diferentes.

Use OKLCH para criar escalas, temas, variações de hover, superfícies suaves e paletas de marca. Depois, valide contraste, legibilidade e aparência em telas reais. O resultado é uma interface mais moderna, técnica e visualmente confiável.