Saltar al contenido

Conversor de colores y verificador de contraste

Pasa un color a HEX, RGB, HSL, HWB, LAB, LCH y OKLCH de una vez y comprueba si el contraste WCAG entre el texto y el fondo cumple los niveles AA y AAA.

Todos los formatos

  • HEX#3366ff
  • RGBrgb(51, 102, 255)
  • HSLhsl(225, 100%, 60%)
  • HWBhwb(225 20% 0%)
  • LABlab(47.4 26.93 -82.47)
  • LCHlch(47.4 86.76 288.08)
  • OKLCHoklch(0.5726 0.2338 265.28)

Verificador de contraste

Relación de contraste14,67:1
AA · texto normal (4,5:1)
✓ Aprobado
AA · texto grande (3:1)
✓ Aprobado
AAA · texto normal (7:1)
✓ Aprobado
AAA · texto grande (4,5:1)
✓ Aprobado

Vista previa de texto grande (Aa)

Esta es una frase de ejemplo en texto normal para comprobar el contraste.

Lo que introduces se procesa solo en este navegador y nunca se envía a un servidor. Cómo funciona

El mismo color verde representado como HEX #47765F y RGB 71, 118, 95

Cómo se usa

La pantalla tiene dos partes, el conversor de colores arriba y el verificador de contraste abajo, y lo que hagas en una no afecta a la otra.

Conversor de colores

  1. Escribe un valor de color CSS en Color o elígelo con el selector de la izquierda. Se leen los HEX de 3, 4, 6 y 8 dígitos, con o sin #; las dos maneras de escribir RGB, rgb(51, 102, 255) y rgb(51 102 255), y nombres de color como rebeccapurple.
  2. Con el control deslizante Alfa (opacidad), junto a la muestra de color, cambias la transparencia. Lo notarás en cuánto se deja ver el fondo de cuadros de detrás de la muestra.
  3. En Todos los formatos aparecen siete líneas (HEX, RGB, HSL, HWB, LAB, LCH y OKLCH), cada una con su botón de copiar. Si el alfa baja del 100 %, se añade una línea más, «HEX (con alfa)», escrita con 8 dígitos.

Verificador de contraste

  1. Introduce el Color del texto y el Color de fondo. «Intercambiar colores» los cambia entre sí.
  2. En Relación de contraste aparece la proporción y, debajo, cuatro casillas indican «Aprobado» o «No aprobado» para cada criterio.
  3. La vista previa del final muestra los dos colores con texto grande y con texto normal.

Un color, siete maneras de escribirlo

El valor que viene de entrada, #3366ff, se convierte así:

Formato Resultado Qué significan los números
HEX #3366ff Rojo, verde y azul con dos dígitos hexadecimales cada uno
RGB rgb(51, 102, 255) Rojo, verde y azul de 0 a 255
HSL hsl(225, 100%, 60%) Tono, saturación y luminosidad
HWB hwb(225 20% 0%) Tono, cantidad de blanco mezclado y cantidad de negro mezclado
LAB lab(47.4 26.93 -82.47) Luminosidad, eje verde-rojo y eje azul-amarillo
LCH lch(47.4 86.76 288.08) Luminosidad, croma y tono
OKLCH oklch(0.5726 0.2338 265.28) Luminosidad, croma y tono

HEX y RGB son los mismos números escritos en bases distintas, y HSL y HWB reparten esos números en ejes más cómodos de manejar para una persona. LAB, LCH y OKLCH son espacios de color construidos a partir de cómo percibimos el color; OKLCH es un LCH retocado para ser más uniforme a la vista, y en CSS se puede usar directamente con oklch(). El mismo azul tiene un ángulo de tono de 225 en HSL, de 288.08 en LCH y de 265.28 en OKLCH. Cada espacio de color mide el ángulo con su propia referencia, de modo que copiar los números de un formato en otro da un color distinto.

La luminosidad de HSL y la de OKLCH

La luminosidad de HSL es la media entre el mayor y el menor de los valores de rojo, verde y azul, y no se corresponde bien con el brillo que ve el ojo. El amarillo puro hsl(60 100% 50%) y el azul puro hsl(240 100% 50%) tienen la misma luminosidad HSL, un 50 %. Pásalos por el conversor y verás esto:

  • El amarillo es oklch(0.968 0.211 109.77): luminosidad OKLCH de 0,968.
  • El azul es oklch(0.452 0.3132 264.05): luminosidad OKLCH de 0,452.

Sobre un fondo blanco la diferencia salta a la vista. En el verificador de contraste, con #ffffff como color de fondo, el amarillo #ffff00 se queda en 1,07:1 y apenas se distingue, mientras que el azul #0000ff llega a 8,59:1. Para montar una paleta de colores que solo se diferencien en el tono y tengan un brillo parecido, el resultado queda más parejo igualando la luminosidad de OKLCH que la de HSL.

Así se calcula el contraste WCAG

