Elimina el CLS en Fuentes Web: Guía Definitiva para Mejorar tus Core Web Vitals
Iván Torres
Software Developer
Iván Torres
Software Developer
Aprende a gestionar el comportamiento del desplazamiento nativo y soluciona el error del contenido oculto tras un header fijo con CSS moderno.
Explora cómo las nuevas APIs de CSS eliminan la necesidad de Sass, librerías JS y complicaciones, simplificando tu flujo de trabajo.
¿Te ha pasado que entras a una web, vas a hacer clic en un botón y, de repente, el texto "salta", el botón se mueve y acabas clickando en un anuncio o en "Cancelar"?
Eso es el CLS (Cumulative Layout Shift).
No es solo molesto: Google te penaliza por ello. El CLS es uno de los tres pilares de los Core Web Vitals. Un puntaje alto no solo frustra a tus usuarios, sino que hunde tu posicionamiento SEO.
El culpable suele ser la fuente. El navegador carga primero una fuente del sistema (Arial, Times...) y luego la sustituye por tu fuente personalizada. Como tienen tamaños distintos, todo el layout explota.
Hoy vamos a arreglar esto para siempre.
Para evitar el salto, no necesitamos magia, necesitamos Matemáticas CSS.
El secreto es el Font Matching: Modificar las dimensiones de la "fuente fea" (Arial) para que ocupe exactamente el mismo espacio físico que la "fuente bonita" (Inter).
Para ello, usamos tres propiedades CSS modernas que "hackean" la fuente del sistema:
ascent-override: Ajusta la altura de la línea por encima del texto (el "techo").descent-override: Ajusta la profundidad por debajo de la línea base (el "suelo").size-adjust: Escala el tamaño general de la letra para que coincida en ancho.ℹ️ Nota de Compatibilidad: Estas propiedades son parte del estándar "Baseline". En 2026, son soportadas por el 100% de los navegadores modernos. Úsalas sin miedo.
Si no usas frameworks, hacerlo a mano es doloroso. Por eso, he creado esta herramienta gratuita que calcula estos valores matemáticos por ti.
🔗 Mi Herramienta: zero-cls-font-fallback.vercel.app
.woff2 por su compresión superior)./* 1. Tu fuente personalizada (carga lenta) */
@font-face {
font-family: 'MiFuenteTop';
src: url('/fonts/mi-fuente.woff2') format('woff2');
font-display: swap;
}
/* 2. El Fallback Mágico (carga instantánea) */
@font-face {
font-family: 'MiFuenteTop-Fallback';
/* Usamos una fuente local segura */
src: local('Arial');
/* 🪄 AQUÍ ESTÁ LA MAGIA (Valores generados por mi tool) */
ascent-override: 98.4%;
descent-override: 23.1%;
line-gap-override: 0%;
size-adjust: 102.5%;
}
/* 3. Uso en el body */
body {
/* Primero la custom, luego el fallback ajustado */
font-family: 'MiFuenteTop', 'MiFuenteTop-Fallback', sans-serif;
}En 2026, automatizamos cosas. Deja que las herramientas calculen esto en el build time.
El componente next/font ya hace esto nativamente. Inyecta los valores de override automáticamente sin configuración extra.
# No necesitas instalar nada extra, viene con Next.jsimport { Inter } from 'next/font/google'
// Next.js genera el fallback métrico automáticamente
const inter = Inter({
subsets: ['latin'],
display: 'swap',
adjustFontFallback: true // ✅ Activado por defecto
})
export default function RootLayout({ children }) {
return (
<html lang="es" className={inter.className}>
<body>{children}</body>
</html>
)
}Para el resto del ecosistema, existe unplugin-fontaine.
Este plugin lee tus archivos CSS al compilar, detecta las fuentes y genera los fallbacks métricos automáticamente. Es "instalar y olvidar".
npm install -D unplugin-fontaine// vite.config.js
import { FontaineTransform } from 'unplugin-fontaine/vite'
export default {
plugins: [
FontaineTransform({
// Mapea tus fuentes a un fallback seguro del sistema
fallbacks: ['BlinkMacSystemFont', 'Segoe UI', 'Helvetica Neue', 'Arial'],
resolvePath: (id) => new URL(`.${id}`, import.meta.url),
})
]
}¿Quieres priorizar una fuente crítica (ej. el título principal) a toda costa?
El preload obliga al navegador a descargar la fuente antes de que empiece a leer el CSS. Pero cuidado: solo la descarga. Aún necesitas definirla para usarla.
⚠️ Advertencia: Úsalo con cuidado. Si abusas, bloquearás la carga del resto de la web.
<head>
<link
rel="preload"
href="/fonts/mi-fuente.woff2"
as="font"
type="font/woff2"
crossorigin
/>
<style>
@font-face {
font-family: 'MiFuenteTop';
src: url('/fonts/mi-fuente.woff2') format('woff2');
font-display: swap;
}
h1 {
font-family: 'MiFuenteTop', sans-serif;
}
</style>
</head>light, regular, bold, black...). Usa una sola Variable Font que contenga todos los pesos en un solo archivo optimizado.<link href="fonts.googleapis..."> añade latencia DNS. Siempre aloja las fuentes tú mismo (Self-hosting) o usa next/font.Implementar Font Matching es la diferencia entre una web que se siente "rota" al cargar y una que se siente sólida como una roca.
¿Tu siguiente paso?
¡Tu SEO y tus usuarios te lo agradecerán! 🚀