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 viewportvh= 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 vhvmax= 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:
rempara tamaños de fuente y espaciado%para anchos fluidospxpara bordes y detalles precisos
20% casos especiales:
vh/vwpara elementos fullscreenempara componentes escalablesvmin/vmaxpara 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.