Medidas en CSS: px, %, em, rem, vh y más - Guía definitiva


Las unidades de medida en CSS son como las herramientas de un carpintero: cada una tiene su propósito específico. Usar píxeles para todo es como usar solo un martillo - técnicamente funciona, pero hay herramientas mejores para cada trabajo.

Vamos a explorar cada unidad, cuándo usarla y por qué, con analogías que harán que todo tenga sentido.

Veamos un ejemplo visual antes de empezar:

Pulsa el botón que aparece debajo, RUN PROJECT

Unidades absolutas: precisión milimétrica

px (píxeles) - El martillo confiable

¿Qué es? Un píxel CSS no es exactamente un píxel físico de pantalla, sino una unidad de referencia que el navegador interpreta.

Analogía: Como usar una regla milimétrica - siempre mide lo mismo, sin importar el contexto.

.border-precision {
  border: 1px solid #ccc; /* Siempre 1px, nunca se escala */
  border-radius: 8px; /* Esquinas consistentes */
}

.icon {
  width: 24px; /* Iconos siempre del mismo tamaño */
  height: 24px;
}

.shadow {
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); /* Sombras precisas */
}

✅ Perfecto para:

  • Bordes (siempre 1px)
  • Iconos pequeños (16px, 24px, 32px)
  • Sombras y efectos decorativos
  • Elementos que deben mantener tamaño fijo

❌ Evitar para:

  • Texto (no es accesible)
  • Espaciado general
  • Elementos que deben escalar

Unidades relativas al texto: escalabilidad inteligente

em - El hijo obediente

¿Qué es? Relativo al tamaño de fuente del elemento padre.

Analogía: Como un termostato que se ajusta según la temperatura de la habitación donde está.

.card {
  font-size: 18px; /* Tamaño base de la card */
}

.card h3 {
  font-size: 1.5em; /* 1.5 × 18px = 27px */
  margin-bottom: 0.5em; /* 0.5 × 27px = 13.5px */
}

.card p {
  font-size: 1em; /* 1 × 18px = 18px */
  line-height: 1.4em; /* 1.4 × 18px = 25.2px */
}

.card-small {
  font-size: 14px; /* Cambiamos el contexto */
}

.card-small h3 {
  /* Ahora será 1.5 × 14px = 21px - se adapta automáticamente */
}

✅ Perfecto para:

  • Espaciado interno de componentes
  • Elementos decorativos que deben escalar con el texto
  • Componentes que necesitan escalabilidad interna

❌ Problemas:

  • Herencia en cascada (puede volverse impredecible)
  • Cálculos complejos con múltiples niveles

rem - La referencia universal

¿Qué es? Relativo al tamaño de fuente del elemento raíz (html).

Analogía: Como usar centímetros - siempre la misma referencia, sin importar dónde estés.

html {
  font-size: 16px; /* Base de referencia (1rem = 16px) */
}

/* Sistema de espaciado consistente */
.spacing-xs {
  margin: 0.25rem;
} /* 4px */
.spacing-sm {
  margin: 0.5rem;
} /* 8px */
.spacing-md {
  margin: 1rem;
} /* 16px */
.spacing-lg {
  margin: 1.5rem;
} /* 24px */
.spacing-xl {
  margin: 2rem;
} /* 32px */

/* Tipografía escalable */
.text-sm {
  font-size: 0.875rem;
} /* 14px */
.text-base {
  font-size: 1rem;
} /* 16px */
.text-lg {
  font-size: 1.125rem;
} /* 18px */
.text-xl {
  font-size: 1.25rem;
} /* 20px */
.text-2xl {
  font-size: 1.5rem;
} /* 24px */

/* Si el usuario cambia el tamaño base del navegador,
   todo se escala proporcionalmente */

✅ Perfecto para:

  • Tamaños de fuente
  • Espaciado (margin, padding)
  • Dimensiones de componentes
  • Sistemas de design consistentes

✅ Ventaja clave: Respeta las preferencias de accesibilidad del usuario.


Unidades relativas al contenedor: fluidez inteligente

% (porcentaje) - El camaleón adaptativo

¿Qué es? Relativo al tamaño del elemento padre.

Analogía: Como fracciones de una pizza - si la pizza es más grande, tu porción también.

