README · by ansango
← Volver al libro

Fonts

Tipografía en CSS. Font families, sizes, weights, kerning, font synthesis, variable fonts y OpenType features. La base de la legibilidad

~1 min de lectura
Resumen

Esta nota cubre el capítulo 14 del libro: las fuentes en CSS. Font families, sizes, weights, kerning, font synthesis, variable fonts y OpenType features. La tipografía es el 80% de la legibilidad de un sitio web.

Font family

body {
    font-family: "Helvetica Neue", Arial, sans-serif;
}

code {
    font-family: "JetBrains Mono", Consolas, monospace;
}
Font family:

  - Lista de fuentes separadas por coma.
  - El navegador usa la primera disponible.
  - Última opción: una familia genérica.
  - Nombres con espacios: comillas.
  - Nombres sin espacios: sin comillas.

Familias genéricas

body {
    font-family: serif;          /* con "patas" */
}

code {
    font-family: monospace;      /* ancho fijo */
}

h1 {
    font-family: sans-serif;     /* sin "patas" */
}

.cursive {
    font-family: cursive;        /* manuscrita */
}

.fantasy {
    font-family: fantasy;        /* decorativa */
}

.ui {
    font-family: system-ui;      /* la del sistema */
}
Familias genéricas:

  - serif: con remates (Times, Georgia).
  - sans-serif: sin remates (Helvetica, Arial).
  - monospace: ancho fijo (Courier, Consolas).
  - cursive: manuscrita (Comic Sans).
  - fantasy: decorativa (Impact).
  - system-ui: la del sistema.
system-ui es moderno

El libro recoge: system-ui usa la fuente del sistema operativo. Da una experiencia más rápida y familiar.

@font-face

@font-face {
    font-family: "MiFuente";
    src: url("fonts/mifuente-regular.woff2") format("woff2"),
         url("fonts/mifuente-regular.woff") format("woff");
    font-weight: 400;
    font-style: normal;
    font-display: swap;
}
@font-face:

  - Define una fuente personalizada.
  - src: URL con format() opcional.
  - font-weight, font-style: para esa variante.
  - font-display: cómo se muestra mientras carga.

Formatos de fuente

Formatos:

  - WOFF2: el mejor, comprimido, soportado por todos los navegadores actuales.
  - WOFF: comprimido, aún soportado.
  - TTF: TrueType, sin compresión.
  - EOT: solo IE.
  - SVG: antiguo, no usar.
WOFF2 es el estándar

El libro recomienda: usa WOFF2 con fallback a WOFF para navegadores antiguos. WOFF2 es ~30% más pequeño que WOFF.

Font size

body {
    font-size: 16px;        /* absoluto */
    font-size: 1rem;        /* relativo al root */
    font-size: 100%;        /* relativo al default del navegador */
}

h1 {
    font-size: 2em;         /* relativo al padre */
}
Font size:

  - px: absoluto.
  - rem: relativo al root.
  - em: relativo al padre.
  - %: como em.
  - Default: 16px (configurable por el usuario).

rem vs em

html {
    font-size: 16px;
}

.parent {
    font-size: 1.5em;  /* 24px */
}

.child {
    font-size: 1.5em;  /* 36px (1.5 * 24px) */
}

.other-child {
    font-size: 1.5rem;  /* 24px (1.5 * 16px) */
}
rem vs em:

  - em: relativo al padre. Compone.
  - rem: relativo al root. No compone.
  - rem es más predecible.
  - em es más "natural" en herencia.

Tamaño relativo al viewport

.hero {
    font-size: 10vw;        /* 10% del viewport width */
}

.responsive-text {
    font-size: clamp(1rem, 2vw + 0.5rem, 2rem);
}
Viewport units:

  - vw: 1% del viewport width.
  - vh: 1% del viewport height.
  - vmin: el menor de vw y vh.
  - vmax: el mayor de vw y vh.
  - clamp: tamaño entre un rango.

Font weight

