Saltar al contenido principal

HEX vs RGB vs HSL

HEX, RGB y HSL son tres notaciones para los mismos colores dentro del mismo espacio, sRGB. HEX empaqueta los canales rojo, verde y azul en hexadecimal compacto; RGB enuncia directamente esas cantidades aditivas; HSL las reescribe como tono, saturación y luminosidad, de la forma en que razonamos las personas. El color nunca cambia; solo cambia qué edición resulta más fácil.

Solo local

HEX vs RGB vs HSL: explicación

Cada color de una página web termina su viaje siendo tres números: cuánta luz roja, verde y azul emitir. Los formatos se diferencian solo en cómo se escriben y agrupan esos números. #FF6600, rgb(255, 102, 0) y hsl(24, 100%, 50%) son el mismo naranja, convertibles sin pérdidas en ambas direcciones, porque todos apuntan a los mismos canales sRGB.

HEX ganó la cultura del copiar y pegar: las herramientas de diseño, los sitios de paletas y las guías de estilo se pasan de mano en mano cadenas de seis caracteres que identifican un color como un número de serie. RGB es el idioma nativo de las pantallas y de los datos de imagen. HSL es la más nueva de las tres en CSS y la más opinada sobre por qué acudes a un color — girar un tono, moderar una saturación, construir una escala. Ninguna es más correcta; cada una abarata una edición distinta.

Esta guía recorre cada notación, las variantes alfa, la función color() moderna de CSS y la comprobación de accesibilidad que prima sobre cualquier decisión estética. Todas las herramientas enlazadas por el camino se ejecutan por completo en tu navegador.

La manera más rápida de creerte que las tres notaciones son una misma cosa es ver un valor saltar entre ellas: pega un color en el conversor de colores y todos los formatos se actualizan a la vez — HEX, RGB, HSL y las opciones perceptuales incluidas.

Después de cualquier decisión de paleta, pasa el par de primer plano y fondo por el comprobador de contraste que informa de la proporción WCAG exacta y de si pasa en cada nivel — antes de que los usuarios con pantallas más flojas te lo descubran.

Un espacio de color, tres notaciones

sRGB es el espacio de color por defecto de la web: el espectro que muestra una pantalla típica, definido de modo que cada navegador, desde un teléfono hasta un monitor de estudio calibrado, entienda lo mismo por los mismos números. Cada canal va de 0 a 255, razón por la que 16,777,216 colores (256 al cubo) solían citarse como el tamaño de la paleta web. Una notación es solo una interfaz de usuario para esos tres números — y para el alfa, un cuarto número que controla la opacidad.

Como las tres notaciones se resuelven en los mismos canales, la conversión entre ellas es aritmética exacta, nunca aproximación. Una herramienta que informa de #FF6600 como hsl(24, 100%, 50%) no está dando una opinión; está haciendo la misma álgebra que define la especificación de CSS. Por eso mismo, el formato en que escribas no tiene ningún efecto sobre el renderizado — va puramente de la persona que edita la línea.

FormatoSe escribeVariante con alfaMás fácil para
HEX#FF6600 o #F60#FF6600AA (8 dígitos)Copiar un valor tal cual entre herramientas
RGBrgb(255, 102, 0)rgba(255, 102, 0, 0.67)Pensar en cantidades de luz por canal
HSLhsl(24, 100%, 50%)hsl(24 100% 50% / 0.67)Girar el tono o construir tintes y sombras
color()color(srgb 1 0.4 0)color(srgb 1 0.4 0 / 0.67)Nombrar un espacio explícitamente, más allá de sRGB

HEX: compacto, portable, opaco

Un código HEX de seis dígitos son tres bytes en hexadecimal: FF es 255, 66 es 102, 00 es cero. La forma se remonta al HTML más temprano y sobrevive porque es imbatible como identificador — corto, inequívoco, sin comillas. Si los dos dígitos de cada canal coinciden (FF, 66, 00), CSS también acepta tres dígitos: #F60. Desde CSS Color 4, añadir dos dígitos más suma el alfa: #FF6600AA es el mismo naranja con una opacidad de aproximadamente el 67%.

