CSS

CSS

Tutorial CSS: Tipografía responsive

Aprende a crear tipografía responsive en CSS usando unidades rem, em, vw y la función clamp() para escalado fluido y accesible.

Aprende CSS y certifícate

Unidades relativas (rem, em) para escalado de texto

La tipografía responsive es fundamental para crear sitios web que se adapten a diferentes dispositivos y tamaños de pantalla. Uno de los pilares para lograr este objetivo es el uso de unidades relativas para el tamaño del texto, en lugar de unidades fijas como píxeles.

Limitaciones de las unidades fijas

Antes de profundizar en las unidades relativas, es importante entender por qué las unidades fijas como píxeles (px) pueden ser problemáticas:

/* Enfoque no responsive con unidades fijas */
h1 {
  font-size: 32px;
}

p {
  font-size: 16px;
}

Este enfoque presenta varios problemas:

  • No se adapta a las preferencias del usuario
  • No escala proporcionalmente en diferentes dispositivos
  • Dificulta la accesibilidad para usuarios con necesidades visuales especiales

Unidades em

La unidad em es una unidad relativa que se basa en el tamaño de fuente del elemento padre. Un valor de 1em equivale al tamaño de fuente del elemento contenedor.

body {
  font-size: 16px; /* Tamaño base */
}

h1 {
  font-size: 2em; /* 2 × 16px = 32px */
}

p {
  font-size: 1em; /* 1 × 16px = 16px */
}

La principal ventaja de em es que permite crear relaciones proporcionales entre elementos. Si cambias el tamaño base, todos los elementos escalados con em se ajustarán proporcionalmente.

Comportamiento anidado de em

Es importante entender que em se basa en el tamaño de fuente del elemento padre inmediato, lo que puede llevar a un efecto cascada cuando se anidan elementos:

body {
  font-size: 16px;
}

.container {
  font-size: 1.5em; /* 1.5 × 16px = 24px */
}

.container p {
  font-size: 1.2em; /* 1.2 × 24px = 28.8px */
}

Este comportamiento puede ser útil para crear jerarquías visuales, pero también puede complicar el mantenimiento si no se gestiona cuidadosamente.

Unidades rem

La unidad rem (root em) resuelve el problema del efecto cascada de em. Esta unidad siempre se referencia al elemento raíz (generalmente el elemento html), independientemente de la anidación.

html {
  font-size: 16px; /* Tamaño base para toda la página */
}

h1 {
  font-size: 2rem; /* 2 × 16px = 32px */
}

.container {
  font-size: 1.5rem; /* 1.5 × 16px = 24px */
}

.container p {
  font-size: 1.2rem; /* 1.2 × 16px = 19.2px (¡no 28.8px!) */
}

La principal ventaja de rem es que proporciona consistencia y previsibilidad en todo el sitio, ya que todos los tamaños se calculan a partir de un único valor de referencia.

Estrategias para implementar unidades relativas

Establecer un tamaño base responsive

Una práctica común es establecer un tamaño base que se adapte a diferentes tamaños de pantalla:

html {
  /* Tamaño base que se adapta a la configuración del navegador */
  font-size: 100%; /* Equivale a 16px en la mayoría de navegadores */
}

@media (max-width: 768px) {
  html {
    /* Ligeramente más pequeño en dispositivos móviles */
    font-size: 87.5%; /* Equivale a 14px */
  }
}

Sistema de escalado con rem

Puedes crear un sistema de escalado coherente para diferentes elementos:

html {
  font-size: 100%; /* 16px típicamente */
}

h1 {
  font-size: 3rem;    /* 48px */
}

h2 {
  font-size: 2.25rem; /* 36px */
}

h3 {
  font-size: 1.5rem;  /* 24px */
}

p, li, input, button {
  font-size: 1rem;    /* 16px */
}

small {
  font-size: 0.875rem; /* 14px */
}

Combinando em y rem estratégicamente

Puedes aprovechar las ventajas de ambas unidades en diferentes contextos:

html {
  font-size: 100%; /* Base para rem */
}

h1 {
  font-size: 2.5rem; /* Basado en el root */
  margin-bottom: 0.5em; /* Basado en el propio tamaño del h1 */
}

.card {
  font-size: 1rem; /* Restablece el contexto */
}

.card .title {
  font-size: 1.2em; /* Relativo al .card */
}

.card .content {
  font-size: 0.9em; /* Relativo al .card */
  line-height: 1.5; /* Sin unidad - relativo al tamaño de fuente del elemento */
}

