Las propiedades personalizadas de CSS, comúnmente conocidas como variables CSS, representan la característica más potente de CSS moderno para construir hojas de estilo mantenibles y tematizables. A diferencia de las variables de Sass o LESS que se compilan y desaparecen, las propiedades personalizadas CSS están vivas en el navegador, pueden tener un alcance específico para cualquier elemento, responden a consultas de medios y pueden modificarse dinámicamente con JavaScript.
Sintaxis Básica
/* Definir en :root para alcance global */
:root {
--color-primario: #6366f1;
--color-fondo: #0f172a;
--color-texto: #e2e8f0;
--radio: 12px;
--sombra: 0 4px 24px rgba(0, 0, 0, 0.3);
--fuente-sans: 'Inter', system-ui, sans-serif;
}
/* Usar con var() */
.tarjeta {
background: var(--color-fondo);
color: var(--color-texto);
border-radius: var(--radio);
box-shadow: var(--sombra);
font-family: var(--fuente-sans);
}
/* Valor de respaldo */
.tarjeta {
color: var(--color-texto, #ffffff);
}
Alcance y Herencia
Las propiedades personalizadas siguen la cascada de CSS y son heredadas por los elementos hijos. Esto las hace perfectas para la tematización a nivel de componente.
/* Valores predeterminados globales */
:root {
--btn-fondo: #6366f1;
--btn-texto: #ffffff;
--btn-radio: 8px;
}
/* Sobrescribir para una sección específica */
.zona-peligro {
--btn-fondo: #ef4444;
--btn-texto: #ffffff;
}
/* El componente de botón utiliza los mismos nombres de variable */
.btn {
background: var(--btn-fondo);
color: var(--btn-texto);
border-radius: var(--btn-radio);
}
/* Los botones dentro de .zona-peligro se vuelven rojos automáticamente */
Modo Oscuro con Propiedades Personalizadas
/* Tema claro (predeterminado) */
:root {
--fondo: #ffffff;
--fondo-secundario: #f8fafc;
--texto: #1e293b;
--texto-muted: #64748b;
--borde: #e2e8f0;
--acento: #6366f1;
}
/* Tema oscuro */
[data-theme="dark"] {
--fondo: #0f172a;
--fondo-secundario: #1e293b;
--texto: #e2e8f0;
--texto-muted: #94a3b8;
--borde: rgba(255, 255, 255, 0.1);
--acento: #818cf8;
}
/* Detección de preferencia del sistema */
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--fondo: #0f172a;
--fondo-secundario: #1e293b;
--texto: #e2e8f0;
--texto-muted: #94a3b8;
--borde: rgba(255, 255, 255, 0.1);
--acento: #818cf8;
}
}
Integración con JavaScript
// Leer una variable CSS
const acento = getComputedStyle(document.documentElement)
.getPropertyValue('--acento').trim();
// Establecer una variable CSS
document.documentElement.style.setProperty('--acento', '#10b981');
// Alternancia de tema
function alternarTema() {
const actual = document.documentElement.dataset.theme;
document.documentElement.dataset.theme = actual === 'dark' ? 'light' : 'dark';
localStorage.setItem('theme', document.documentElement.dataset.theme);
}
Sistema de Tokens de Diseño
:root {
/* Escala de espaciado */
--espacio-1: 0.25rem; /* 4px */
--espacio-2: 0.5rem; /* 8px */
--espacio-3: 0.75rem; /* 12px */
--espacio-4: 1rem; /* 16px */
--espacio-6: 1.5rem; /* 24px */
--espacio-8: 2rem; /* 32px */
--espacio-12: 3rem; /* 48px */
/* Tamaños de fuente */
--texto-xs: 0.75rem;
--texto-sm: 0.875rem;
--texto-base: 1rem;
--texto-lg: 1.125rem;
--texto-xl: 1.25rem;
--texto-2xl: 1.5rem;
--texto-3xl: 1.875rem;
/* Tamaños de fuente responsivos */
--texto-hero: clamp(2rem, 5vw, 3.5rem);
}
Mejores Prácticas
- Usa nombres semánticos —
--color-primarioen lugar de--azul-500. Esto te permite cambiar el color real sin renombrar. - Define todos los tokens de diseño en
:rootpara una consistencia global. - Define variables específicas de componentes con alcance al selector del componente.
- Proporciona siempre valores de respaldo para propiedades críticas:
var(--color, #000). - Usa propiedades personalizadas para todo lo que puedas necesitar cambiar — colores, espaciado, fuentes, sombras, radio de borde, duraciones de animación.
Prueba Nuestras Herramientas CSS Gratuitas
Minifica y formatea tu código CSS instantáneamente.