← CSS: diseño, maquetación y responsive

Sesión 6 · Semana 2

Variables y funciones modernas

Hoy · Hoja de ruta

  1. 1. Aprende: Cómo se declara una decisión de diseño una sola vez, y qué resuelven calc(), min(), max() y clamp().
  2. 2. Haz: Convierte los valores repetidos de tu hoja en variables.
  3. 3. Comprueba: Puedes cambiar el color principal del sitio tocando una sola línea.

Antes de empezar · 5 minutos, sin apuntes

  1. ¿Respecto a qué se calculan rem, em y %?
  2. ¿Qué dos decisiones hacen que un párrafo sea legible además del tamaño?
  3. Detecta el riesgo de repetir el mismo color hexadecimal en veinte reglas.

El problema: repetir una decisión

h1     { color: #2563eb; }
button { background: #2563eb; }
a      { color: #2563eb; }

Ese color no aparece tres veces: aparece una decisión, escrita tres veces. El día que cambie, hay que acordarse de los tres sitios, y del cuarto que se te olvidó.

:root {
    --color-primary: #2563eb;
}

h1     { color: var(--color-primary); }
button { background: var(--color-primary); }
a      { color: var(--color-primary); }

Custom property

Una variable de CSS. Se declara con dos guiones, se lee con var(), y se hereda como cualquier otra propiedad: por eso se declaran en :root, que es el elemento raíz, y así están disponibles en todo el documento.

Que se hereden tiene una consecuencia útil: puedes redefinir una variable dentro de un componente y todo lo que haya debajo usará el valor nuevo, sin tocar nada más.

.card--oferta {
    --color-primary: #c2410c;   /* dentro de esta tarjeta, otro primario */
}

Un sistema pequeño

:root {
    --color-text: #1f2937;
    --color-background: #ffffff;
    --color-primary: #2563eb;

    --space-xs: 0.5rem;
    --space-sm: 1rem;
    --space-md: 1.5rem;
    --space-lg: 3rem;

    --radius: 0.75rem;
}

Fíjate en los nombres. --space-sm dice para qué sirve; --rem16 diría solo cuánto mide. Un buen nombre de variable describe el papel, no el valor, porque el valor puede cambiar y el papel no.

Y var() admite un valor de respaldo, útil cuando la variable puede no estar definida:

padding: var(--space-md, 1.5rem);

Cuatro funciones que quitan media querys

calc()

Opera entre unidades distintas, que es lo que ninguna otra cosa puede hacer:

width: calc(100% - 2rem);

Necesita espacios alrededor del - y del +. Sin ellos no funciona, y es un despiste que cuesta encontrar.

min() y max()

width: min(90%, 70rem);      /* el más pequeño de los dos */
padding: max(1rem, 3vw);     /* el más grande de los dos */

Se leen al revés de lo que parece. min() pone un techo: nunca pasará de 70rem. max() pone un suelo: nunca bajará de 1rem.

clamp()

h1 {
    font-size: clamp(2rem, 5vw, 4rem);
}
mínimo      2rem   · nunca más pequeño
preferido   5vw    · lo que se adapta
máximo      4rem   · nunca más grande

Ese titular crece con la ventana entre dos límites, sin una sola media query. Es la herramienta con la que se resuelve buena parte del responsive antes de llegar a los breakpoints, y volveremos a ella en la semana 4.

Tarea 6 · Elimina los números mágicos

Número mágico

Un valor escrito a pelo en el código sin que nada explique de dónde sale. margin-left: 37px es el ejemplo perfecto: funciona, nadie sabe por qué, y nadie se atreve a tocarlo.

Sobre tu hoja de estilos:

  1. Busca los valores que se repiten: colores, espaciados, radios, tamaños.
  2. Decide cuáles representan una decisión reutilizable y conviértelos en variables con nombres que digan su papel.
  3. Sustituye todas sus apariciones por var().
  4. Prueba a cambiar --color-primary por otro color y recarga. Si el sitio entero cambia de color con una sola línea, lo has hecho bien.
  5. Añade un clamp() al tamaño de tu h1 y comprueba cómo se comporta al estrechar la ventana.
Objetivo mínimoVariables con nombres semánticos y un cambio global comprobado.
Si lo tienesCrea una segunda variante visual modificando solo las variables.
RetoRecibe CSS ajeno y distingue qué valores merecen variable y cuáles deben seguir locales.

No conviertas todo en una variable

Un valor que aparece una sola vez y no es una decisión de diseño no gana nada por ser variable: gana una indirección más que leer. Si border-width: 1px solo está en un sitio, déjalo donde está.

La pregunta es: «si esto cambia, ¿tendría que cambiar en otros sitios a la vez?». Si la respuesta es sí, es una variable. Si es no, es un valor.

Checkpoint · fin de la sesión 6 y de la semana 2

  • Tu hoja empieza con el box-sizing: border-box global.
  • Tienes un bloque :root con colores y espaciados nombrados por su papel.
  • Puedes cambiar el color principal del sitio tocando una línea.
  • Tus anchuras usan max-width o min(), no medidas fijas.
  • Las cuatro páginas comparten tipografía, escala y paleta.

Antes de cerrar · 2 minutos, sin mirar

  1. ¿Por qué las variables se declaran en :root?
  2. ¿Qué hace min(90%, 70rem), en una frase?
  3. ¿Qué tres valores lleva clamp()?
Ver respuestas

1 · Porque las custom properties se heredan, y :root es el elemento raíz: declarándolas ahí quedan disponibles en todo el documento.

2 · Ocupa el 90 % del espacio, pero sin pasar nunca de 70rem. Pone un techo.

3 · Un mínimo, un valor preferido que se adapta, y un máximo.

Microprueba semanal 2 · 5–10 minutos

Individual, sin IA y sin apuntes.

  1. Dibuja y nombra las cuatro capas del box model.
  2. Explica cuándo elegirías rem, % y un píxel.
  3. Convierte tres colores repetidos en una custom property y predice el efecto de cambiarla.