En este ejemplo, usamos rem para establecer tamaños absolutos desde la raíz y em para relaciones proporcionales dentro de componentes específicos.

Accesibilidad y preferencias del usuario

Una de las mayores ventajas de usar unidades relativas es que respetan las preferencias de accesibilidad del usuario:

/* Mal enfoque - ignora preferencias del usuario */
body {
  font-size: 16px;
}

/* Buen enfoque - respeta preferencias del usuario */
body {
  font-size: 1rem;
}

Si un usuario ha configurado su navegador para mostrar texto más grande por razones de accesibilidad, el segundo enfoque respetará esa configuración, mientras que el primero la anulará.

Ejemplo práctico: Sistema de tipografía responsive

Veamos un ejemplo completo de un sistema de tipografía responsive usando unidades relativas:

/* Base responsive */
html {
  font-size: 100%; /* 16px por defecto */
}

/* Media queries para ajustar el tamaño base */
@media (max-width: 1200px) {
  html {
    font-size: 93.75%; /* 15px */
  }
}

@media (max-width: 768px) {
  html {
    font-size: 87.5%; /* 14px */
  }
}

/* Sistema de tipografía con rem */
body {
  font-family: 'Open Sans', sans-serif;
  font-size: 1rem;
  line-height: 1.5;
  color: #333;
}

h1, h2, h3, h4, h5, h6 {
  margin-top: 0;
  margin-bottom: 0.5rem;
  font-weight: 700;
  line-height: 1.2;
}

h1 {
  font-size: 2.5rem; /* 40px en tamaño base */
}

h2 {
  font-size: 2rem; /* 32px en tamaño base */
}

h3 {
  font-size: 1.75rem; /* 28px en tamaño base */
}

h4 {
  font-size: 1.5rem; /* 24px en tamaño base */
}

p {
  margin-top: 0;
  margin-bottom: 1rem;
}

small {
  font-size: 0.875rem; /* 14px en tamaño base */
}

Este sistema proporciona una base sólida para una tipografía responsive que:

  • Se adapta a diferentes tamaños de pantalla
  • Mantiene proporciones consistentes
  • Respeta las preferencias de accesibilidad del usuario
  • Es fácil de mantener y actualizar

Las unidades relativas rem y em son herramientas fundamentales para crear diseños web flexibles y accesibles. Mientras que rem proporciona consistencia global al referenciar siempre al elemento raíz, em permite crear relaciones proporcionales dentro de componentes específicos. Combinando ambas estratégicamente, puedes crear sistemas tipográficos que se adapten perfectamente a cualquier dispositivo o preferencia de usuario.

Técnica de fluid typography con clamp()

La tipografía fluida representa un avance significativo respecto a los enfoques tradicionales de diseño responsive. Mientras que las media queries nos permiten definir tamaños de texto para puntos de ruptura específicos, la tipografía fluida permite que el texto se ajuste gradualmente entre diferentes tamaños de pantalla, creando una experiencia más suave y natural.

CSS moderno nos ofrece la función clamp(), una herramienta poderosa que simplifica enormemente la implementación de tipografía fluida sin necesidad de JavaScript o cálculos complejos.

Entendiendo la función clamp()

La función clamp() acepta tres parámetros y devuelve un valor que está restringido dentro de un rango específico:

clamp(valor-mínimo, valor-preferido, valor-máximo);

Donde:

  • valor-mínimo: el tamaño más pequeño que puede tener el texto
  • valor-preferido: el valor calculado que se utilizará si está dentro del rango
  • valor-máximo: el tamaño más grande que puede tener el texto

Esta función es perfecta para tipografía fluida porque permite que el texto:

  • Nunca sea más pequeño que un tamaño mínimo legible
  • Escale proporcionalmente con el viewport
  • Nunca crezca más allá de un tamaño máximo razonable

Implementación básica de tipografía fluida

Veamos un ejemplo simple de cómo implementar tipografía fluida con clamp():

h1 {
  font-size: clamp(1.5rem, 5vw, 3rem);
}

En este ejemplo:

  • El texto nunca será más pequeño que 1.5rem (24px con un tamaño base de 16px)
  • Escalará fluidamente a 5vw (5% del ancho del viewport)
  • Nunca será más grande que 3rem (48px con un tamaño base de 16px)

Fórmula para tipografía fluida avanzada

Para un control más preciso, podemos utilizar una fórmula más elaborada que combine unidades fijas y relativas:

h1 {
  font-size: clamp(1.5rem, 1rem + 2vw, 3rem);
}

En este caso, el valor preferido (1rem + 2vw) combina:

  • Una base fija (1rem) que asegura un tamaño mínimo
  • Un componente fluido (2vw) que escala con el viewport

Esta combinación crea una progresión más controlada que usar solo vw, evitando que el texto se vuelva demasiado pequeño en dispositivos móviles o demasiado grande en pantallas amplias.

Ejemplo práctico: Sistema de tipografía completamente fluido

Veamos cómo podríamos implementar un sistema de tipografía fluido completo:

:root {
  /* Valores base para cálculos */
  --font-size-base: 1rem;
  --viewport-min: 320px;
  --viewport-max: 1200px;
}

/* Títulos principales */
h1 {
  font-size: clamp(2rem, 1.5rem + 2.5vw, 4rem);
  line-height: 1.1;
}

/* Subtítulos */
h2 {
  font-size: clamp(1.5rem, 1rem + 2vw, 3rem);
  line-height: 1.2;
}

/* Títulos de sección */
h3 {
  font-size: clamp(1.25rem, 1rem + 1vw, 2rem);
  line-height: 1.3;
}

/* Texto principal */
p {
  font-size: clamp(1rem, 0.875rem + 0.5vw, 1.25rem);
  line-height: 1.5;
}

/* Texto secundario */
.small-text {
  font-size: clamp(0.875rem, 0.8rem + 0.25vw, 1rem);
  line-height: 1.6;
}

Este sistema asegura que:

  • Cada nivel de texto tenga un tamaño mínimo legible en dispositivos pequeños
  • El texto escale proporcionalmente con el tamaño de la pantalla
  • Ningún texto crezca más allá de un tamaño máximo razonable en pantallas grandes

Cálculos precisos con calc() dentro de clamp()

Para situaciones donde necesitamos un control aún más preciso, podemos combinar calc() dentro de clamp() para crear fórmulas más elaboradas:

h1 {
  /* Escala de 32px a 320px de viewport hasta 64px a 1200px de viewport */
  font-size: clamp(2rem, calc(2rem + ((1vw - 0.2rem) * 4)), 4rem);
}

Esta técnica permite definir puntos de inicio y fin específicos para el escalado, creando una progresión perfectamente controlada entre dos tamaños de pantalla determinados.

Ajuste de la velocidad de escalado

Podemos ajustar la velocidad de escalado modificando el componente variable:

/* Escalado lento - cambia gradualmente */
h1 {
  font-size: clamp(2rem, 1.5rem + 1vw, 3rem);
}

/* Escalado medio - equilibrado */
h2 {
  font-size: clamp(1.5rem, 1rem + 2vw, 2.5rem);
}

/* Escalado rápido - cambia más dramáticamente */
h3 {
  font-size: clamp(1.25rem, 0.5rem + 3vw, 2rem);
}

La elección de la velocidad de escalado dependerá del impacto visual que queramos lograr y de cómo queremos que se comporte el texto en diferentes tamaños de pantalla.

Compatibilidad y fallbacks

La función clamp() tiene buen soporte en navegadores modernos, pero para navegadores más antiguos, es recomendable proporcionar un fallback:

h1 {
  /* Fallback para navegadores que no soportan clamp() */
  font-size: 2rem;
  /* Tipografía fluida para navegadores modernos */
  font-size: clamp(2rem, 1.5rem + 2vw, 4rem);
}

Los navegadores que no entienden clamp() ignorarán esa línea y utilizarán el valor de fallback, mientras que los navegadores modernos sobrescribirán el fallback con el valor de clamp().

Ventajas de la tipografía fluida con clamp()

La implementación de tipografía fluida con clamp() ofrece varias ventajas significativas:

  • Transiciones suaves: Elimina los "saltos" abruptos en el tamaño del texto que ocurren con las media queries tradicionales.
  • Código más limpio: Reduce la necesidad de múltiples media queries para ajustar tamaños de texto.
  • Mejor experiencia de usuario: El texto siempre mantiene proporciones óptimas para el tamaño de pantalla actual.
  • Mantenimiento simplificado: Facilita la actualización del sistema tipográfico al centralizar la lógica de escalado.

Ejemplo de aplicación real

Veamos un ejemplo completo de cómo podríamos aplicar la tipografía fluida a un componente de tarjeta:

.card {
  padding: clamp(1rem, 3%, 2rem);
}

.card-title {
  font-size: clamp(1.25rem, 1rem + 1vw, 2rem);
  margin-bottom: clamp(0.5rem, 2%, 1rem);
}

