SolisReach
← Journal
Web Performance5 min read

Font loading strategies, ranked by actual impact

Written by the SolisReach team

Custom web fonts are a common, quietly significant contributor to slow rendering, particularly render-blocking behavior where text is invisible until the font finishes downloading. A handful of specific fixes address most of the impact, and it's worth knowing which ones actually move the needle versus which ones are minor refinements.

The single biggest lever: font-display

Setting font-display to swap (or a similar non-blocking value) in your font-face declaration tells the browser to render text immediately in a fallback font and swap to the custom font once it loads, rather than leaving text invisible during the wait. This one CSS property alone eliminates the most severe version of the render-blocking problem and is almost always the first thing worth checking.

Preloading the fonts actually used above the fold

Adding a preload link for the specific font files used in above-the-fold content tells the browser to start fetching them earlier in the loading sequence, rather than waiting to discover the need for them from the CSS. This is a smaller but real improvement, and it's worth applying only to fonts genuinely needed immediately, not the entire font family, since over-preloading competes for bandwidth with other critical resources.

Subsetting fonts to the characters you actually need

A full font file supporting every language and character set is often significantly larger than one subsetted to just the characters your site actually uses (Latin characters plus your specific punctuation needs, for instance). For sites in a single language, subsetting can meaningfully cut font file size, which shows up directly in faster download and render time.

Self-hosting versus third-party font CDNs

Loading fonts from a third-party CDN like Google Fonts adds an extra DNS lookup and connection setup that self-hosting the font files on your own domain avoids entirely. The difference is usually modest on a fast connection but more noticeable on slower mobile networks, and self-hosting also removes a dependency on a third party's uptime.

What to skip unless you have a specific reason

Variable fonts (a single file covering a full weight range) can reduce total font requests versus loading several separate weight files, but they're often larger per file, so the net benefit depends on how many weights you're actually using. We check this case by case rather than assuming variable fonts are automatically the faster choice.

Matching the fallback font to reduce layout shift

font-display: swap solves the invisible-text problem, but it introduces a second, subtler one: if the fallback font and the custom font have noticeably different character widths, the swap itself causes a visible layout shift as text reflows, which directly hurts a page's Cumulative Layout Shift score even though the render-blocking problem is fixed. We address this by choosing a fallback font with metrics (average character width, line height) close to the custom font, sometimes using a tool that generates a metrically-adjusted fallback automatically, so the swap happens with minimal visible reflow rather than trading one performance problem for another.

This is a step teams frequently skip because the layout shift from a font swap is a genuinely separate metric from the render-blocking issue font-display already solved, and it's easy to declare victory after fixing the first, more obvious problem without checking whether a new, smaller one was introduced in its place.

font-display: swap solves the invisible-text problem, but it introduces a second, subtler one: if the fallback font and the custom font have noticeably different character widths, the swap itself causes a visible layout shift as text reflows, which directly hurts a page's Cumulative Layout Shift score even though the render-blocking problem is fixed.

How many font weights a typical site actually needs

It's common to see a project pull in four, five, or six font weights by default, regular, medium, semibold, bold, plus separate italic variants of each, when the actual design only meaningfully uses two or three of them. Every additional weight is a separate file to download, and auditing actual usage against what's loaded is one of the simplest, highest-leverage font performance fixes available, often cutting total font payload substantially with zero visual change to the live site.

We run this audit early in any performance engagement: checking computed styles across every unique page template for which weights are actually rendered, then trimming the loaded font set to match. It's a quick check that regularly turns up weights loaded purely out of habit from a starter template, never actually used anywhere on the live site.

Where font loading sits in the overall performance priority list

Font optimization is worth doing, but it's rarely the single biggest lever on a slow page, and we're careful not to let clients over-invest time here relative to bigger wins like image optimization or reducing third-party script weight. Our general approach is to apply the font-display fix immediately, since it's nearly free and addresses the most visible symptom, then queue the rest of this list, subsetting, self-hosting, weight trimming, behind a broader performance audit rather than treating font loading as a standalone project deserving its own dedicated sprint.

Icon fonts as a special, often-overlooked case

Sites that still load a full icon font for a handful of interface icons are paying the same render-blocking and file-size costs described above, but for glyphs that usually aren't even part of the readable text content, which makes the fix even more clearly worthwhile once noticed. Converting a small icon font down to inline SVGs removes an entire render-blocking font request from the critical path for zero visual change, and it's one of the more surprising wins we find during a font audit precisely because teams rarely think to check their icon font under the same scrutiny they apply to body text fonts.

Measuring the actual before-and-after, not just assuming the fix worked

Every font optimization change gets measured against a specific before-and-after metric, typically First Contentful Paint and Cumulative Layout Shift pulled from real user monitoring data rather than a single lab test run, since font loading behavior can vary meaningfully between a controlled lab environment and real-world conditions across a diverse range of devices and connection speeds. We've seen font-display changes that tested as a clear win in a lab tool produce a smaller real-world improvement once measured against actual field data, usually because the lab test doesn't fully capture the specific network conditions a meaningful share of real visitors are on.

Where this fits relative to a broader Core Web Vitals effort

Font loading fixes are usually one line item within a larger Core Web Vitals remediation project rather than a standalone engagement, and we sequence them early in that broader project specifically because they're quick to implement and produce a measurable, visible win that helps build client confidence in the rest of the performance work still to come.

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.