Saltar al contenido
Curso de CSS
Todos los cursos Ir al ejercicio →

Variables, temas y organización

  • ⏱ 45 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Crear un sistema de diseño con variables CSS.
  • Implementar un tema claro y oscuro sin duplicar estilos.
  • Usar calc(), clamp() y color-mix() para valores derivados.
  • Organizar y mantener un CSS grande.

1.Variables CSS (custom properties)

Una variable CSS guarda un valor con un nombre para reutilizarlo y cambiarlo en un solo lugar. Se declara con dos guiones y se usa con var():

Declarar y usar
:root {
  --color-principal: #4f46e5;
  --espacio: 1rem;
  --radio: 12px;
}

.boton {
  background: var(--color-principal);
  padding: var(--espacio);
  border-radius: var(--radio);
}

Alcance: las variables también «heredan»

✏️ Variables locales

💡 Consejo · Nombra por función

Mejor --color-fondo, --color-texto, --color-acento que --azul o --gris-claro: si mañana el acento pasa a ser verde, el nombre sigue siendo cierto. Es la misma idea que los nombres de clase por función.

2.Un sistema de diseño en variables

Con variables puedes definir todas las decisiones visuales de un sitio en un solo bloque:

Tokens de diseño
:root {
  /* color */
  --fondo: #f7f8fc;     --superficie: #ffffff;
  --texto: #1e2235;     --texto-suave: #5b6280;
  --acento: #4f46e5;    --borde: #dde2ef;

  /* espacio y forma */
  --e-1: .25rem; --e-2: .5rem; --e-3: 1rem; --e-4: 2rem;
  --radio: 12px;
  --sombra: 0 1px 2px rgb(0 0 0 / .06), 0 8px 24px rgb(0 0 0 / .08);

  /* tipografía */
  --fuente: system-ui, sans-serif;
  --t-base: 1.0625rem; --t-grande: 1.5rem;
}

body { background: var(--fondo); color: var(--texto); font: var(--t-base)/1.6 var(--fuente); }
.tarjeta { background: var(--superficie); border: 1px solid var(--borde); border-radius: var(--radio); box-shadow: var(--sombra); padding: var(--e-3); }

Si el cliente pide otro azul o más redondeo, cambias una línea y todo el sitio se actualiza.

3.Modo oscuro con variables

El modo oscuro es el mejor ejemplo del valor de las variables: solo redefines los colores; el resto del CSS no se toca. Hay tres piezas:

  1. Define los colores claros en :root.
  2. Redefínelos dentro de @media (prefers-color-scheme: dark) (respeta la preferencia del sistema).
  3. Añade además [data-tema="oscuro"] para permitir un botón que cambie el tema a mano.
Tema claro y oscuro
:root {
  --fondo: #f7f8fc;
  --texto: #1e2235;
  --superficie: #ffffff;
  color-scheme: light;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-tema="claro"]) {
    --fondo: #0f1222;
    --texto: #e8eaf6;
    --superficie: #181c33;
    color-scheme: dark;
  }
}

:root[data-tema="oscuro"] {
  --fondo: #0f1222;
  --texto: #e8eaf6;
  --superficie: #181c33;
  color-scheme: dark;
}
✏️ Cambia entre temas

📌 Nota · Así funciona el tema de este sitio

Este curso usa exactamente este patrón: variables en :root, un bloque prefers-color-scheme: dark y un atributo data-theme que cambia el botón «Tema» (con un poco de JavaScript, que verás en el curso de JavaScript).

4.Funciones de CSS que conviene dominar

