Sintaxis de colores relativos de CSS

Crea colores nuevos a partir de los canales y valores de otro color.

Adam Argyle
Adam Argyle

En Chrome 119 es una función de color muy potente del nivel de color 5 de CSS. Sintaxis de colores relativos crea una ruta suave para la manipulación del color dentro de CSS y ofrece maneras de a los autores y diseñadores:

Antes de la sintaxis de color relativo, para modificar la opacidad de un color, debes crear propiedades personalizadas para los canales de un color, generalmente HSL, y ensamblar con un color final y un color final de la variante. Esto significa gestionar una gran cantidad de piezas de color, que rápidamente pueden volverse una carga.

:root {
  --brand-hue: 300deg;
  --brand-saturation: 75%;
  --brand-lightness: 50%;

  --brand-hsl:
    var(--brand-hue)
    var(--brand-saturation)
    var(--brand-lightness);

  --brand-color: hsl(var(--brand-hsl));

  /* all this work just so I can set the opacity to 50% in a variant */
  --brand-color-variant: hsl(var(--brand-hsl) / 50%);
}

Después de la sintaxis de color relativo, puedes crear un color de marca con cualquier espacio de color. o la sintaxis que necesites, y crea una variante de media opacidad con mucho menos código. Es y es más fácil leer la intención de los estilos y el sistema.

:root {
  --brand-color: hsl(300deg 75% 50%);
  --brand-color-variant: hsl(from var(--brand-color) h s l / 50%);
}

Esta publicación te ayudará a aprender la sintaxis y a demostrar manipulaciones de color comunes.

Si prefieres usar un video, puedes tratar casi todo el artículo que aparece a continuación en este desafío de la GUI.

Descripción general de la sintaxis

El objetivo de la sintaxis de color relativo es permitir derivar un color de otro color. El color base se denomina color de origen, este es el color que aparece después de la nueva palabra clave from. El navegador convertir, dividir este color de origen y ofrecer las partes como variables para usar en la nueva definición de color.

R
se muestra el diagrama de la sintaxis rgb(de verde r g b / alpha) con una flecha
dejando la parte superior del verde y haciendo un arco hacia el RGB que comienza con la función,
esta flecha se divide en 4 flechas que luego apuntan a su variable relevante. El
4 flechas son rojas, verdes, azules y alfa. El rojo y el azul tienen un valor de 0, y el verde
es 128 y alfa es 100%.

En el diagrama anterior, se muestra que el color de origen green se convierte en el espacio de color del nuevo color se convirtieron en números individuales representados como r, g, b y alpha variables, que luego se usan directamente como valores nuevos de un color rgb().

Si bien en esta imagen se muestra el desglose, el proceso y las variables, cambiando el color. Las variables se devuelven al color sin cambios, por lo que lo que da como resultado una imagen estática de color verde.

La palabra clave from

La primera parte de la sintaxis que hay que aprender es la parte from <color> de suma de especificando un color. Va justo antes de que especifiques los valores. Aquí tienes un código ejemplo en el que todo lo que se agregó es from green, justo antes de los valores para rgb().

.syntax-introduction_same-colors {
  color: green;
  color: rgb(0 128 0);
  color: rgb(from green r g b);    /* result = rgb(0 128 0) */
}

Esa palabra clave from, cuando se la ve como el primer parámetro en notación funcional, convierte la definición del color en un color relativo. Después de la palabra clave from, CSS espera un color, un color que inspirará el próximo color.

Conversión de color

En términos más sencillos, convierte el verde en canales r g y b para usarlos en una nueva color.

rgb(from green r g b)           /* r=0 g=128 b=0 */
rgb(from rgb(0 128 0) r g b);   /* r=0 g=128 b=0 */

Colores de las propiedades personalizadas