La debilidad de HEX es la composición. Mira #FF6600 y pregúntate cómo se verá un 15% más oscuro, o cuál es su complementario, y la respuesta exige descodificar hexadecimal en tu cabeza. Oscurecer #FF6600 a ojo produjo toda una generación de #E65C00 adivinados. HEX es el formato para almacenar un color, no el formato para razonar sobre uno — exactamente el hueco que HSL se inventó para llenar.

RGB: el modelo aditivo, dicho sin rodeos

Las pantallas no reflejan pintura; emiten luz, y RGB es aditivo: el negro es todos los canales apagados, el blanco es todos encendidos, y cada color es una mezcla. rgb(255, 102, 0) lo dice sin rodeos — rojo a tope, algo de verde, nada de azul. Esta es la notación que coincide con la física, lo que la convierte en la elección natural cuando depuras un valor renderizado, lees datos de imagen o mezclas luz de verdad (suma dos colores RGB y obtienes un resultado más brillante, lo contrario de mezclar pintura).

Su forma con alfa, rgba(), es anterior a la variante HEX de 8 dígitos. CSS Color 4 también modernizó la sintaxis: rgb(255 102 0 / 0.67) — espacios y una barra en lugar de comas — es equivalente, y la a ahora es opcional porque rgb() acepta cuatro valores. Los navegadores soportan ambas escrituras desde aproximadamente 2023.

HSL: la rueda legible para las personas

HSL reescribe los mismos canales como tono (un ángulo en la rueda de color, de 0 a 360: rojo en 0, verde en 120, azul en 240), saturación (0% es gris, 100% es plenamente vivo) y luminosidad (0% negro, 100% blanco). Su superpoder son las relaciones legibles. ¿Necesitas un estado hover un 10% más claro? hsl(24, 100%, 50%) pasa a hsl(24, 100%, 60%) — un número movido, la intención visible en el diff. ¿Necesitas una escala de marca de cinco pasos? Fija tono y saturación, mueve la luminosidad. En HEX, cada una de esas ediciones es un recálculo.

La advertencia honesta: la luminosidad de HSL no es perceptual. hsl(60, 100%, 50%) (amarillo) y hsl(240, 100%, 50%) (azul) reclaman ambas un 50% de luminosidad y, sin embargo, el amarillo arde mientras el azul se lee casi negro. Las escalas construidas sobre la luminosidad de HSL se ven, por tanto, desiguales al ojo. CSS Color 4 añadió oklch() para arreglar exactamente esto — una notación cilíndrica cuya luminosidad coincide con la percepción humana, de modo que los pasos iguales se ven iguales. Para escalas uniformes, oklch es la respuesta moderna; las herramientas de color de este sitio calculan las rampas en OKLab, el espacio perceptual que hay detrás.

TonoÁnguloAsociaciones comunes
Rojo0°Alertas, errores, apetito
Amarillo60°Advertencias, energía
Verde120°Éxito, seguridad, crecimiento
Cian180°Información, calma
Azul240°Confianza, enlaces, concentración
Magenta300°Acentos, creatividad

El alfa y la función color() moderna

Cada notación anterior lleva el alfa de la misma manera: como una fracción de opacidad de 0 a 1. Las escrituras se diferencian — #RRGGBBAA lo mete en hexadecimal (AA es 170, unas dos terceras partes de opacidad), rgba() y hsla() toman una fracción separada por comas, y la sintaxis moderna separada por espacios lo escribe tras una barra. Todas producen resultados idénticos; la forma HEX de 8 dígitos es simplemente la más compacta y la que más exportan las herramientas de diseño.

color() es el cambio mayor. Nombra el espacio de color explícitamente — color(srgb r g b) es el espacio de siempre escrito tal cual, mientras que color(display-p3 ...) se dirige al espacio más amplio de las pantallas modernas, y color(oklch ...) expone el modelo perceptual. sRGB sigue siendo el valor seguro por defecto — el contenido creado en él se renderiza de forma previsible en todas partes —, mientras que los colores display-p3 solo aterrizan donde la sintaxis está soportada, prácticamente todos los navegadores evergreen desde 2023.

  • #RRGGBBAA — alfa en hexadecimal, AA = 170 ≈ 67% de opacidad.
  • rgba(255, 102, 0, 0.67) — sintaxis heredada con comas, todavía universal.
  • rgb(255 102 0 / 0.67) — sintaxis de CSS Color 4; la a ahora es opcional.
  • color(display-p3 1 0.4 0 / 0.67) — color de espacio más amplio, con el espacio nombrado de entrada.