.card-description {
  font-size: clamp(0.875rem, 0.8rem + 0.5vw, 1.1rem);
  line-height: 1.5;
}

.card-meta {
  font-size: clamp(0.75rem, 0.7rem + 0.25vw, 0.9rem);
  margin-top: clamp(0.5rem, 2%, 1rem);
}

Este enfoque asegura que todos los elementos de texto dentro de la tarjeta mantengan proporciones adecuadas entre sí, independientemente del tamaño de la pantalla, creando una experiencia visual coherente en todos los dispositivos.

La función clamp() representa una evolución natural en el diseño responsive, permitiéndonos crear experiencias tipográficas que se adaptan fluidamente a cualquier contexto de visualización, mejorando tanto la estética como la usabilidad de nuestros diseños web.

Viewport units (vw) en texto y sus limitaciones

Las unidades viewport representan una forma poderosa de crear diseños que se adaptan directamente a las dimensiones de la ventana del navegador. Entre estas unidades, vw (viewport width) es particularmente útil para la tipografía responsive, ya que permite que el texto escale proporcionalmente con el ancho de la pantalla.

¿Qué son las unidades viewport?

Las unidades viewport son valores relativos que se basan en las dimensiones de la ventana del navegador:

  • vw: 1% del ancho del viewport
  • vh: 1% de la altura del viewport
  • vmin: 1% de la dimensión más pequeña (ancho o alto)
  • vmax: 1% de la dimensión más grande (ancho o alto)

Para la tipografía, vw es la unidad más comúnmente utilizada, ya que permite que el texto escale proporcionalmente con el ancho de la pantalla.

Implementación básica con vw

Aplicar unidades vw al texto es sencillo:

h1 {
  font-size: 5vw; /* 5% del ancho del viewport */
}

p {
  font-size: 2vw; /* 2% del ancho del viewport */
}

Este enfoque crea un escalado completamente proporcional donde el texto siempre ocupará el mismo porcentaje del ancho de la pantalla, independientemente del tamaño del dispositivo.

Ventajas de usar vw para texto

El uso de unidades vw para tipografía ofrece varias ventajas significativas:

  • Escalado proporcional: El texto mantiene la misma proporción relativa al ancho de la pantalla.
  • Transiciones suaves: No hay "saltos" en el tamaño del texto como ocurre con las media queries.
  • Código simplificado: Reduce la necesidad de múltiples reglas para diferentes tamaños de pantalla.
  • Consistencia visual: Mantiene las proporciones de diseño en todos los dispositivos.

Limitaciones críticas de vw en tipografía

A pesar de sus ventajas, las unidades vw presentan limitaciones importantes cuando se usan para texto:

1. Problemas de tamaño extremo

El principal problema es que el texto puede volverse demasiado grande en pantallas amplias o ilegiblemente pequeño en dispositivos móviles:

/* Problemático */
h1 {
  font-size: 5vw;
  /* En una pantalla de 320px: 16px (posiblemente demasiado pequeño) */
  /* En una pantalla de 1920px: 96px (probablemente demasiado grande) */
}

Este comportamiento puede crear serios problemas de usabilidad y legibilidad en los extremos del espectro de dispositivos.

2. Falta de control sobre límites

A diferencia de clamp(), las unidades vw por sí solas no ofrecen un mecanismo para establecer límites mínimos o máximos:

/* Sin límites de tamaño */
p {
  font-size: 2vw;
}

Esto puede resultar en texto que crece o se reduce indefinidamente, comprometiendo la experiencia del usuario.

3. Problemas con el zoom del navegador

Las unidades vw no responden correctamente al zoom del navegador, lo que puede crear problemas de accesibilidad:

/* No respeta el zoom del usuario */
p {
  font-size: 2vw;
}

Cuando un usuario hace zoom en la página, el texto con tamaño en vw no se ampliará proporcionalmente como lo haría el texto con tamaños en em o rem, creando una barrera de accesibilidad.

4. Comportamiento en orientación móvil

En dispositivos móviles, el cambio de orientación (de vertical a horizontal) puede causar cambios drásticos en el tamaño del texto:

/* Cambia drásticamente con la orientación */
h2 {
  font-size: 4vw;
  /* En un móvil de 375×667px (vertical): 15px */
  /* El mismo móvil en horizontal (667×375px): 26.7px */
}

Este cambio repentino puede resultar desorientador para los usuarios y afectar negativamente la experiencia de lectura.

5. Conflictos con contenedores con scroll horizontal