.text {
    font-weight: normal;       /* 400 */
    font-weight: bold;        /* 700 */
    font-weight: 100;          /* thin */
    font-weight: 900;          /* black */
    font-weight: lighter;       /* más ligero que el padre */
    font-weight: bolder;       /* más pesado que el padre */
}
Font weight:

  - keywords: normal, bold, lighter, bolder.
  - numéricos: 100-900, en pasos de 100.
  - bold = 700, normal = 400.
  - La fuente debe tener esa variante.
  - Si no la tiene, el navegador interpola.
Usa variables

El libro recomienda: define variables para los weights que uses. --font-weight-normal: 400; --font-weight-bold: 700;.

Font style

.text {
    font-style: normal;
    font-style: italic;
    font-style: oblique;
    font-style: oblique 10deg;   /* ángulo fijo */
}
Font style:

  - normal: el default.
  - italic: cursiva diseñada.
  - oblique: la misma fuente inclinada.
  - oblique Ndeg: ángulo personalizado.
  - No todas las fuentes tienen cursiva.

Font stretch

.text {
    font-stretch: normal;
    font-stretch: condensed;
    font-stretch: expanded;
    font-stretch: 50%;          /* del 50% al 200% */
}
Font stretch:

  - normal: el ancho normal.
  - condensed: más estrecho.
  - expanded: más ancho.
  - Porcentajes: 50% (más estrecho) a 200% (más ancho).
  - Solo útil con fonts que tienen variantes.

Font size adjustment

@font-face {
    font-family: "Fallback";
    src: local("Fallback");
    size-adjust: 105%;
    ascent-override: 90%;
    descent-override: 20%;
}
size-adjust:

  - Ajusta el tamaño cuando se usa como fallback.
  - Útil para que el cambio de fuente no mueva el layout.
  - ascent-override: altura desde la línea base.
  - descent-override: profundidad desde la línea base.

Font kerning

.text {
    font-kerning: auto;       /* default */
    font-kerning: normal;
    font-kerning: none;
}
Font kerning:

  - Ajusta el espacio entre pares de letras específicos.
  - "AV" se ajusta para que no se vea mal.
  - auto: el navegador decide.
  - normal: kerning estándar.
  - none: sin kerning.

Font feature settings

.text {
    font-feature-settings: "kern" 1;
    font-feature-settings: "liga" 1;
    font-feature-settings: "liga" 1, "dlig" 1;
    font-feature-settings: "tnum" 1;
}
OpenType features:

  - liga: ligaduras estándar (fi → fi).
  - dlig: ligaduras decorativas.
  - smcp: small caps.
  - tnum: tabular nums (123.456, ancho fijo).
  - lnum: lining nums (123, ancho variable).
  - onum: old-style nums (123, variables).
  - kern: kerning.
OpenType features son poderosas

El libro destaca: muchas fuentes tienen docenas de features. Activarlas correctamente mejora la tipografía mucho.

Font variant

.text {
    font-variant: small-caps;
    font-variant-caps: all-small-caps;
    font-variant-caps: all-petite-caps;
    font-variant-numeric: tabular-nums;
    font-variant-numeric: slashed-zero;
    font-variant-ligatures: common-ligatures;
    font-variant-ligatures: no-common-ligatures;
    font-variant-east-asian: ruby;
}
Font variant:

  - shorthand para un grupo de features.
  - font-variant-caps: small-caps, all-small-caps, etc.
  - font-variant-numeric: tabular-nums, oldstyle-nums, etc.
  - font-variant-ligatures: ligaduras.
  - font-variant-east-asian: asian typography.

Variable fonts

@font-face {
    font-family: "MiVariableFont";
    src: url("font.woff2") format("woff2-variations");
}

.text {
    font-family: "MiVariableFont";
    font-weight: 350;        /* cualquier peso, no solo 100, 200, ..., 900 */
    font-stretch: 80%;      /* cualquier stretch */
    font-style: oblique 5deg; /* cualquier ángulo */
}
Variable fonts:

  - Una sola fuente, múltiples variaciones.
  - font-weight de 1 a 1000 (no solo 100, 200, ..., 900).
  - font-stretch de 50% a 200%.
  - font-style de 0deg a 90deg.
  - font-variation-settings: acceso low-level.