Contraste: la comprobación que prima sobre el gusto

Ninguna elección de notación importa si las personas no pueden leer el texto. El contraste WCAG exige una proporción de al menos 4.5:1 entre el texto y su fondo para texto normal en el nivel AA, 3:1 para texto grande (aproximadamente 24 px regular o 19 px negrita en adelante) y 7:1 para el nivel AAA, más estricto. La proporción se calcula a partir de la luminancia relativa, que es una propiedad del color en sí — la notación en que lo escribas es irrelevante, que es una manera más de que todos estos formatos son el mismo color.

El flujo práctico es mecánico: elige colores como quieras y verifica los pares antes de publicar. El texto del cuerpo sobre su fondo, el texto placeholder sobre los inputs, el texto blanco sobre el color de marca — cada par necesita su número. Un comprobador de contraste lo informa al instante — más barato que retocar una paleta inaccesible con la fecha de entrega encima.

Preguntas frecuentes

¿Las herramientas de color de este sitio suben lo que pego?

No. La conversión, la selección y las comprobaciones de contraste se ejecutan todas como JavaScript en la pestaña de tu navegador — no hay ningún paso de subida. Compruébalo en DevTools: abre el panel Network, convierte algo y mira cómo la lista de peticiones se queda vacía. La Content-Security-Policy del sitio también prohíbe que los scripts de la página hagan conexiones salientes.

¿Pueden HEX y RGB producir colores distintos alguna vez?

Nunca, cuando ambos describen sRGB. #FF6600 y rgb(255, 102, 0) son byte a byte los mismos tres valores de canal, y la conversión entre las notaciones es aritmética definida. Las diferencias solo aparecen cuando se nombra un espacio de color explícitamente — color(display-p3 ...) puede alcanzar colores que sRGB no puede representar, y eso es una propiedad del espacio, no de la notación.

¿Qué formato debo usar en mi CSS?

Usa HEX para valores que se almacenan y se copian como identificadores — tokens de marca, variables de un sistema de diseño. Usa HSL cuando el valor vaya a derivarse: estados hover, tintes, sombras, temas que giran el tono. RGB encaja con el trabajo cercano a la imagen y en cualquier sitio donde las cantidades por canal sean el modelo mental. La coherencia dentro de una base de código le gana a cualquier respuesta única correcta.

¿Qué es #RRGGBBAA y cuándo debo usarlo?

Un código HEX de ocho dígitos donde los dos últimos dígitos son el alfa: 00 totalmente transparente, FF totalmente opaco, AA aproximadamente el 67%. Es el equivalente compacto de rgba(255, 102, 0, 0.67) y está soportado en todos lados donde lo está el rgba() antiguo. Recurre a él cuando una herramienta de diseño te entrega ocho dígitos.

¿La luminosidad de HSL es lo mismo que lo brillante que se ve un color?

No, y es la trampa que muerde a quienes construyen paletas. La luminosidad de HSL es un remapeo matemático de los canales RGB, no perceptual: el amarillo y el azul con la misma luminosidad del 50% se ven radicalmente distintos de brillo. Para escalas que se vean uniformes, usa oklch() de CSS Color 4, cuya luminosidad sigue la percepción humana — o una herramienta cuyas rampas se calculen en un espacio perceptual, como las de este sitio.

¿Qué proporción de contraste necesito para accesibilidad?

WCAG AA exige 4.5:1 para texto normal y 3:1 para texto grande (aproximadamente 24 px regular o 19 px negrita en adelante); AAA las sube a 7:1 y 4.5:1. La proporción viene de la luminancia relativa, así que la notación es irrelevante. Comprueba cada par texto-fondo, incluidos los placeholders y los estados deshabilitados.

¿Dónde puedo leer las normas citadas aquí?