Propiedades personalizadas

Supongamos que creaste algunos estilos iniciales para tu sitio y te diste cuenta de que repetiste algunos de los valores en tu CSS. Usas dodgerblue como color principal y lo agregas a los bordes de los botones, el texto de los vínculos y los fondos de los encabezados. Además, usas una herramienta de diseño para elegir algunas variantes de ese azul para otras partes del sitio. Luego, obtienes una guía de estilo y el color principal ahora es oklch(70% 0.15 270).

Las propiedades personalizadas, o variables CSS, te permiten organizar y reutilizar valores en tu CSS, de modo que tus estilos sean más flexibles y fáciles de comprender.

Cómo crear propiedades

La forma más sencilla de crear una propiedad es establecer un valor en una propiedad nueva con un nombre que definas.

.card {
  --base-size: 1em;
}

Todos los nombres de propiedad deben comenzar con dos guiones. Esto evita que intentes usar un nombre de propiedad CSS existente para un valor personalizado. La especificación de CSS nunca agregará una propiedad que comience con dos guiones.

Luego, se puede acceder a esta propiedad con la función var(). En este ejemplo, se establece el tamaño de la fuente dentro de un .card-title en el doble del valor de --base-size.

.card .card-title {
  font-size: calc(2 * var(--base-size));
}

Usa una propiedad personalizada

Como viste, puedes usar el valor de una propiedad personalizada con la función var(). Puedes usar la función var() en los valores, pero no en las consultas de medios. Son especialmente útiles como argumentos para otras funciones de CSS.

Resguardos

¿Qué sucede si intentas usar una propiedad personalizada que no tiene un valor establecido? La función var() toma un segundo valor que se usará como valor de resguardo. El valor de resguardo incluso puede ser otra propiedad personalizada con un var() anidado.

#my-element {
  background: var(
    --alert-variant-background,
    var(--alert-primary-background)
  );
}

Valores no válidos

Si una propiedad personalizada se resuelve en un valor no válido, por ejemplo, un valor de 1em para la propiedad background-color, no se usarán otras declaraciones válidas en ese elemento para esa propiedad. Esto se debe a que el navegador no puede saber si un valor no es válido hasta que descarta otras declaraciones cuando calcula un valor. En su lugar, el valor utilizado será un valor heredado o inicial.

.content {
  background-color: blue;
}

.content.invalid {
  --length: 2rem;
  background-color: var(--length);
}

En el ejemplo anterior, el elemento .invalid no tendrá un fondo azul. En cambio, como background-color no hereda, el valor será transparent, que es su valor inicial.

Anulación y herencia

En la mayoría de los casos, querrás el comportamiento predeterminado de las propiedades personalizadas, que es que los valores se heredan. Cuando estableces un valor nuevo para una propiedad, ese elemento y todos sus elementos secundarios tendrán ese valor hasta que se anule con otro valor.

Las propiedades personalizadas se determinan por la cascada, por lo que también se pueden anular con un selector más específico.

Más control con @property

Una propiedad personalizada que se crea configurando un valor puede ser de cualquier tipo y se hereda. Para tener más control sobre una propiedad personalizada, puedes usar la regla @property.

Nuestra propiedad --base-size creada anteriormente sería equivalente a esta declaración de @property.

@property --base-size {
  syntax: "*";
  inherits: true;
  initial-value: 18px;
}

El valor syntax establece los tipos de valores CSS que son válidos para la propiedad. Si estableces un tipo diferente en esa propiedad, no será válido y volverá al valor inicial o a un valor heredado establecido más arriba en la cascada.

Cuando creas una propiedad personalizada con @property, puedes inhabilitar la herencia con inherit: false. Anular el valor de una propiedad personalizada con la herencia inhabilitada lo cambia para el elemento seleccionado, pero no para sus elementos secundarios. Esto suele ser útil cuando varios selectores segmentan el mismo elemento.

El initial-value establece el valor de la propiedad, a menos que se cambie más adelante. A menos que la sintaxis sea *, lo que significa cualquier tipo de CSS, el @property debe establecer un initial-value. Esto garantiza que la propiedad siempre tendrá un valor de la sintaxis especificada y nunca será indefinida.

Cómo actualizar propiedades personalizadas con JavaScript

El valor de una propiedad personalizada en un elemento se puede actualizar con JavaScript, que puedes usar para actualizar los diseños de tu sitio de forma dinámica.

const element = document.getElementById("my-button");
getComputedStyle(element).setPropertyValue("--color", orange);

En este ejemplo, se actualiza la etiqueta de estilo en el elemento #my-button, y, si la inspeccionas en las Herramientas para desarrolladores, verás lo siguiente:

<button id="my-button" style="--color: orange">Click me</button>

En el ejemplo anterior, puedes ver cómo configurar propiedades personalizadas accediendo a los datos almacenados en atributos HTML personalizados. Cada botón tiene un atributo data-color con el valor de un color específico. La propiedad personalizada --background establecida en el elemento body se restablece al valor de data-color en el botón en el que se haga clic.

También puedes usar getComputedStyle(element).getPropertyValue("--variable") para obtener el valor de una propiedad en un elemento específico. Esto puede ser útil si tu lógica necesita responder a un valor en cascada.