font-variation-settings

.text {
    font-variation-settings: "wght" 400, "slnt" -5, "ital" 1;
}
font-variation-settings:

  - Acceso low-level a los axes de variación.
  - "wght": weight.
  - "slnt": slant.
  - "ital": italic.
  - "opsz": optical size.
  - Varía según la fuente.
Variable fonts son el futuro

El libro recomienda: usa variable fonts para reducir el número de archivos y tener más control. Soporte amplio en navegadores modernos.

Font shorthand

.text {
    font: italic small-caps bold 1.2em/1.5 "Helvetica Neue", sans-serif;
}
Font shorthand:

  - font-style | font-variant | font-weight | font-size/line-height | font-family.

  - El orden importa.
  - font-size y font-family son obligatorios.
  - Otros valores opcionales.
  - Otros (kerning, features) se ponen por separado.

@font-face avanzado

/* Una declaración para múltiples variantes */
@font-face {
    font-family: "MiFuente";
    src: url("font.woff2") format("woff2-variations");
    font-weight: 100 900;
    font-style: normal;
    font-display: swap;
}

/* Lazy loading */
@font-face {
    font-family: "MiFuente";
    src: url("font.woff2");
    font-display: optional;  /* si no carga, usa fallback */
}

font-display

@font-face {
    font-family: "MiFuente";
    src: url("font.woff2");
    font-display: auto;        /* default */
    font-display: block;       /* bloque hasta que cargue */
    font-display: swap;        /* usa fallback mientras carga */
    font-display: fallback;    /* muestra fallback breve */
    font-display: optional;    /* usa fallback si no está lista */
}
font-display:

  - auto: el navegador decide.
  - block: invisible hasta que cargue.
  - swap: usa fallback, salta a la real.
  - fallback: usa fallback breve.
  - optional: opcional, sin cambio brusco.
font-display: swap para contenido

El libro recomienda: usa swap para contenido (no es tan malo mostrar fallback breve), optional para logos y elementos críticos.

Loading strategy

<!-- Preload crítico -->
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
/* Carga asíncrona */
@font-face {
    font-family: "MiFuente";
    src: url("font.woff2");
    font-display: swap;
}
Estrategias:

  - preload: cargada antes de que se use.
  - preload + font-display: swap: rápida + sin FOIT.
  - font-display: optional: si no carga, fallback.

Font loading API

/* Para casos complejos: usar JavaScript */
@font-face {
    font-family: "MiFuente";
    src: url("font.woff2");
}

@font-face {
    font-family: "MiFuente Fallback";
    src: local("Arial");
    size-adjust: 105%;
    ascent-override: 90%;
    descent-override: 20%;
}
// JavaScript: detectar carga de fuente
document.fonts.ready.then(() => {
    document.body.classList.add('fonts-loaded');
});

Resumen de propiedades

Propiedad             Uso
─────────────────────────────────────────────────────
font-family           Lista de fuentes.
font-size             Tamaño.
font-weight           Grosor.
font-style            Estilo.
font-variant          small-caps, ligatures, etc.
font-stretch          Ancho.
font-kerning          Ajuste entre letras.
font-feature-settings OpenType features.
font-variation-settings Para variable fonts.
font-display          Comportamiento de carga.

Errores comunes

/* Mal: font-size sin unidad */
.text {
    font-size: 16;  /* no funciona */
}

/* Mal: font-size en porcentaje sobre algo que no es size */
.text {
    font-size: 50%;  /* del font-size del padre */
}

/* Mal: font-family sin fallback */
.text {
    font-family: "FuenteRaraQueNoExiste";  /* texto invisible */
}

/* Mal: @font-face sin font-display */
@font-face {
    font-family: "MiFuente";
    src: url("font.woff2");
    /* FOIT: invisible hasta que cargue */
}

Resumen en tres frases

Próximos pasos