La lectura de rgb from green es muy clara y fácil de entender. Esta es la razón por la que las propiedades personalizadas y la sintaxis relativa de color hacen una muy buena coincidencia, porque puedes quitar el misterio del color from. Tampoco es necesario conoces el formato de color del color de la propiedad personalizada, cuando creas una nueva en el formato que elijas.

rgb(from rgb(255 105 180) r g b) /* ????? */
rgb(from var(--hotpink) r g b)   /* clear */

Trabaja en tu espacio de color preferido

Puedes elegir el espacio de color con la notación funcional que prefieras.

rgb(from hsl(120 100% 25%) r g b)     /*  r=0   g=128  b=0    */
hsl(from hsl(120 100% 25%) h s l)     /*  h=120 s=100% l=25%  */
hwb(from hsl(120 100% 25%) h w b)     /*  h=120 w=0%   b=50%  */
lch(from hsl(120 100% 25%) l c h)     /*  l=46  c=68   h=134  */

La sintaxis de color relativo incluye ese paso de conversión; el color después de from es convertido en el espacio de color, como se especifica al comienzo de la regla color. No es necesario que la entrada y la salida coincidan, lo que es muy liberador.

La capacidad de elegir un espacio de color también es motivadora, ya que elegir un color espacio suele estar más enfocada en el tipo de alternancia de colores que en una preferencial. La preferencia está en los resultados, no en el formato de color ni en el canal de tipos de datos. Esto será mucho más claro en las secciones que demuestran los casos de uso, ya que diferentes espacios de color sobresalen en diferentes tareas.

Mezcla, combina, omite y repite las variables

Algo extraño, pero emocionante en esta sintaxis, no hace falta que las variables volver a poner en orden y repetirse.

rgb(from green g g g)    /* rgb(128 128 128) */
rgb(from green b r g)    /* rgb(0 0 128) */
rgb(from green 0 0 g)    /* rgb(0 0 128) */

Opacidad como variable

La sintaxis también proporciona la opacidad como una variable llamada alpha. Este campo es opcional y va después de / en la notación de color funcional.

