SolisReach
← Journal
Web Performance5 min read

Web fonts: the render-blocking mistake almost every site makes

Written by the SolisReach team

Custom web fonts are one of the most common, and most fixable, causes of a slow first paint we see on client audits. The mistake is almost always the same one, repeated across sites built by different teams using different tools, which suggests it's less about carelessness and more about a default behavior that quietly works against performance unless someone corrects it.

What makes this particular issue frustrating is how invisible it is to the team that built the site. On a fast office connection, with the font file already cached from repeated testing during development, the delay this causes is barely noticeable. It only becomes obvious on a first-time visit over a slower connection, which is exactly the scenario a developer's own testing routine rarely reproduces.

The default failure mode

By default, most browsers won't render any text using a custom font until that font file has fully downloaded, which can take anywhere from a few hundred milliseconds to over a second depending on file size and connection speed. During that window, the browser either shows nothing (invisible text) or falls back briefly to a system font before swapping, both of which delay or disrupt the page's perceived load speed.

This behavior, often called the "flash of invisible text," is the browser's default because it assumes a designer would rather have blank space than briefly wrong-looking text in the wrong font. That's a reasonable default in the abstract and a poor one for actual performance, which is exactly why it needs to be deliberately overridden rather than left as-is.

The fix: font-display, and it's a one-line change

Setting `font-display: swap` in the font's CSS tells the browser to render text immediately in a fallback system font, then swap to the custom font once it's loaded, rather than making the visitor wait for the custom font before showing any text at all. This single line, missing on a surprising share of the sites we audit, is often the fastest single fix available on an entire performance audit.

There's a visible tradeoff worth naming: text briefly appears in a fallback font before swapping, which can cause a small, noticeable layout shift if the fallback and custom fonts have meaningfully different character widths. Choosing a fallback font with similar metrics to the custom one minimizes this, and it's worth the small extra effort rather than accepting either the shift or the original invisible-text delay.

Preloading the fonts actually used above the fold

Adding a `<link rel="preload">` for the specific font files used in above-the-fold content tells the browser to fetch them earlier in the loading sequence, before it would otherwise discover the need for them through normal CSS parsing. This shrinks the window during which visitors see the fallback font, without requiring `font-display: swap` to be removed.

We only preload the one or two fonts actually visible without scrolling, not the full font family used across the whole site, since preloading fonts that aren't immediately needed competes for the same limited early bandwidth that should be going toward the content a visitor sees first.

Fewer font weights, loaded deliberately

Sites frequently load six or eight font weights when the actual design uses three. Each unused weight is pure waste: a full file download that never gets used for its intended purpose, sometimes still triggering a layout shift as it loads. Auditing actual font usage against what's being requested is a quick, high-value check.

This waste usually traces back to a default font import copied from a template or a design tool's export, which pulls in every available weight rather than only the ones the actual design specifies. A five-minute audit of the design file against the font import list catches this reliably.

Sites frequently load six or eight font weights when the actual design uses three.

What this actually moves on a real audit

On a recent client site, adding `font-display: swap` and preloading the two fonts actually used above the fold cut Largest Contentful Paint by roughly 400 milliseconds, a meaningful chunk of the gap between their previous "needs improvement" and current "good" Core Web Vitals rating, for less than an hour of implementation work.

Font optimization is consistently one of the highest ratio-of-impact-to-effort items on any performance audit we run, precisely because it's usually a handful of small, low-risk changes to font loading configuration rather than a structural rebuild of anything else on the page.

Variable fonts as a longer-term fix worth considering

A variable font file can contain an entire range of weights and styles in a single file, often smaller in total size than loading three or four separate static weight files the traditional way, since the variable format shares underlying data across weights instead of duplicating it in each separate file. For a design system using several weights of the same typeface, switching to a variable font can meaningfully cut total font payload.

We don't recommend this as a first fix, since it usually means a real font-loading refactor rather than a quick configuration change, but for a client already planning a broader front-end update, it's worth evaluating alongside everything else on the list, particularly for a brand using four or more weights of the same family across its site.

Browser support for variable fonts is now broad enough that this is a genuinely low-risk change for most audiences, and the main remaining consideration is simply whether the specific typeface a brand uses is available in a variable format at all, since not every foundry has released one for every typeface yet.

We check this availability question early in any brand or design system project now, since it's much cheaper to factor variable font support into an initial typeface choice than to discover later that a brand has committed to a typeface with no variable option, once dozens of design files already reference the static weights directly.

This is a genuinely small decision at the point it's made and a meaningfully larger one to unwind later, which is exactly the pattern worth flagging early in any project rather than letting it surface as a surprise once the brand's visual identity is already locked in across dozens of assets.

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.