Saltar al contenido

CSS, de a poco

Curso de CSS

Color

Lección 04 de 37 · 3 min

CSS acepta el mismo color escrito de varias formas. Todas sirven, pero no todas te dejan razonar igual de bien sobre qué tan claro u oscuro se va a ver.

Cuatro formas de escribir un color

Estas son las notaciones que más vas a cruzarte:

  1. Hexadecimal#ff0000Rojo, verde y azul, de 00 a ff. Compacto, pero difícil de leer.
  2. RGBrgb()Los mismos tres canales, de 0 a 255.
  3. HSLhsl()Tono en grados, saturación y luminosidad en porcentaje. Más fácil de ajustar a mano.
  4. OKLCHoklch()Luminosidad, croma y tono, pensados según cómo ve el ojo y no según cómo se mezclan los canales.

El mismo rojo, escrito cuatro veces:

Una muestra roja y sus cuatro nombres: #ff0000, rgb(255 0 0), hsl(0 100% 50%) y oklch(0.628 0.258 29.23).

La sintaxis moderna separa los valores con espacios. La vieja, con comas (rgb(255, 0, 0)), sigue funcionando, pero oklch() solo acepta espacios.

Por qué la luminosidad de hsl engaña

En hsl(), la luminosidad es el punto medio entre el canal más alto y el más bajo, no lo que percibe el ojo. Con l en 50%, un amarillo y un azul dicen ser igual de claros, y no lo son.

Mové los controles y compará las dos filas: el número naranja debajo de cada muestra es su luminosidad medida en oklch, y la regla del final ubica las doce en un mismo eje.

oklch(L C H)oklch(0.7 0.1 250)
Aa

Azul glaciarL 0.70

muestra.css
.muestra {
background: oklch(0.7 0.1 250);
}
muestra.html
<div class="bg-[oklch(0.7_0.1_250)]">Aa</div>

Medidos en oklch, hsl(60 80% 50%) tiene una luminosidad de 0.89 y hsl(240 80% 50%), de 0.44: el amarillo tiene el doble de luminosidad. La fila de oklch mantiene la misma luminosidad en los seis tonos, y por eso se ven parejos.

Eso es lo que se llama uniformidad perceptual: si dos colores tienen la misma luminosidad en oklch, se ven aproximadamente igual de claros. Sirve para elegir un texto con contraste parecido sobre cualquier fondo, o para que ningún color de un gráfico grite más que los otros.

oklch en la práctica

Para armar una paleta, dejá fijos la croma y el tono y cambiá solo la luminosidad. Los pasos se ven igual de espaciados:

Cuatro azules con croma 0.08 y tono 250, y luminosidad 0.80, 0.65, 0.50 y 0.35: los pasos se ven igual de espaciados.
paleta.css
:root {
--azul-300: oklch(0.8 0.08 250);
--azul-500: oklch(0.65 0.08 250);
--azul-700: oklch(0.5 0.08 250);
--azul-900: oklch(0.35 0.08 250);
}

La transparencia va después de una barra: oklch(0.7 0.15 250 / 50%). Y para mezclar dos colores, color-mix() deja elegir en qué espacio se mezclan:

styles.css
.boton:hover {
background: color-mix(in oklch, var(--azul-500) 80%, white);
}

Si subís mucho la croma, algunos colores quedan fuera de lo que la pantalla puede mostrar. No es un error: el navegador lo lleva al color más cercano que sí puede pintar.

En Tailwind

La paleta de Tailwind v4 ya está definida en oklch: --color-red-500 vale oklch(63.7% 0.237 25.331). Cada color del tema genera utilidades como bg-red-500, text-red-500 o border-red-500. Para un color que no está en el tema, escribilo entre corchetes con guiones bajos en lugar de espacios, o apuntá a una variable con paréntesis:

CSSTailwind
background-color: var(--color-red-500)bg-red-500
color: var(--color-sky-500)text-sky-500
rojo al 50% de opacidadbg-red-500/50
background-color: oklch(0.7 0.1 250)bg-[oklch(0.7_0.1_250)]
background-color: var(--mi-color)bg-(--mi-color)

Para sumar un color propio al tema, definilo en @theme con el prefijo --color- y Tailwind genera bg-marca, text-marca y el resto:

app.css
@import "tailwindcss";
@theme {
--color-marca: oklch(0.65 0.08 250);
}
boton.html
<button class="bg-marca text-white hover:bg-marca/80">
Guardar
</button>