/* Layout fluido */
.container {
  max-width: 1200px;
  margin: 0 auto;
}

.sidebar {
  width: 25%; /* Siempre 1/4 del contenedor */
}

.main-content {
  width: 75%; /* Siempre 3/4 del contenedor */
}

/* Imágenes responsivas */
.responsive-image {
  width: 100%; /* Nunca sobresale del contenedor */
  height: auto; /* Mantiene proporción */
}

/* Elementos centrados */
.modal {
  width: 90%; /* Se adapta a pantalla pequeña */
  max-width: 500px; /* Pero no crece infinitamente */
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

✅ Perfecto para:

  • Layouts fluidos
  • Imágenes responsivas
  • Anchos de contenedores
  • Posicionamiento relativo

❌ Limitaciones:

  • No funciona bien para heights sin contexto
  • Puede ser impredecible en elementos flexbox/grid

Unidades del viewport: diseño adaptativo moderno

vw/vh - La ventana como referencia

¿Qué son?

  • vw = 1% del ancho del viewport
  • vh = 1% del alto del viewport

Analogía: Como porcentajes de la ventana - si cambias el tamaño de la ventana, todo se adapta proporcionalmente.

/* Hero section que siempre ocupa toda la pantalla */
.hero {
  width: 100vw;
  height: 100vh;
  background: linear-gradient(45deg, #667eea 0%, #764ba2 100%);
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Texto que escala con el tamaño de pantalla */
.hero h1 {
  font-size: 8vw; /* Se hace más grande en pantallas grandes */
  max-font-size: 4rem; /* Pero no infinitamente grande */
}

/* Sidebar que ocupa porcentaje fijo del viewport */
.sidebar-fixed {
  width: 20vw;
  height: 100vh;
  position: fixed;
  left: 0;
  top: 0;
}

dvh/dvw - La solución moderna para móviles

¿Qué son? Dynamic viewport units - se adaptan cuando aparece/desaparece la barra de navegación móvil.

/* Problema clásico en móviles */
.fullscreen-old {
  height: 100vh; /* No considera la barra de navegación */
}

/* Solución moderna */
.fullscreen-new {
  height: 100dvh; /* Se adapta dinámicamente */
}

/* También disponibles: dvw, dvmin, dvmax */

vmin/vmax - Los extremos inteligentes

¿Qué son?

  • vmin = el menor entre vw y vh
  • vmax = el mayor entre vw y vh
/* Elemento que siempre cabe en pantalla */
.always-visible {
  width: 80vmin; /* Nunca sobresale, en ninguna orientación */
  height: 80vmin;
}

/* Texto que aprovecha el eje más largo */
.responsive-text {
  font-size: 5vmax; /* Más grande en landscape, más pequeño en portrait */
}

Unidades de contenedor: el futuro del responsive

cqw/cqh - Container Query Units

¿Qué son? Relativas al contenedor padre, no al viewport.

.card-container {
  container-type: inline-size; /* Habilita container queries */
}

.card {
  padding: 2cqw; /* Relativo al ancho del contenedor */
  font-size: 4cqw; /* Se adapta al contenedor, no al viewport */
}

/* La card se comporta diferente según su contenedor */
@container (min-width: 300px) {
  .card h3 {
    font-size: 6cqw;
  }
}

La fórmula perfecta: cuándo usar cada una

Sistema de medidas por casos de uso

/* Tipografía y espaciado: rem es rey */
body {
  font-size: 1rem;
}
h1 {
  font-size: 2.5rem;
  margin-bottom: 1rem;
}
.section {
  padding: 3rem 0;
}

/* Precisión visual: px para detalles */
.border {
  border: 1px solid #ccc;
}
.icon {
  width: 24px;
  height: 24px;
}
.shadow {
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

/* Layouts fluidos: % y viewport units */
.container {
  width: 90%;
  max-width: 1200px;
}
.hero {
  height: 100vh;
}
.grid-item {
  width: calc(50% - 1rem);
}

/* Componentes escalables: em */
.button {
  font-size: 1rem;
  padding: 0.75em 1.5em; /* Se escala con el tamaño de fuente */
  border-radius: 0.25em;
}

/* Responsive typography: clamp() */
.heading {
  font-size: clamp(1.5rem, 4vw, 3rem); /* Min 24px, max 48px, escalable */
}

La regla 80/20 de las unidades CSS

80% de tu CSS debería usar:

  • rem para tamaños de fuente y espaciado
  • % para anchos fluidos
  • px para bordes y detalles precisos

20% casos especiales:

  • vh/vw para elementos fullscreen
  • em para componentes escalables
  • vmin/vmax para elementos adaptativos
  • Container queries para componentes modulares

Funciones modernas: calc(), clamp() y min()/max()

calc() - La calculadora CSS

/* Layouts complejos */
.sidebar {
  width: calc(25% - 1rem); /* Porcentaje menos spacing fijo */
}

.content {
  width: calc(100vw - 250px); /* Viewport menos sidebar fijo */
}

/* Centrado matemático */
.centered {
  width: calc(100% - 2rem); /* Ancho total menos padding */
  margin: 0 1rem;
}

clamp() - El rango inteligente

/* Tipografía fluida perfecta */
h1 {
  font-size: clamp(2rem, 5vw, 4rem);
  /* Mínimo 32px, máximo 64px, escalable entre medias */
}

/* Contenedores adaptativos */
.container {
  width: clamp(300px, 90%, 1200px);
  /* Nunca menos de 300px, nunca más de 1200px */
}

/* Espaciado inteligente */
.section {
  padding: clamp(2rem, 8vw, 6rem) 0;
  /* Más padding en pantallas grandes, mínimo decente en pequeñas */
}

Guía de decisión rápida

¿Qué unidad usar?

/* ¿Necesita precisión visual? → px */
border: 1px solid #ccc;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);

/* ¿Debe escalar con el texto del usuario? → rem */
font-size: 1.2rem;
margin: 2rem 0;
padding: 1rem;

/* ¿Debe adaptarse al contenedor? → % */
width: 80%;
img {
  width: 100%;
}

/* ¿Debe ocupar toda la pantalla? → viewport units */
height: 100vh;
width: 100vw;

/* ¿Es un componente modular? → em */
.button {
  padding: 0.75em 1.5em;
  font-size: 1em;
}

/* ¿Necesita fluidez entre rangos? → clamp() */
font-size: clamp(1rem, 2.5vw, 2rem);

Errores comunes que debes evitar

❌ No hagas:

/* Texto en px (no accesible) */
p {
  font-size: 16px;
}

/* Heights en % sin contexto */
.box {
  height: 50%;
} /* ¿50% de qué? */

/* Viewport units en elementos pequeños */
.icon {
  width: 2vw;
} /* Se vuelve invisible en móviles */

/* Em anidados sin control */
.parent {
  font-size: 1.2em;
}
.child {
  font-size: 1.2em;
} /* 1.2 × 1.2 = 1.44em = chaos */

✅ Mejor:

/* Texto escalable */
p {
  font-size: 1rem;
}

/* Heights con contexto */
.box {
  height: 50vh;
} /* O min-height: 300px */

/* Icons con tamaño mínimo */
.icon {
  width: clamp(16px, 2vw, 32px);
}

/* Control de em con CSS custom properties */
.component {
  --font-size: 1rem;
  font-size: var(--font-size);
}
.component__title {
  font-size: calc(var(--font-size) * 1.5);
}

Conclusión: diseña con propósito

Las unidades CSS no son solo números - son herramientas de comunicación entre tu diseño y el navegador. Cada una tiene su superpoder:

  • rem: La base universal para escalabilidad
  • px: Precisión cuando la necesitas
  • %: Fluidez relativa al contexto
  • vh/vw: Control total del viewport
  • em: Escalabilidad modular
  • clamp(): Fluidez inteligente entre límites

La regla de oro: Usa la unidad que mejor exprese la intención de tu diseño. Si quieres que algo escale con el texto del usuario, usa rem. Si necesita adaptarse al contenedor, usa %. Si debe ocupar la pantalla completa, usa viewport units.

Recuerda: No existe la unidad perfecta para todo. Como un buen carpintero, ten todas las herramientas disponibles y elige la correcta para cada trabajo. Tu CSS será más predecible, mantenible y accesible.