rgb(from #00800080 r g b / alpha)             /* alpha=50% */
rgb(from rgba(0,128,0,.5) r g b / alpha)      /* alpha=50% */
rgb(from rgb(0 128 0 / 50%) r g b / alpha)    /* alpha=50% */

Usar calc() u otras funciones de CSS en las variables

Hasta ahora, hemos creado el color verde una y otra vez. Aprender la sintaxis y familiarizarse con los pasos de conversión y desestructuración. Ahora es tiempo de modificar las variables, alterar el resultado para que no sea igual al entrada.

green                              /*  h=120 s=100% l=25%  */
hsl(from green calc(h * 2) s l)    /*  h=240 s=100% l=25%  */

¡Ahora está en la marina! El matiz se duplicó, tomando un tono de 120 y convirtiéndolo en 240, alterando por completo el color. Esto rotó el matiz a lo largo del color de la rueda de la fortuna, un truco muy simple con espacios de color cilíndricos como HSL, HWB LCH y OKLCH.

Para ver visualmente los valores de los canales, de modo que puedas hacer los cálculos sin adivinar ni tener que memorizar la especificación, prueba esta herramienta de valores relativos de canales de sintaxis de colores. Revela el valor de cada canal en función de la sintaxis que especifiques, lo que te permite saber exactamente con qué valores tienes disponibles para jugar.

Cómo verificar la compatibilidad con navegadores

@supports (color: rgb(from white r g b)) {
  /* safe to use relative color syntax */
}

Casos de uso y demostraciones

Los siguientes ejemplos y casos de uso tienen muchas sintaxis alternativas para lograr resultados similares o iguales. Las variaciones provienen de los espacios de color y de canales que ofrecen.

Además, muchos ejemplos mostrarán ajustes de color con el texto by y to Un cambio de color by es un cambio de color relativo. un cambio que utiliza el valor de la variable y realiza un ajuste en función de su valor actual. R cambio de color to es un cambio de color absoluto; un cambio que no utiliza el de la variable y, en su lugar, especifica un valor completamente nuevo.

Puedes encontrar todas las demostraciones en esta colección de CodePen.

Aclarar un color

The OKLCH, OKLAB, XYZ o Los espacios de color sRGB proporcionan los resultados predecibles al aclarar los colores.

Aclarar una cantidad

En el siguiente ejemplo, .lighten-by-25 toma el color blue y lo convierte en OKLCH, luego aclara el azul aumentando el canal l (luminosidad) multiplicando el valor actual por 1.25. Esto lleva la luminosidad azul a blanco en un 25%.

.lighten-by-25 {
  background: oklch(from blue calc(l * 1.25) c h);
}

Aclarar hasta un valor específico

En el siguiente ejemplo, .lighten-to-75 no usa el canal l para hacer lo siguiente: aclarar blue, en cambio, reemplaza por completo el valor por 75%.

.lighten-to-75 {
  background: oklch(from blue 75% c h);
}

Cómo oscurecer un color

Los mismos espacios de color eficaces para iluminar un color también son ideales para oscurecer el color.

Oscurecer una cantidad

En el siguiente ejemplo, .darken-by-25 toma el color azul y lo convierte en OKLCH, luego oscurece el azul disminuyendo el canal l (luminosidad) en un 25% en multiplicando el valor por .75. Esto hace que el color azul avance hacia el negro en un 25%.

.darken-by-25 {
  background: oklch(from blue calc(l * .75) c h);
}

Oscurecer hasta un valor especificado

En el siguiente ejemplo, .darken-to-25 no usa el canal l para oscurecer blue; en cambio, reemplaza por completo el valor por 25%.

.darken-to-25 {
  background: oklch(from blue 25% c h);
}

Satura un color

Saturar una cantidad determinada

En el siguiente ejemplo, .saturate-by-50 usa s de hsl() para aumentar vitalidad de orchid según un 50% relativo.

.saturate-by-50 {
  background: hsl(from orchid h calc(s * 1.5) l);
}

Saturar a una cantidad específica

En el siguiente ejemplo, .saturate-to-100 no usa el canal s de hsl(), especifica un valor de saturación deseado. En este ejemplo, la saturación se incrementa a 100%.

.saturate-to-100 {
  background: hsl(from orchid h 100% l);
}

Desatura un color

Desaturar en una cantidad

En el siguiente ejemplo, .desaturate-by-half usa s de hsl() para disminuir la saturación de indigo por la mitad.

.desaturate-by-half {
  background: hsl(from indigo h calc(s / 2) l);
}

Desaturar a un valor específico

En lugar de reducir la saturación en una cantidad determinada, puede reducir la saturación hasta alcanzar un valor deseado valor. En el siguiente ejemplo, .desaturate-to-25 crea un nuevo color basado en indigo, pero establece la saturación en 25%.

.desaturate-to-25 {
  background: hsl(from indigo h 25% l);
}

Refuerzo de croma

Este efecto es similar a saturar un color, pero es diferente en un par de maneras. En primer lugar, se trata de un cambio de chroma, no de saturation, y esto es porque los espacios de color que pueden realzarse a un alto rango dinámico no usan la saturación. Los espacios de color que incluyen chroma son de alto rango dinámico y permite a los autores aumentar la intensidad del color más allá de la saturación que eres capaz de hacer.

.increase-chroma {
  background: oklch(from orange l calc(c + .1) h);
}

Cómo ajustar la opacidad de un color

La variante semitransparente de un color es uno de los colores más comunes ajustes realizados en los sistemas de diseño. Consulta el ejemplo en la introducción de esta artículo, por si te lo perdiste, describe muy bien el espacio del problema.

Ajustar la opacidad

.decrease-opacity-by-25 {
  background: rgb(from lime r g b / calc(alpha / 2));
}

Ajustar la opacidad a un valor específico

.decrease-opacity-to-25 {
  background: rgb(from lime r g b / 25%);
}

Invertir un color

La inversión de color es una función común de ajuste de color que se encuentra en las bibliotecas de colores. Una forma de lograr esto es convertir un color a RGB y, luego, restar cada uno valor del canal de 1.

.invert-each-rgb-channel {
  background: rgb(from yellow calc(255 - r) calc(255 - g) calc(255 - b));
}

Complementa un color

Si tu objetivo no era invertir un color, sino complementarlo, entonces el tono es probable que lo que estés buscando sea la rotación. Elige un espacio de color que ofrezca las como un ángulo y, luego, usa calc() para rotar el tono el valor que desees. Para encontrar el complemento de un color, se rota media vuelta, en este caso. puedes sumar o restar del canal h por 180 para lograr el resultado.

.complementary-color {
  background: hsl(from blue calc(h + 180) s l);
}

Cómo contrastar un color

Como método para lograr relaciones accesibles de contraste de color, considera L&midast; (Lstar). Esto utiliza el canal de luminosidad (L) (aproximadamente) uniforme a nivel de la percepción del LCH y OKLCH, en un calc(). Según si la segmentación es baja, media o alta el contraste, la L&midast; delta es de ~40, ~50 o ~60.

Esta técnica funciona bien con cualquier tono en LCH u OKLCH.

Cómo contrastar un color más oscuro

La clase .well-contrasting-darker-color muestra L* con un delta de 60. Dado que el color de origen es un color oscuro (valor bajo de luminosidad), se agrega un 60% (0.6). al canal de luminosidad. Esta técnica se utiliza para encontrar un punto bien contrastado mismo tono y color de texto oscuro sobre un fondo claro.

.well-contrasting-darker-color {
  background: darkred;
  color: oklch(from darkred calc(l + .60) c h);
}

Contrastar un color más claro

La clase .well-contrasting-lighter-color muestra L* con un delta del 60%. también. Dado que el color de origen es un color claro (claridad de alto valor), 0.60 es se restan del canal de luminosidad.

.well-contrasting-lighter-color {
  background: lightpink;
  color: oklch(from lightpink calc(l - .60) c h);
}

Paletas de colores

La sintaxis de color relativa es muy buena para crear paletas de colores. Es especialmente útil y potente debido a la cantidad de espacios de color disponibles. Lo siguiente ejemplos usan OKLCH porque el canal de luminosidad es confiable y el tono se pueda rotar sin efectos secundarios. El último ejemplo demuestra un combinación de ajustes de luminosidad y rotación de tono para obtener resultado.

Abre el código fuente de ejemplo para estos y, luego, intenta cambiar --base-color a ver cuán dinámicas son estas paletas. Es divertido.

Si te gustan los videos, te daré información detallada sobre cómo crear paletas de colores en CSS con OKLCH en YouTube.

Paletas monocromáticas

Para crear una paleta monocromática, debes hacerla con el mismo tono, con variaciones en luminosidad y oscuridad. El color del medio es el color de origen para la paleta, en la que dos variantes más claras y dos más oscuras se ponen lado derecho.

:root {
  --base-color: deeppink;

  --color-0: oklch(from var(--base-color) calc(l + .20) c h); /* lightest */
  --color-1: oklch(from var(--base-color) calc(l + .10) c h);
  --color-2: var(--base-color);
  --color-3: oklch(from var(--base-color) calc(l - .10) c h);
  --color-4: oklch(from var(--base-color) calc(l - .20) c h); /* darkest */
}
Prueba un montón de paletas creadas con sintaxis de color relativa y OKLCH.

Open Props, una biblioteca de variables de CSS gratuitas, ofrece paletas de colores creadas con esta estrategia y permite usarlas fácilmente con una importar. Además, todas se crearon con un color que puedes personalizar, solo tienes que le da un color y emite una paleta.

Paletas análogas

Dado que la rotación de matiz es tan fácil con OKLCH y HSL, es trivial crear un paleta de colores análoga. Rota el matiz según la cantidad de resultados que te guste y cambia el color base. y ver cómo el navegador crea nuevas paletas.

:root {
  --base-color: blue;

  --primary:   var(--base-color);
  --secondary: oklch(from var(--base-color) l c calc(h - 45));
  --tertiary:  oklch(from var(--base-color) l c calc(h + 45));
}

Paletas triádicas

Similar a los colores complementarios, las paletas de colores triádicas son rotaciones de tono opuestas pero armoniosas según un color de base. Donde un valor el color complementario se encuentra en el lado opuesto de un color, como una línea recta dibujada en el medio de la rueda de colores, las paletas triádicas son como una triángulo de líneas, buscando 2 colores rotados de forma equitativa a partir de un color base. Para lograrlo, rota el tono 120deg.

Esta es una leve simplificación de la teoría del color, pero es suficiente para dar empezarás con paletas triádicas más complejas si te interesa.

:root {
  --base-color: yellow;
  --triad-1: oklch(from var(--base-color) l c calc(h - 120));
  --triad-2: oklch(from var(--base-color) l c calc(h + 120));
}

Paletas tetrádicas

Las paletas tetrádicas son cuatro colores divididos uniformemente alrededor de la rueda de colores, lo que hace que una paleta sin valor dominante claro. También podrías pensar en ello, como dos pares de colores complementarios. Si se usa con prudencia, puede ser muy significativo.

Esta es una leve simplificación de la teoría del color, pero es suficiente para dar empezarás con paletas tetrádicas más complejas si te interesa.

:root {
  --base-color: lime;

  --color-1: var(--base-color);
  --color-2: oklch(from var(--base-color) l c calc(h + 90));
  --color-3: oklch(from var(--base-color) l c calc(h + 180));
  --color-4: oklch(from var(--base-color) l c calc(h + 270));
}

Monocromático con una leve rotación de tono

Muchos expertos en color mantienen este truco bajo la manga. El problema es que un la escala de colores monocromática puede ser bastante aburrida. La solución es agregar rotación de matiz menor o mayor a cada color nuevo a medida que se cambia la luminosidad

En el siguiente ejemplo, se reduce la luminosidad un 10% de cada muestra y también rota el matiz 10 grados. El resultado, una paleta de rosa a índigo que parece ser combinarse perfectamente como un gradiente.

:root {
  --base-color: deeppink;

  --color-1: var(--base-color);
  --color-2: oklch(from var(--base-color) calc(l - .10) c calc(h - 10));
  --color-3: oklch(from var(--base-color) calc(l - .20) c calc(h - 20));
  --color-4: oklch(from var(--base-color) calc(l - .30) c calc(h - 30));
  --color-5: oklch(from var(--base-color) calc(l - .40) c calc(h - 40));
}
Prueba esta tabla de clasificación creada con OKLCH y rotación de matiz

La siguiente interfaz de tabla de clasificación usa esta estrategia de rotación de matiz. Cada lista elemento realiza un seguimiento de su índice en el documento como una variable llamada --i. Este índice es y luego se usa para ajustar el croma, la luminosidad y el tono. El ajuste es solo de un 5% o 5°, es mucho más sutil que el ejemplo anterior con deeppink y, por lo tanto, toma un observar la razón por la que esta tabla de clasificación puede tener cualquier matiz con tales elegancia.

Asegúrate de cambiar el tono en el control deslizante debajo de la tabla de clasificación y observa la sintaxis relativa de color crea hermosos momentos de color.

li {
  --_bg: oklch(
    /* decrease lightness as list grows */
    calc(75% - (var(--i) * 5%))

    /* decrease chroma as list grows */
    calc(.2 - (var(--i) * .01))

    /* lightly rotate the hue as the list grows */
    calc(var(--hue) - (var(--i) + 5))
  );
}