Cuando se usa dentro de elementos que tienen scroll horizontal, el texto con vw puede comportarse de manera inesperada:

.scroll-container {
  width: 200%;
  overflow-x: auto;
}

.scroll-container p {
  font-size: 3vw; /* Se basa en el viewport, no en el contenedor */
}

El texto seguirá basándose en el ancho del viewport, no en el ancho del contenedor con scroll, lo que puede crear inconsistencias visuales.

Soluciones a las limitaciones de vw

Para aprovechar las ventajas de vw mientras mitigamos sus limitaciones, podemos implementar varias estrategias:

Combinación con unidades fijas

Una solución simple es combinar vw con unidades fijas mediante calc():

h1 {
  font-size: calc(1.5rem + 2vw);
  /* Combina una base fija (1.5rem) con un componente fluido (2vw) */
}

Esta técnica proporciona un tamaño base razonable que luego se incrementa proporcionalmente con el ancho de la pantalla.

Uso de clamp() para establecer límites

Como vimos en la sección anterior, clamp() es ideal para establecer límites mientras aprovechamos el escalado fluido:

p {
  font-size: clamp(1rem, 2vw, 1.5rem);
  /* Mínimo: 1rem, Preferido: 2vw, Máximo: 1.5rem */
}

Esta aproximación mantiene las ventajas del escalado fluido mientras evita los problemas de tamaños extremos.

Media queries como complemento

Para casos específicos, podemos usar media queries como complemento:

h2 {
  font-size: 3vw;
}

@media (max-width: 600px) {
  h2 {
    font-size: 1.25rem; /* Tamaño fijo para pantallas pequeñas */
  }
}

Este enfoque híbrido nos permite tener control preciso en rangos problemáticos mientras mantenemos el escalado fluido en otros contextos.

Ejemplo práctico: Uso responsable de vw

Veamos un ejemplo de cómo usar vw de manera responsable para tipografía:

/* Encabezado principal con límites */
h1 {
  /* Base + componente fluido, con límites implícitos */
  font-size: calc(1.5rem + 3vw);
  max-font-size: 3.5rem; /* Evita que crezca demasiado */
}

/* Subtítulo con clamp para control total */
h2 {
  font-size: clamp(1.2rem, 1rem + 2vw, 2.5rem);
}

/* Texto principal con enfoque híbrido */
p {
  font-size: 1rem; /* Base accesible */
}

@media (min-width: 768px) {
  p {
    font-size: calc(1rem + 0.5vw); /* Ligero incremento fluido en pantallas más grandes */
  }
}

/* Texto destacado con vw controlado */
.featured-text {
  font-size: clamp(1.1rem, 1.5vw, 1.8rem);
}

Este enfoque equilibra la fluidez de vw con la seguridad de límites establecidos, creando una experiencia tipográfica que es tanto responsive como accesible.

Consideraciones de accesibilidad

Al usar unidades vw para texto, debemos prestar especial atención a la accesibilidad:

  • Tamaño mínimo legible: Asegúrate de que el texto nunca sea menor de 16px (o 1rem) para texto principal.
  • Respeto al zoom: Considera usar rem como unidad base y vw solo como componente adicional.
  • Contraste adecuado: El escalado del texto no debe comprometer el contraste con el fondo.
  • Pruebas en dispositivos reales: Verifica la legibilidad en diferentes dispositivos y orientaciones.
/* Enfoque accesible */
p {
  /* Garantiza un tamaño mínimo legible */
  font-size: max(1rem, 2vw);
  
  /* Alternativa con clamp */
  font-size: clamp(1rem, 2vw, 2rem);
}

Las unidades viewport, especialmente vw, ofrecen una forma poderosa de crear tipografía que escala fluidamente con el tamaño de la pantalla. Sin embargo, sus limitaciones en términos de tamaños extremos, accesibilidad y comportamiento en diferentes contextos requieren un enfoque cuidadoso. Combinando vw con otras técnicas como calc(), clamp() y media queries estratégicas, podemos crear sistemas tipográficos que sean tanto fluidos como robustos, ofreciendo una experiencia óptima en todo el espectro de dispositivos.

Ajuste de line-height y letter-spacing en diferentes viewports

Cuando trabajamos con tipografía responsive, no basta con ajustar únicamente el tamaño de la fuente. El interlineado (line-height) y el espaciado entre letras (letter-spacing) son propiedades fundamentales que deben adaptarse a diferentes tamaños de pantalla para mantener la legibilidad y el equilibrio visual del texto.

Comportamiento predeterminado del interlineado

