SolisReach
← Journal
Web Performance6 min read

The web font loading mistake that's quietly costing you a full second of LCP

Written by the SolisReach team

We've audited dozens of sites where the single largest chunk of Largest Contentful Paint time isn't the hero image at all, it's the custom web font blocking the hero headline from rendering anything on screen until the font file itself finishes downloading. It's an easy problem to miss during a casual review because it doesn't look broken in the traditional sense. It just looks, and measures, slow.

By default, browsers hide text entirely until the font loads

Without any explicit font-display setting in your CSS, most browsers will show absolutely nothing where your headline should be, for up to several seconds on a slower connection, until the custom font file arrives and is parsed. That blank space is directly and fully counted against your Largest Contentful Paint score in every real measurement tool, and visitors on a patchy or slower connection genuinely see an empty hero section for longer than they should ever have to.

This is invisible to a developer testing on a fast office connection with the font already cached from a previous visit, which is exactly why it survives so many rounds of internal review before a real performance audit finally catches it.

font-display: swap is the simplest fix, and it's not entirely free

Setting font-display: swap tells the browser to show a fallback system font immediately, then visually swap in the custom font once it actually finishes loading. This fixes the perceived blank-page problem directly, but it introduces its own visible flash of unstyled text as the layout shifts between the fallback font and the real one, which can hurt your Cumulative Layout Shift score if the two fonts have meaningfully different letter widths and line heights.

We treat this as a real tradeoff to manage deliberately, not a free win to apply blindly everywhere. The right fallback font choice matters as much as the swap setting itself.

Preload the specific fonts you actually use above the fold

A font preload tag tells the browser to fetch a specific font file early and in parallel with other critical resources, instead of discovering it late, after the CSS has already been fully parsed and the browser realizes it needs the font. We only ever preload the one or two specific font weights that are genuinely visible without scrolling on a typical viewport.

Preloading every weight and style used anywhere on the site, out of an abundance of caution, just adds competing network requests during the exact window you're actually trying to speed up, which defeats the purpose of preloading in the first place. Specificity here matters more than thoroughness.

Matching fallback font metrics reduces the visible jump

Tools that generate a metric-matched fallback font, sized and spaced to closely approximate your actual custom font's dimensions, meaningfully reduce the visible reflow that happens when the swap occurs, which keeps the font-display: swap approach from quietly costing you a layout shift penalty in exchange for fixing the blank-text problem.

It's a small, slightly fiddly technical step that most teams skip entirely simply because they don't know it exists. Once you know to look for it, it's usually a fifteen-minute fix using a widely available generator tool, and it closes the gap between "technically fixed" and "actually feels fast."

Variable fonts introduce their own separate tradeoff to weigh

A single variable font file covering a full weight range is often smaller in total than loading three or four separate static weights, which sounds like a clean performance win. In practice the variable file itself is still larger than any single static weight, so if a page only actually uses two weights, two static files can genuinely load faster than one variable one.

We test both approaches per project rather than defaulting to variable fonts as an automatic best practice, because the right answer depends entirely on how many distinct weights a specific design actually uses.

A single variable font file covering a full weight range is often smaller in total than loading three or four separate static weights, which sounds like a clean performance win.

We benchmark both approaches with real Lighthouse and field data before finalizing a decision on any given project, rather than applying a blanket rule across every client, because the right answer has genuinely flipped between projects depending on how many weights a specific typographic system actually needs.

A quick way to check whether your own site has this exact problem

Opening a site's network panel in browser developer tools and filtering for font file requests shows immediately whether a font is blocking render: if the hero text visibly appears only after the font file finishes downloading in that panel, this is very likely costing measurable LCP time on that page right now.

It's a five-minute check anyone can run themselves without needing a full performance audit, and we recommend it as a first step before assuming a slow LCP score requires some more complex diagnosis.

Self-hosting fonts versus a third-party font CDN

Pulling a font from a popular third-party font service adds a separate DNS lookup and connection setup before the font file itself can even begin downloading, a delay that self-hosting the same font file directly from your own domain removes entirely, since the browser is already connected to that domain for the page itself. We've measured this difference at a genuinely meaningful few hundred milliseconds on some client sites, purely from removing that extra connection step.

We self-host fonts by default on any project where performance is a real priority now, and reserve the third-party CDN approach for cases where a client specifically needs the broader library of easily swappable fonts that a hosted service provides and performance isn't the primary constraint on that particular project.

How this shows up differently on a real client site versus a lab test

Lighthouse and other lab-based testing tools run on a clean, fast, uncached connection, which means a font-loading problem that costs real users a full second on a typical mobile connection can look far less severe, sometimes barely visible at all, in a lab report run from a fast office network. We've had clients push back on prioritizing a font fix specifically because their own lab score looked fine.

We now pull real field data from Chrome User Experience Report or the client's own real-user monitoring whenever it's available, specifically to show the gap between the clean lab number and what actual visitors on real, slower connections are genuinely experiencing, because that gap is usually where the real business case for fixing font loading actually lives.

Start a project

Want this applied to your site?

We run a Core Web Vitals and SEO audit before quoting any performance marketing engagement, and we're happy to share what we'd find on yours.