Las unidades relativas en CSS son medidas calculadas a partir del entorno, como el tamaño del contenedor, la ventana del navegador o la tipografía base del usuario.
Hasta ahora hemos usado muchos píxeles (px) porque son fáciles de entender. Le decimos a una caja width: 300px y mide 300 píxeles. Muy cómodo. El problema aparece cuando esa caja vive en una pantalla que no tiene espacio suficiente, porque los píxeles obedecen sin pensar.
Si vuestra caja mide 800px y el móvil tiene 390px de ancho, el navegador no va a decir “uy, igual esto lo adapto un poco”. No. La dibuja, se sale por la derecha, aparece scroll horizontal y queda fatal.
Diseñar responsive no consiste solo en escribir media queries. Consiste en usar medidas que puedan adaptarse antes de que la página se rompa.
Absolutas frente a relativas
En CSS tenemos unidades absolutas y unidades relativas. Las unidades absolutas tienen un tamaño fijo. El caso más habitual es el píxel.
.caja {
width: 400px;
padding: 24px;
}
Esto puede estar perfectamente bien para un icono, un borde, una sombra o un detalle muy concreto. El píxel no es el enemigo.
El problema es usarlo para definir toda la arquitectura de una página, como si todos los usuarios tuvieran vuestra misma pantalla, vuestro mismo zoom y vuestra misma vista.
Las unidades relativas, en cambio, se calculan a partir de otra referencia.
.caja {
width: 80%;
padding: 1rem;
}
Aquí el ancho depende del contenedor, y el relleno depende del tamaño de fuente raíz. Es decir, la medida se adapta al contexto.
Porcentajes (%)
El porcentaje es la unidad relativa más clásica. Cuando usamos %, el navegador calcula el valor tomando como referencia normalmente el tamaño del contenedor padre.
.contenedor {
width: 800px;
}
.columna {
width: 50%;
}
En este ejemplo, .columna mide 400px, porque es el 50% de 800px. Si el contenedor baja a 500px, la columna baja automáticamente a 250px.
Unidades de viewport (vw, vh, vmin, vmax)
El viewport es la zona visible del navegador. No es la página completa, sino la ventana por la que el usuario está mirando.
Las unidades de viewport se calculan tomando como referencia esa ventana visible.
1vwequivale al 1% del ancho del viewport.1vhequivale al 1% del alto del viewport.1vminequivale al 1% de la dimensión menor entre ancho y alto.1vmaxequivale al 1% de la dimensión mayor entre ancho y alto.
.hero {
min-height: 100vh;
}
Esta regla dice que la sección debe medir, como mínimo, el alto completo de la ventana visible.
Esto es muy útil para portadas, pantallas de bienvenida, paneles a pantalla completa o zonas donde queremos que el primer bloque tenga presencia.
.portada {
min-height: 100vh;
display: grid;
place-items: center;
}
Fijaos en que usamos min-height, no height. Si el contenido necesita más espacio, la caja puede crecer. Con height: 100vh a secas podéis acabar cortando contenido en pantallas pequeñas.
Unidades tipográficas: em y rem
Ahora vamos con las unidades relativas para texto y espaciado. Aquí aparecen em y rem.
Ambas se basan en el tamaño de fuente, pero no toman la misma referencia.
La unidad em depende del tamaño de fuente del propio elemento o del contexto heredado.
.caja {
font-size: 20px;
padding: 1em;
}
Aquí 1em equivale a 20px, porque la caja tiene font-size: 20px.
Esto puede ser muy útil. Por ejemplo, si un botón tiene una letra más grande, su padding puede crecer proporcionalmente.
.boton {
font-size: 1rem;
padding: 0.75em 1.25em;
}
.boton.grande {
font-size: 1.25rem;
}
El botón grande no solo aumenta la letra. También aumenta su relleno, porque el padding está en em. El componente escala consigo mismo.
El problema de em aparece cuando lo usamos para font-size en estructuras anidadas.
ul {
font-size: 1.2em;
}
Si metéis una lista dentro de otra lista, el cálculo se acumula. La primera lista crece un 20%. La lista dentro de ella crece otro 20% sobre el resultado anterior. Y así sucesivamente, hasta que el tercer nivel parece escrito para leerlo desde la otra punta de la habitación.
Por eso em es útil, pero hay que saber dónde usarlo.
La unidad rem significa Root EM. Se calcula siempre respecto al tamaño de fuente del elemento raíz (<html>).
Por defecto, la mayoría de navegadores usan 16px como tamaño base. Por tanto:
1remsuele equivaler a16px.1.5remsuele equivaler a24px.2remsuele equivaler a32px.
p {
font-size: 1rem;
}
h1 {
font-size: 2.5rem;
}
La ventaja de rem es que no se acumula con la anidación. Da igual que un párrafo esté dentro de una tarjeta, dentro de una columna, dentro de un layout. 1rem sigue mirando a la raíz.
min(), max() y clamp()
CSS moderno permite combinar unidades con funciones matemáticas. Son tremendamente útiles para responsive.
Elige el valor más pequeño.
.contenedor {
width: min(90%, 1100px);
}
La caja mide el 90% del espacio disponible, salvo que eso supere 1100px. En ese caso se queda en 1100px.
Elige el valor más grande.
.seccion {
padding: max(1rem, 4vw);
}
El padding nunca será menor que 1rem, pero puede crecer con el viewport.
clamp() define un mínimo, un valor ideal y un máximo.
h1 {
font-size: clamp(2rem, 5vw, 4rem);
}
Esto significa:
- Mínimo:
2rem. - Ideal:
5vw. - Máximo:
4rem.
El título crece con la pantalla, pero no se vuelve minúsculo en móvil ni gigantesco en escritorio. Es una forma muy elegante de hacer tipografía fluida con límites sensatos.
Cuándo usar cada unidad
No hay una respuesta universal, pero sí una guía práctica para no elegir unidades al azar.
| Unidad | Usadla para |
|---|---|
% | Anchuras dependientes del contenedor |
rem | Tipografía, espaciados y tamaños generales |
em | Que algo escale con el tamaño del propio componente |
vh / dvh | Alturas relacionadas con la ventana |
vw | Valores ligados al ancho de pantalla |
px | Detalles pequeños y concretos: bordes, sombras finas o ajustes muy precisos |