El line-height determina el espacio vertical entre líneas de texto. Por defecto, esta propiedad acepta valores sin unidades, lo que crea una relación proporcional con el tamaño de fuente:

p {
  font-size: 1rem;
  line-height: 1.5; /* 1.5 veces el tamaño de la fuente */
}

Este enfoque proporcional es generalmente recomendado porque:

  • Se adapta automáticamente cuando cambia el tamaño de fuente
  • Mantiene una relación consistente entre texto e interlineado
  • Funciona bien en la mayoría de los contextos responsive

Problemas del interlineado fijo en diseños responsive

Usar valores fijos para el interlineado puede causar problemas en diseños responsive:

/* Enfoque problemático */
h1 {
  font-size: clamp(2rem, 5vw, 4rem);
  line-height: 48px; /* Valor fijo que no se adapta */
}

Este código presenta varios inconvenientes:

  • El interlineado no se ajusta cuando el tamaño de fuente cambia con el viewport
  • Puede resultar en líneas demasiado juntas en pantallas grandes
  • O demasiado separadas en dispositivos pequeños

Estrategias para ajustar el line-height responsive

1. Valores sin unidad para proporcionalidad

La estrategia más simple y efectiva es usar valores sin unidad:

h1 {
  font-size: clamp(2rem, 5vw, 4rem);
  line-height: 1.2; /* Siempre 1.2 veces el tamaño de fuente */
}

p {
  font-size: clamp(1rem, 2vw, 1.25rem);
  line-height: 1.5; /* Siempre 1.5 veces el tamaño de fuente */
}

Esta técnica garantiza que el interlineado siempre mantenga una relación proporcional con el tamaño de texto, independientemente del viewport.

2. Ajuste progresivo del line-height

Para un control más preciso, podemos ajustar el line-height en diferentes breakpoints:

h1 {
  font-size: clamp(2rem, 5vw, 4rem);
  line-height: 1.3; /* Valor base */
}

@media (min-width: 768px) {
  h1 {
    line-height: 1.2; /* Ligeramente más compacto en pantallas medianas */
  }
}

@media (min-width: 1200px) {
  h1 {
    line-height: 1.1; /* Más compacto en pantallas grandes */
  }
}

Este enfoque reconoce que la legibilidad óptima puede requerir diferentes proporciones de interlineado según el tamaño de pantalla.

3. Técnica de clamp() para line-height

También podemos aplicar clamp() al interlineado para un ajuste fluido:

h2 {
  font-size: clamp(1.5rem, 3vw, 2.5rem);
  line-height: clamp(1.2, calc(1.2 + 0.2 * ((100vw - 320px) / 880)), 1.4);
}

Esta técnica avanzada permite que el interlineado varíe fluidamente entre 1.2 en dispositivos pequeños (320px) y 1.4 en pantallas grandes (1200px), creando una transición suave que optimiza la legibilidad en cada contexto.

Letter-spacing responsive

El espaciado entre letras (letter-spacing) también debe ajustarse en diferentes viewports, especialmente para títulos y texto destacado.

Comportamiento del letter-spacing en diferentes tamaños

Un mismo valor de letter-spacing puede tener un impacto visual muy diferente según el tamaño de la fuente:

/* El mismo letter-spacing se percibe diferente */
h1 {
  font-size: 3rem;
  letter-spacing: 0.02em; /* Parece adecuado a este tamaño */
}

/* En móviles, con fuente más pequeña */
@media (max-width: 768px) {
  h1 {
    font-size: 2rem;
    letter-spacing: 0.02em; /* Ahora parece excesivo */
  }
}

Este ejemplo ilustra por qué el letter-spacing debe ajustarse proporcionalmente al cambiar el tamaño de fuente.

Estrategias para letter-spacing responsive

1. Unidades em para proporcionalidad

Usar em para el letter-spacing crea una relación proporcional con el tamaño de fuente actual:

h1 {
  font-size: clamp(2rem, 5vw, 4rem);
  letter-spacing: -0.01em; /* Negativo para títulos grandes */
}

.small-caps {
  font-variant: small-caps;
  letter-spacing: 0.05em; /* Positivo para versalitas */
}

Esta técnica asegura que el espaciado entre letras mantenga una proporción visual consistente independientemente del tamaño de texto.

2. Ajuste progresivo según viewport

Para un control más preciso, podemos ajustar el letter-spacing en diferentes breakpoints:

h1 {
  font-size: clamp(2rem, 5vw, 4rem);
  letter-spacing: -0.02em; /* Más compacto en móviles */
}