Se usa la fórmula de WCAG 2. Para cada color se obtiene la luminancia relativa (relative luminance: la suma ponderada de los valores de rojo, verde y azul una vez linealizados); se llama L1 a la del color más claro y L2 a la del más oscuro, y se calcula (L1 + 0,05) ÷ (L2 + 0,05). Dos colores iguales dan 1:1; negro y blanco, 21:1.

Criterio en pantalla Relación necesaria
AA · texto normal 4,5:1
AA · texto grande 3:1
AAA · texto normal 7:1
AAA · texto grande 4,5:1

Se considera «texto grande» el de 18 pt o más (unos 24 px) en grosor normal y el de 14 pt o más (unos 19 px) en negrita. AA es el nivel que exige la mayoría de las pautas de accesibilidad; AAA es más estricto.

  • Los colores que vienen de entrada, texto #1f2937 sobre fondo #ffffff, dan 14,67:1 y aprueban los cuatro criterios.
  • El gris #767676 sobre fondo blanco da 4,54:1 y aprueba AA para texto normal. Un punto más claro, #777777, se queda en 4,47:1 y no aprueba.

La relación que se ve en pantalla no se redondea: se trunca a partir del segundo decimal. Así se evita que una combinación de 4,499:1 se muestre como 4,50:1 y figure al mismo tiempo como no aprobada. Para decidir si aprueba se usa el valor sin truncar.

El contraste de los colores semitransparentes

La fórmula de WCAG solo contempla colores opacos. Por eso, cuando un color tiene alfa, primero se compone el color que se vería realmente en pantalla y después se calcula.

  • Un color de fondo semitransparente se trata como si estuviera colocado sobre una base blanca.
  • Un color de texto semitransparente se trata como si estuviera colocado sobre ese fondo ya resuelto.

Texto rgb(0 0 0 / 50%) sobre fondo #ffffff equivale a un texto gris: 3,97:1, que solo aprueba AA para texto grande. En una página real, si detrás del fondo semitransparente hay una foto o un color que no es blanco, el resultado será otro. En ese caso mide con el color de fondo que se ve finalmente en pantalla, escrito como valor opaco.

Colores fuera de la gama sRGB

Con LAB, LCH y OKLCH se pueden escribir colores que una pantalla sRGB corriente no es capaz de mostrar. oklch(70% 0.3 150) es uno de ellos. Al introducirlo aparece el aviso de que está fuera de la gama y los resultados son estos:

  • El HEX es #00cb00 y el RGB, rgb(0, 203, 0). No es el color que has escrito, sino ese color recortado para que quepa en sRGB.
  • Las líneas LAB, LCH y OKLCH conservan el color original, sin recortar.
  • Las líneas HSL y HWB son, igual que HEX y RGB, el color recortado pasado a esos formatos. Dan hsl(120, 100%, 39.84%) y hwb(120 0% 20.32%), sin números fuera de rango.

La muestra de color y el selector de color enseñan también el color recortado.

Fuentes

Preguntas frecuentes

He movido el control deslizante del alfa y el valor que había escrito se ha convertido en rgb().

El control reescribe el valor del cuadro en notación rgb() con el alfa incluido. Si escribes oklch(62% 0.19 259) y lo llevas al 50 %, el cuadro pasa a contener rgba(53, 129, 246, 0.5). No se vuelve a la notación original, así que, si necesitas el valor OKLCH con alfa, mueve el control y copia después la línea OKLCH de «Todos los formatos». Ten en cuenta que, al hacerlo, un color fuera de la gama sRGB queda recortado a un valor de dentro de la gama.

He escrito #3366ff80 y el alfa sale como 0.5. ¿Es un 50 % exacto?

Los dos últimos dígitos de un HEX de 8 cifras, 80, son el 128 en una escala de 255, y 128 ÷ 255 = 0,50196… No es un 50 % exacto. Las líneas RGB, HSL, HWB, LAB, LCH y OKLCH redondean todas el alfa a dos decimales y muestran 0.5. Si necesitas exactamente 0.5, escribe el alfa como porcentaje o como decimal, por ejemplo rgb(51 102 255 / 50%).

¿Cambia la relación de contraste si intercambio el color del texto y el de fondo?

Si los dos colores son opacos, no: #3366ff y #ffffff dan 4,68:1 pongas cuál pongas como texto. Con un color semitransparente sí puede cambiar. Texto rgb(255 255 255 / 50%) sobre fondo #000000 da 5,28:1; al invertirlos con «Intercambiar colores», el fondo blanco semitransparente, colocado sobre una base blanca, se queda en blanco sin más y el resultado es 21:1.

¿Por qué no se leen los valores escritos con oklab() o con color(display-p3 …)?

La herramienta lee HEX, rgb(), hsl(), hwb(), lab(), lch(), oklch(), nombres de color y transparent. Las funciones oklab() y color(), palabras clave como currentColor y las variables escritas con var() no se leen, y aparece el aviso «No se reconoce el formato del color.» Un valor OKLab hay que pasarlo antes a oklch() para poder introducirlo.

Software de código abierto utilizado: culori (MIT)

Última actualización: