Ámbito: :root global vs scope local
La lección anterior declaró una variable en :root — disponible en toda la página. Pero las custom properties pueden declararse en cualquier selector, limitando su alcance a ese subárbol del DOM. Esto abre el patrón más poderoso del módulo: un mismo componente con múltiples variantes de color, definidas cada una en un solo lugar.
:root como scope global
:root es el selector estándar para variables que deben estar disponibles en toda la página:
:root {
--color-primario: royalblue; /* disponible en todos los elementos */
}
Como :root equivale a <html> (el ancestro de todo), las variables que declara se heredan a cualquier elemento que las use con var().
Declarar en un selector limita el alcance
Una variable declarada en .tarjeta solo existe para .tarjeta y sus descendientes:
.tarjeta {
--acento: royalblue;
}
/* var(--acento) funciona dentro de .tarjeta y sus hijos */
/* fuera de .tarjeta, var(--acento) no tiene valor → inválido o fallback */
Esto ocurre porque las custom properties siguen la herencia CSS (CAT-14): un hijo hereda las propiedades de su padre. Una variable declarada en .tarjeta “baja” a todos sus descendientes pero no “sube” ni “viaja” a otros elementos.
El caso de uso más poderoso: variantes del mismo componente
El mismo CSS de base puede producir resultados visuales distintos según el scope local de cada variante:
/* El componente base: usa --acento sin saber qué color es */
.alerta {
border-left: 4px solid var(--acento);
}
.alerta__titulo {
color: var(--acento);
}
/* Cada variante define --acento para su subárbol */
.alerta--info { --acento: steelblue; }
.alerta--peligro { --acento: crimson; }
.alerta está definido una sola vez. Para cambiar el color de la variante de peligro, solo se toca --acento en .alerta--peligro. No hay que duplicar el CSS base ni usar selectores largos de sobreescritura.
Variables de Sass ($var) vs custom properties CSS
Las variables de Sass son constantes de compilación: se resuelven antes de que el navegador las vea y no existen en el DOM. Las custom properties CSS son propiedades reales del navegador: se heredan, se pueden cambiar en runtime (vía JS o media queries), y el scope local que acabás de ver es posible precisamente porque viven en el árbol del documento.
Si llegás con experiencia en Sass, el concepto es similar — pero el mecanismo es completamente diferente.
La herencia lleva la variable al hijo
En el ejercicio, .alerta__titulo no declara --acento — lo hereda de su padre .alerta--info. Cuando .alerta__titulo usa var(--acento), busca hacia arriba en el DOM hasta encontrar el primer ancestro que lo declaró. Lo encuentra en .alerta--info. Esa es la cascada e herencia (CAT-14) funcionando exactamente igual que con color o font-family.
Tu turno: declarar --acento con valores distintos en .alerta--info y .alerta--peligro. El CSS base no se toca — el color cambia solo por el scope local de cada variante.
La misma variable, dos colores: scope local en variantes
Tenés un componente `.alerta` que usa `var(--acento)` para el borde izquierdo y el color del título. El CSS base ya está dado — no lo modifiques. Tu tarea: declarar localmente el color de acento para cada variante. 1. En `.alerta--info`, declarar `--acento: steelblue`. 2. En `.alerta--peligro`, declarar `--acento: crimson`. El resultado: misma estructura HTML y CSS base, dos colores distintos — solo cambia la variable local.
Preview
En la referencia
En esta página