@media (min-width: 768px) {
  h1 {
    letter-spacing: -0.015em; /* Ligeramente menos compacto */
  }
}

@media (min-width: 1200px) {
  h1 {
    letter-spacing: -0.01em; /* Aún menos compacto en pantallas grandes */
  }
}

Este enfoque reconoce que el espaciado óptimo entre letras puede variar según el contexto de visualización.

3. Técnica de calc() para letter-spacing

Para un ajuste más fluido, podemos combinar calc() con unidades viewport:

h2 {
  font-size: clamp(1.5rem, 3vw, 2.5rem);
  letter-spacing: calc(-0.02em + 0.01vw);
}

Esta fórmula crea un letter-spacing que se ajusta sutilmente con el ancho del viewport, proporcionando una transición fluida entre diferentes tamaños de pantalla.

Combinando line-height y letter-spacing para máxima legibilidad

Para optimizar la legibilidad en todos los dispositivos, debemos considerar la relación entre font-size, line-height y letter-spacing:

/* Sistema tipográfico responsive completo */
:root {
  --base-size: 1rem;
  --scale-ratio: 1.2;
}

h1 {
  font-size: clamp(calc(var(--base-size) * var(--scale-ratio) * var(--scale-ratio) * var(--scale-ratio)), 5vw, 4rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
}

h2 {
  font-size: clamp(calc(var(--base-size) * var(--scale-ratio) * var(--scale-ratio)), 3vw, 2.5rem);
  line-height: 1.2;
  letter-spacing: -0.01em;
}

p {
  font-size: clamp(var(--base-size), 2vw, calc(var(--base-size) * var(--scale-ratio)));
  line-height: 1.5;
  letter-spacing: 0.01em;
}

@media (min-width: 768px) {
  p {
    line-height: 1.6;
    letter-spacing: 0.005em;
  }
}

Este sistema crea una jerarquía tipográfica coherente que se adapta a diferentes tamaños de pantalla, manteniendo relaciones proporcionales óptimas entre tamaño, interlineado y espaciado.

Ejemplo práctico: Ajuste completo para un componente de blog

Veamos un ejemplo práctico de cómo ajustar todas estas propiedades en un componente de blog:

.article-header {
  margin-bottom: clamp(1.5rem, 5vh, 3rem);
}

.article-title {
  font-size: clamp(1.75rem, 4vw, 3rem);
  line-height: 1.2;
  letter-spacing: -0.01em;
  margin-bottom: 0.5em;
}

.article-meta {
  font-size: clamp(0.875rem, 1.5vw, 1rem);
  line-height: 1.4;
  letter-spacing: 0.02em;
}

.article-content p {
  font-size: clamp(1rem, 1.8vw, 1.125rem);
  line-height: clamp(1.5, calc(1.5 + 0.1 * ((100vw - 320px) / 880)), 1.6);
  letter-spacing: 0.005em;
  margin-bottom: 1.5em;
}

.article-content h2 {
  font-size: clamp(1.25rem, 2.5vw, 1.75rem);
  line-height: 1.3;
  letter-spacing: -0.005em;
  margin: 1.5em 0 0.75em;
}

@media (min-width: 768px) {
  .article-title {
    line-height: 1.1;
  }
  
  .article-content p {
    letter-spacing: 0.002em;
  }
}

Este ejemplo muestra cómo cada elemento del artículo tiene sus propias características tipográficas optimizadas que se ajustan según el viewport, creando una experiencia de lectura coherente y agradable en cualquier dispositivo.

Consideraciones de rendimiento y accesibilidad

Al implementar ajustes de line-height y letter-spacing responsive, debemos considerar:

  • Rendimiento: Evitar fórmulas excesivamente complejas que puedan afectar el rendimiento de renderizado.
  • Accesibilidad: Mantener un interlineado suficiente para usuarios con dificultades de lectura (mínimo 1.5 para texto principal).
  • Consistencia: Asegurar que los ajustes mantengan la coherencia visual de la marca.
/* Enfoque equilibrado para accesibilidad */
p {
  font-size: clamp(1rem, 2vw, 1.25rem);
  line-height: clamp(1.5, calc(1.5 + 0.1 * ((100vw - 320px) / 880)), 1.7);
  letter-spacing: 0.01em;
}

Este enfoque prioriza la legibilidad y accesibilidad mientras aprovecha las ventajas del diseño responsive.

El ajuste adecuado de line-height y letter-spacing en diferentes viewports es esencial para crear una experiencia tipográfica verdaderamente responsive. Utilizando valores proporcionales, técnicas de ajuste progresivo y funciones modernas como clamp() y calc(), podemos asegurar que nuestro texto no solo cambie de tamaño, sino que también mantenga proporciones óptimas de interlineado y espaciado entre letras, maximizando la legibilidad y el atractivo visual en cualquier dispositivo.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

Plan mensual

19.00 € /mes

Precio normal mensual: 19 €
47 % DE DESCUENTO

Plan anual

10.00 € /mes

Ahorras 108 € al año
Precio normal anual: 120 €
Aprende CSS online

Ejercicios de esta lección Tipografía responsive

Evalúa tus conocimientos de esta lección Tipografía responsive con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de CSS

Accede a todas las lecciones de CSS y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Css

CSS

Introducción Y Entorno

Entorno Para Desarrollar Css

CSS

Introducción Y Entorno

Sintaxis

CSS

Sintaxis De Selectores Y Propiedades

Selectores Básicos

CSS

Sintaxis De Selectores Y Propiedades

Herencia Y Cascada

CSS

Sintaxis De Selectores Y Propiedades

Pseudo-clases Y Pseudo-elementos

CSS

Sintaxis De Selectores Y Propiedades

Colores En Css

CSS

Sintaxis De Selectores Y Propiedades

Unidades De Medida

CSS

Sintaxis De Selectores Y Propiedades

Especificidad

CSS

Sintaxis De Selectores Y Propiedades

Estilos De Fuente

CSS

Estilización De Texto Y Fondo

Propiedades De Texto

CSS

Estilización De Texto Y Fondo

Sombras En Texto Y Cajas

CSS

Estilización De Texto Y Fondo

Propiedades De Fondo

CSS

Estilización De Texto Y Fondo

Fuentes Web

CSS

Estilización De Texto Y Fondo

Efectos De Texto: Gradientes, Recortes

CSS

Estilización De Texto Y Fondo

Tipografía Avanzada

CSS

Estilización De Texto Y Fondo

Modelo De Caja

CSS

Modelo Caja

Propiedades De Posicionamiento

CSS

Modelo Caja

Propiedad 'Display'

CSS

Modelo Caja

Elementos 'Float' Y 'Clear'

CSS

Modelo Caja

Rellenos Y Márgenes

CSS

Modelo Caja

Bordes Y Contornos

CSS

Modelo Caja

Absolute, Fixed, Sticky Y Z-index

CSS

Posicionamiento

Flexbox Para Crear Layouts Y Estructuras

CSS

Flexbox

Css Grid Para Crear Layouts Y Estructuras

CSS

Flexbox

Propiedades Del Contenedor Flex

CSS

Flexbox

Propiedades De Los Items Flex

CSS

Flexbox

Columnas Y Filas En Grid

CSS

Css Grid

Espaciado Y Alineación

CSS

Css Grid

Tipografía Responsive

CSS

Diseño Responsive

Fundamentos Del Diseño Responsive

CSS

Diseño Responsive

Imágenes Responsive

CSS

Diseño Responsive

Funciones Matemáticas

CSS

Variables Y Funciones Css

Transformaciones 2d

CSS

Transformación, Transición, Animación

Transformaciones 3d

CSS

Transformación, Transición, Animación

Animaciones

CSS

Transformación, Transición, Animación

Transiciones

CSS

Transformación, Transición, Animación

Css Para Formularios

CSS

Css Avanzado

Accesibilidad Web Con Css

CSS

Css Avanzado

Container Queries

CSS

Css Avanzado

Selectores Avanzados

CSS

Css Avanzado

Animaciones Y Transiciones

CSS

Técnicas Modernas Y Metodologías

Variables En Css

CSS

Técnicas Modernas Y Metodologías

Diseño Responsive Con Media Queries

CSS

Técnicas Modernas Y Metodologías

Metodologías De Escritura En Css

CSS

Técnicas Modernas Y Metodologías

Accede GRATIS a CSS y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender las diferencias y ventajas de las unidades relativas rem y em para el escalado tipográfico.
  • Aprender a implementar tipografía fluida usando la función clamp() para un escalado suave y controlado.
  • Conocer las ventajas y limitaciones de las unidades viewport (vw) en tipografía responsive.
  • Aplicar técnicas para ajustar line-height y letter-spacing de forma responsive para mejorar la legibilidad.
  • Integrar estrategias que respeten la accesibilidad y preferencias del usuario en sistemas tipográficos adaptativos.