Product Craft Bible
Variable Fonts
Inicio Avanzado Variable Fonts
Avanzado

Variable Fonts

6 reglas google fonts . mdn . web typographygoogle fonts · mdn · web typographygoogle fonts · web typography · mdn
115

Variable Fonts

6 reglas
1034

Un archivo reemplaza cuatro (cuando 3+ pesos)

Una fuente variable (.woff2) contiene todos los pesos en un solo archivo, elimina las 4+ peticiones HTTP de fuentes estaticas (Regular, Medium, SemiBold, Bold). El ahorro en peso total varia: Inter Variable son ~320KB vs ~580KB para las 4 variantes estaticas. El umbral de conveniencia es 3 o más pesos usados: con 2 pesos, la fuente estática puede ser más ligera.

google fonts . mdn . web typography
Preferir
Inter-Variable.woff2 112 KB

Total 112 KB . 1 request
Pesos disponibles: 100-900 . ~40% ahorro vs estaticas
Evitar
Inter-Regular.woff2 45 KB
Inter-Medium.woff2 46 KB
Inter-SemiBold.woff2 46 KB
Inter-Bold.woff2 47 KB

Total 184 KB . 4 requests
1035

Declaración CSS correcta y fallback

La declaración @font-face de una fuente variable requiere font-weight: 100 900 (rango) y opcionalmente font-style: oblique 0deg 10deg para el eje de inclinación. Siempre incluir un fallback de fuente del sistema en font-family que sea metricamente similar para minimizar el layout shift durante la carga. Usar font-display: swap para mostrar el fallback inmediatamente.

google fonts · mdn · web typography
Preferir
@font-face {
  font-family: 'Inter';
  src: url('Inter.woff2') format('woff2');
  font-weight: 100 900;
  font-display: swap;
}

/* Fallback para browsers sin soporte */
@supports font-variation-settings: normal {
  body {
    font-family: 'Inter', system-ui, sans-serif;
  }
}
Rango 100-900 desbloquea todos los pesos del archivo, font-display swap muestra el fallback durante la carga sin bloquear, @supports ofrece fallback para browsers sin soporte de variable fonts
Evitar
@font-face {
  font-family: 'Inter';
  src: url('Inter.woff2');
  font-weight: 400; /* solo un peso */
}

/* CSS ignora los pesos 500-900 */
/* El browser simula bold, feo */
font-weight fijo ignora el eje wght. El browser sintetiza negrita en lugar de usar los pesos reales del archivo
1036

Animación de peso en hover/focus

Con fuentes variables se puede animar font-variation-settings: 'wght' 400 a 'wght' 700 con transition. El efecto es más sutil que un cambio de color y más expresivo que ningun cambio. Ideal para botones, navegación y labels de formulario. Precaución: la animación de peso puede causar layout shift si el elemento no tiene ancho fijo. Usar anchos basados en ch para absorber la expansión del texto sin saltos.

google fonts · mdn · web typography
Preferir
Peso animado de 400 a 600 con transition y ancho fijo en ch. Sin layout shift. Animación gateada por prefers-reduced-motion.
Evitar
Swap de font-weight 400 a 700 en hover sin ancho fijo. Los links adyacentes se mueven con cada hover.
1037

Eje wdth para tipografía responsiva

El eje wdth (width, condensado/expandido) permite reducir el ancho del texto en móvil sin cambiar el tamaño de fuente. En pantallas pequeñas usar font-variation-settings: 'wdth' 85 (condensado) para que más texto entre sin sacrificar legibilidad. En pantallas grandes usar 'wdth' 100 (normal) para titulares de impacto. Combinar con clamp() o media queries para transiciones fluidas entre breakpoints.

google fonts · web typography · mdn
Preferir
Móvil, wdth: 85 (condensado)
Arquitectura de interfaces responsivas
El texto cabe sin truncar gracias al eje wdth
Desktop, wdth: 100 (normal)
Arquitectura de interfaces responsivas
Ancho completo aprovecha el espacio disponible
Evitar
En móvil (320 px)
Arquitectura de interfaces responsivas
El título se trunca porque solo reducir font-size no basta
En desktop (1280 px)
Arquitectura de interfaces responsivas
Misma anchura tipografica en ambos breakpoints
1038

Optical sizing automático

El eje opsz (optical size) ajusta los detalles tipograficos según el tamaño en pantalla. A 12px, las serifas se vuelven más gruesas y el espaciado interno más amplio para mantener legibilidad. A 72px, los trazos son más delicados y elegantes. Activar con font-optical-sizing: auto (CSS moderno) o manualmente con font-variation-settings: 'opsz' 14 donde 14 es el tamaño en pt.

google fonts · web typography · mdn
Preferir
opsz auto font-optical-sizing: auto
12px The quick brown fox jumps over the lazy dog
48px Elegant
El browser ajusta opsz al font-size. A 12px, trazos más gruesos y counters abiertos. A 48px, trazos finos y elegantes.
Evitar
opsz off font-optical-sizing: none
12px The quick brown fox jumps over the lazy dog
48px Elegant
Misma renderización optica en ambos tamaños. Los trazos finos de 48px aparecen en 12px, perdiendo legibilidad.
1039

Grade axis para dark mode sin layout shift

El eje GRAD (grade) ajusta el peso visual de la fuente sin cambiar el ancho del texto, a diferencia de wght. En dark mode, el texto blanco sobre fondo oscuro parece más grueso por un efecto optico llamado halation. Compensar con font-weight mueve el layout porque cambia las metricas del glifo. En cambio, font-variation-settings: 'GRAD' 50 incrementa el peso visual sin alterar el advance width: cero layout shift, misma apariencia optica que en light mode.

google fonts . mdn . web typography
Preferir
Light . GRAD 0
Diseño de producto
Dark . GRAD 50
Diseño de producto
@media (prefers-color-scheme: dark) {
  body {
    font-variation-settings: 'GRAD' 50;
  }
}
Evitar
Light mode
Diseño de producto digital
Dark mode
Diseño de producto digital
parece más grueso (halation)