Saltar al contenido

CSS, de a poco

Curso de CSS

Unidades

Lección 03 de 37 · 5 min

Cada medida en CSS lleva una unidad, y la unidad dice contra qué se mide. Elegir bien es lo que hace que una página se adapte a la pantalla y a la configuración de quien la lee.

Absolutas y relativas

px es una unidad absoluta: 64px mide lo mismo en cualquier lugar de la página. No es un píxel físico de la pantalla; en pantallas de alta densidad, un píxel de CSS ocupa varios. Las unidades relativas se calculan a partir de otra medida:

  1. emEl font-size del propio elemento, que si no lo cambia hereda del padre.
  2. remEl font-size de la raíz, el elemento html.
  3. %En width, el ancho del bloque contenedor, casi siempre el padre.
  4. vwEl ancho de la ventana del navegador; 1vw es el 1%.
  5. chEl ancho del carácter «0» en la fuente del elemento.
  6. cqiEl ancho del contenedor más cercano; 1cqi es el 1%.

Cambiá la unidad y mové los sliders: la tabla marca en naranja la medida de la que depende el ancho del campo, y la regla debajo lo divide en pasos de esa unidad.

unidad
width: 4em = 80px
contra qué se mide
html · font-size16px
formulario · font-size20px
«0» del formulario12px
formulario · width240px
ventana · width1280px
unidades.css
html {
font-size: 100%; /* 16px si el navegador usa 16px */
}
.formulario {
width: 240px;
font-size: 20px;
}
.campo {
width: 4em; /* 4 × 20px = 80px */
}
unidades.html
<html class="text-[100%]"> <!-- 16px si el navegador usa 16px -->
<div class="w-[240px] text-[20px]"> <!-- formulario -->
<div class="w-[4em]"></div> <!-- campo -->
</div>
</html>

em y rem

em depende del elemento, y eso se acumula al anidar. Usado en font-size, em toma el tamaño del padre: si cada nivel pide 1.25em, cada uno multiplica al anterior.

Un título dentro de una tarjeta de 20px, dentro de html a 16px. Con font-size 1.25em el título mide 25px, porque multiplica los 20px de la tarjeta; con 1.25rem mide 20px, porque mira la raíz.
styles.css
html { font-size: 100%; } /* 16px por defecto */
.tarjeta { font-size: 1.25em; } /* 16 × 1.25 = 20px */
.tarjeta .titulo { font-size: 1.25em; } /* 20 × 1.25 = 25px */

El título termina en 25px: 1.5625 veces la raíz, no 1.25. Con 1.25rem los dos medirían 20px, porque rem siempre mira la raíz, sin importar dónde esté el elemento.

Por eso rem es la opción por defecto para tamaños de texto y espaciados: si quien lee subió el tamaño de letra en su navegador, todo crece en proporción. Para que funcione, no fijes el font-size de html en px. Guardá em para lo que tiene que seguir al texto del propio elemento, como el relleno de un botón.

Porcentajes y ventana

En width, un porcentaje se calcula sobre el ancho del bloque contenedor. Un campo de 50% dentro de un padre de 240px mide 120px, y si el padre se achica, el campo también.

Las unidades de ventana ignoran al padre: vw es el 1% del ancho de la ventana y vh, el 1% del alto. En celulares, 100vh puede quedar más alto que lo visible cuando aparecen las barras del navegador. dvh sigue el alto visible en cada momento:

Un celular con las barras del navegador visibles. Con min-height 100vh la portada mide como si las barras no estuvieran, y su botón queda debajo de la barra de abajo; con 100dvh mide lo que se ve y el botón entra.
styles.css
.portada {
min-height: 100dvh;
}

Una guía rápida:

rem
tamaños de texto y espaciados
em
lo que acompaña al texto del elemento
%
anchos que dependen del contenedor
ch
el ancho de una línea de texto
vw · dvh
lo que depende de la pantalla
px
detalles finos, como un borde de 1px

Otras unidades

CSS tiene más unidades. Estas son las que vale la pena conocer:

  1. chEl ancho del «0». En una fuente proporcional es aproximado, pero sirve para limitar el largo de línea: max-width: 65ch deja unas 65 letras por renglón.
  2. lh · rlhEl interlineado del elemento y el de la raíz. margin-block: 1lh separa párrafos exactamente una línea.
  3. vmin · vmaxEl 1% del lado más corto o del más largo de la ventana, para algo que tiene que entrar parado y acostado.
  4. svh · lvh · dvhEl alto de la ventana con las barras visibles, ocultas, o el que haya en cada momento. También existen svw, lvw y dvw.
  5. cqi · cqb · cqw · cqhComo las de ventana, pero relativas al contenedor más cercano que declara container-type.

Las de contenedor hacen que un componente se adapte al lugar donde está y no a la pantalla:

styles.css
.tarjetas {
container-type: inline-size;
}
.tarjeta h2 {
font-size: clamp(1rem, 5cqi, 2rem);
}

Quedan las de nicho. ex, cap e ic miden la altura de la «x», la de las mayúsculas y el ancho de un ideograma, y cada una tiene su versión de raíz: rex, rcap, ric y también rch. Las físicas, cm, mm, Q, in, pt y pc, son para imprimir: en pantalla 1in siempre vale 96px, aunque tu monitor diga otra cosa.

Hay unidades que no son de longitud: fr reparte el espacio libre entre las columnas de una grilla; deg, rad, grad y turn miden ángulos, como en rotate(45deg) o el tono de oklch(); y s y ms miden tiempo en transiciones y animaciones. Cada una aparece en su bloque.

En Tailwind

La escala de Tailwind está en rem: cada paso de w-*, p-* o gap-* vale 0.25rem, así que w-16 es 4rem, que da 64px solo si la raíz mide 16px. Para cualquier otra unidad, escribí el valor entre corchetes y Tailwind lo copia tal cual.

CSSTailwind
width: 4remw-16
width: 64pxw-[64px]
width: 4emw-[4em]
width: 50%w-1/2 · w-[50%]
max-width: 65chmax-w-prose · max-w-[65ch]
height: 100dvhh-dvh · h-svh · min-h-dvh
container-type: inline-size@container · w-[50cqi]
tarjetas.html
<section class="min-h-dvh">
<div class="@container">
<article class="max-w-prose p-6">
<h2 class="text-[clamp(1rem,5cqi,2rem)]">Título</h2>
<p class="text-base">Texto con unas 65 letras por renglón.</p>
</article>
</div>
</section>