FunciónPara quéEjemplo
calc()Operar con unidades distintaswidth: calc(100% - 2rem)
min() / max()El menor / el mayor de varios valoreswidth: min(100%, 60ch)
clamp()Valor entre un mínimo y un máximofont-size: clamp(1rem, 2.5vw, 2rem)
var()Usar una variablecolor: var(--acento, #4f46e5)
color-mix()Mezclar colorescolor-mix(in srgb, var(--acento) 20%, white)
attr()Leer un atributo HTMLcontent: attr(data-etiqueta)
url(), rgb(), hsl()Referencias y colores
Derivar colores desde uno solo
:root { --acento: #4f46e5; }

.boton       { background: var(--acento); }
.boton:hover { background: color-mix(in srgb, var(--acento) 85%, black); }
.suave       { background: color-mix(in srgb, var(--acento) 12%, white); }
✏️ Mezclar colores

5.Organizar tu CSS

Un CSS de 20 líneas se entiende solo. Uno de 2000 necesita orden. Una estructura que funciona:

  1. Tokens y variables (:root).
  2. Reseteo y base: box-sizing, body, tipografía, enlaces.
  3. Layout: contenedores, cuadrículas, cabecera y pie.
  4. Componentes: .tarjeta, .boton, .menu… cada uno con su bloque.
  5. Utilidades y estados: .oculto, .centrado, variantes.
  6. Media queries al final (o junto a cada componente).

Nombres: BEM

Bloque, elemento, modificador
.tarjeta { … }                   /* bloque */
.tarjeta__titulo { … }           /* elemento */
.tarjeta--destacada { … }        /* modificador */

Capas con @layer

@layer te permite decidir qué grupo de reglas gana sin pelear con la especificidad:

Capas de CSS
@layer reset, base, componentes, utilidades;

@layer reset       { *, *::before, *::after { box-sizing: border-box; } }
@layer componentes { .boton { background: var(--acento); } }
@layer utilidades  { .oculto { display: none; } }   /* gana a las capas anteriores */

Anidamiento nativo

Sin Sass
.tarjeta {
  padding: 1rem;
  border: 1px solid var(--borde);

  & h2 { margin-top: 0; }
  &:hover { box-shadow: var(--sombra); }
  @media (min-width: 700px) { padding: 2rem; }
}

📌 Nota · ¿Y Sass o Tailwind?

Muchos proyectos usan preprocesadores (Sass) o frameworks (Tailwind, Bootstrap). Con variables, anidamiento y capas nativas, CSS cubre hoy casi todo lo que Sass ofrecía. Aprender CSS a fondo, como en este curso, te sirve con cualquiera de ellos.

6.Buenas prácticas de mantenimiento y rendimiento

Alternativa con @supports
.galeria { display: flex; flex-wrap: wrap; gap: 1rem; }       /* respaldo */

@supports (display: grid) {
  .galeria { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
}

7.Errores frecuentes

📒 Apuntes para llevar

  • Las variables CSS (--nombre) se declaran en :root y se usan con var(--nombre, respaldo); se pueden redefinir localmente.
  • Un sistema de diseño reúne colores, espacios, radios y tipografías en variables para cambiar el sitio entero en una línea.
  • El modo oscuro redefine solo las variables de color: prefers-color-scheme: dark y un atributo data-tema para elegir a mano; añade color-scheme.
  • calc(), min(), max(), clamp() y color-mix() ayudan a calcular y derivar valores.
  • Ordena el CSS: variables → base → layout → componentes → utilidades → media queries.
  • BEM, @layer y el anidamiento nativo evitan batallas de especificidad.
  • @supports ofrece alternativas cuando una propiedad es nueva.
  • Mantén el CSS pequeño: evita duplicados, elimina lo que no uses y minifica.

8.Glosario

TérminoSignificado
Variable CSSValor con nombre (--x) que se reutiliza con var(--x).
:rootSelector del elemento raíz; ideal para variables globales.
Token de diseñoDecisión visual con nombre: color, espacio, radio…
color-schemeIndica a los controles nativos si el tema es claro u oscuro.
color-mix()Función que mezcla dos colores en una proporción.
@layerAgrupa reglas en capas con prioridad explícita.
BEMConvención de nombres: Bloque__Elemento--Modificador.
@supportsAplica estilos solo si el navegador entiende una propiedad.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Cómo se declara y se usa una variable CSS?

¿Dónde se declaran normalmente las variables globales?

Para el modo oscuro, lo más práctico con variables es…

¿Para qué sirve color-scheme: dark?

¿Qué hace var(--color, black) si --color no existe?

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio