px, rem, em, vh — cuándo usar cada unidad CSS

Guía práctica para elegir la unidad CSS correcta en cada situación: layout, tipografía, espaciado y diseño responsive.

5 min de lectura CSS Accesibilidad
Elegir la unidad CSS incorrecta es uno de los errores más comunes en el desarrollo front-end. Usa px en todas partes y tu tipografía se rompe cuando los usuarios hacen zoom en el navegador. Usa em sin cuidado y tu padding se acumula de formas inesperadas. La buena noticia: una vez que entiendes por qué existe cada unidad, la elección correcta se vuelve obvia.
Esta guía cubre px, rem, em, vh, vw — las cinco unidades que usarás en el 95% de tus proyectos — con reglas prácticas, ejemplos de código y una perspectiva de accesibilidad primero. Al final, una tabla de conversión y una guía de decisión que puedes marcar como favorita.

Unidades absolutas vs relativas

Las unidades CSS se dividen en dos grandes categorías. Las unidades absolutas tienen un tamaño fijo que no cambia según el contexto. Las unidades relativas derivan su tamaño de una referencia: un elemento padre, el tamaño de fuente raíz o las dimensiones del viewport.

Unidad Tipo Relativa a
pxAbsolutaPíxel CSS (independiente del dispositivo)
pt, cmAbsolutaMedida física (impresión)
remRelativaFont-size de <html>
emRelativaFont-size del elemento actual
%RelativaDimensión del elemento padre
vh, vwRelativaAltura / ancho del viewport
dvh, dvwRelativaViewport dinámico (UI del browser incluida)

Para el diseño en pantalla, prefiere unidades relativas para tipografía y espaciado. Las unidades absolutas se reservan para elementos que nunca deben escalar: bordes, contornos y detalles decorativos.

px — precisión de píxel

Un píxel CSS no es un píxel físico de pantalla. Es una unidad independiente del dispositivo definida de modo que un píxel CSS equivale aproximadamente a 1/96 de pulgada. En pantallas de alta densidad (Retina), un píxel CSS corresponde a 2 o 3 píxeles físicos — pero desde la perspectiva de CSS sigue siendo 1px.

Cuándo usar px

  • Bordes y contornos: border: 1px solid — no deben escalar nunca
  • Box-shadow: box-shadow: 0 2px 8px rgba(0,0,0,.15)
  • Tamaños de iconos con sistemas de iconos de tamaño fijo
  • Breakpoints de media query (aunque em es más seguro — ver Guía de decisión)

Cuándo NO usar px

  • font-size — ignora las preferencias del usuario, falla WCAG 1.4.4
  • line-height — prefiere sin unidad (1.5) o rem
  • padding y margin cuando quieres que escalen con el tamaño de fuente

Regla de accesibilidad: si un usuario configura su navegador al 200% de tamaño de texto, las fuentes en px lo ignoran. Las fuentes en rem lo respetan. No es opcional — es un requisito WCAG 2.1 Nivel AA.

Herramienta gratuita Convertidor de Unidades CSS Convierte px, rem, em, vh y más — pega un valor y obtén todos los equivalentes al instante

rem — escala relativa a la raíz

rem significa root em. Siempre es relativo al font-size definido en el elemento <html>. El valor predeterminado del navegador es 16px, por lo que 1rem = 16px a menos que lo modifiques.

/* Predeterminado: 1rem = 16px */
h1 { font-size: 2rem; }    /* 32px */
p  { font-size: 1rem; }    /* 16px */
.small { font-size: .75rem; } /* 12px */

Como rem está anclado a la raíz, no se acumula cuando los elementos están anidados — a diferencia de em. Esto lo convierte en la elección predeterminada para tamaños de fuente y espaciado en todo el proyecto.

El truco del 62.5%

Configurar html { font-size: 62.5%; } hace que 1rem = 10px, simplificando el cálculo mental (1.6rem = 16px). Hoy se considera un anti-patrón porque:

  • Anula la preferencia de tamaño de fuente del navegador del usuario
  • Los componentes de terceros que dependen de la base de 16px se renderizarán incorrectamente
  • Las herramientas CSS modernas (clamp(), custom properties) eliminan la necesidad del cálculo en base 10

Usa rem con la base predeterminada de 16px. Divide por 16 mentalmente o usa un convertidor px-to-rem.

em — tamaño relativo al contexto

em es relativo al font-size del elemento actual. Si no se define un font-size en el elemento, se hereda del padre — por eso em puede acumularse cuando los elementos están anidados.

/* Ejemplo de acumulación */
.parent { font-size: 1.2em; }  /* 19.2px si el padre es 16px */
.child  { font-size: 1.2em; }  /* 23.04px — 1.2 × 19.2px */

Cuándo em es la mejor opción

Em es la unidad correcta cuando quieres que el espaciado o el tamaño escale proporcionalmente al font-size del propio componente, no a la raíz global:

.btn {
  font-size: 1rem;
  padding: .5em 1.2em;  /* escala con el font-size del btn */
}
.btn-large {
  font-size: 1.25rem;
  /* el padding escala automáticamente */
}

Cuándo evitar em

  • Tamaños de fuente globales — usa rem para evitar acumulaciones en el DOM
  • Dimensiones de layout — usa rem, % o unidades viewport
Herramienta gratuita Convertidor px a rem Convierte cualquier valor en píxeles a rem con un clic, con tamaño de fuente raíz ajustable

vh y vw — unidades viewport

vh (altura viewport) y vw (ancho viewport) equivalen cada uno al 1% de la dimensión correspondiente del viewport. Ideales para layouts que deben llenar la pantalla.

.hero {
  height: 100vh;
  width: 100vw;
}

El problema de 100vh en móvil

En los navegadores móviles, la barra de direcciones y el chrome de navegación ocupan espacio — pero no se restan de 100vh. Esto hace que un elemento 100vh sea más alto que la pantalla visible, causando una barra de desplazamiento no deseada.

La solución moderna: dvh

La unidad dvh (dynamic viewport height) fue creada para resolver esto. Se actualiza cuando la UI del navegador aparece o desaparece:

.hero {
  height: 100vh;   /* fallback para navegadores más antiguos */
  height: 100dvh;  /* dinámico — tiene en cuenta el chrome colapsable */
}

Incluye siempre el fallback vh. Otras unidades viewport útiles: svh, lvh, vmin y vmax.

Tabla de conversión rápida (base 16px)

Cuando conoces el valor en píxeles pero necesitas el equivalente en rem, divide por 16:

px rem em (1:1)
80.5rem0.5em
120.75rem0.75em
140.875rem0.875em
161rem1em
181.125rem1.125em
201.25rem1.25em
241.5rem1.5em
322rem2em
483rem3em
644rem4em

¿Necesitas convertir una hoja de estilos completa? Usa el Convertidor de Unidades CSS.

Guía de decisión

En caso de duda, usa esta tabla como referencia rápida:

Propiedad / Caso de uso Unidad recomendada
Tamaño de fuenterem
Padding / margin (global)rem
Padding interno a un componenteem
Bordes, contornos, box-shadowpx
Columnas / anchos de layout% o fr (CSS Grid)
Secciones hero / pantalla completadvh con fallback vh
Breakpoints de media queryem (más accesible) o rem
Line-heightSin unidad (1.5) o rem
Tamaño de fuente responsive (fluido)clamp() con valores rem

La tipografía fluida con clamp() es un patrón poderoso. Usa el Generador Font Size Clamp para construir estos valores visualmente.

Herramienta gratuita Generador Font Size Clamp Crea tipografía responsive fluida con clamp() — define min, max y rango fluido visualmente

Preguntas frecuentes

¿Cuál es la diferencia entre unidades CSS absolutas y relativas?+
Las unidades absolutas (px, pt, cm) tienen un tamaño fijo que no cambia según el contexto. Las unidades relativas (rem, em, %, vh) escalan basándose en una referencia — el tamaño de fuente raíz, el elemento padre o el viewport. Para diseños responsive y accesibles, las unidades relativas son generalmente preferidas para tipografía y espaciado.
¿Por qué debería usar rem en lugar de px para los tamaños de fuente?+
Cuando los usuarios configuran un tamaño de fuente predeterminado más grande en su navegador (una necesidad de accesibilidad), los tamaños basados en rem se adaptan en consecuencia. Los tamaños en px permanecen fijos e ignoran la preferencia del usuario. Usar rem para font-size respeta la configuración del usuario y es necesario para pasar WCAG 1.4.4 (Cambio de tamaño de texto).
¿Cuándo debería usar em en lugar de rem?+
Usa em cuando quieras que el espaciado o el tamaño escale relativamente al font-size del propio componente, no a la raíz global. El padding de un botón en em crecerá proporcionalmente si el font-size del botón aumenta, manteniendo un peso visual consistente.
¿Qué es el truco del 62.5% y debería usarlo?+
Configurar html { font-size: 62.5% } hace que 1rem = 10px, simplificando el cálculo mental (1.6rem = 16px). Se considera un anti-patrón porque anula el valor predeterminado del navegador del usuario y puede romper componentes de terceros que dependen de la base de 16px.
¿Por qué 100vh se comporta de forma inesperada en móvil?+
En los navegadores móviles, la barra de direcciones y el chrome de la UI ocupan espacio en el viewport pero no se restan de 100vh. Esto hace que los elementos 100vh se extiendan más allá del área visible. La solución moderna es usar 100dvh (altura de viewport dinámica), que tiene en cuenta la UI colapsable del navegador. Añade un fallback: height: 100vh; height: 100dvh.
¿Qué unidad CSS es mejor para los breakpoints de media query?+
La comunidad está dividida: px es más sencillo de leer, pero los breakpoints en em y rem se activan correctamente cuando el usuario ha cambiado su tamaño de fuente raíz. Usar em (ej. @media (max-width: 48em)) es el enfoque más robusto para la accesibilidad.
¿Cómo convierto rápidamente px a rem?+
Divide el valor en px por 16 (el tamaño de fuente raíz predeterminado): 24px ÷ 16 = 1.5rem. Si usas un tamaño raíz diferente, divide por ese valor. Una herramienta de conversión puede automatizar esto para hojas de estilo completas.