
You open your website on a slow connection and... nothing. The page loads, you can see images and buttons, but the text is invisible. A second or two later, it suddenly appears. Your visitors just experienced a broken-feeling page.
This "invisible text" problem happens when browsers hide text while waiting for a custom font to download. The good news is that fixing this in Webflow is straightforward once you understand what's happening and where your fonts are coming from.
In this tutorial, you'll learn how to keep text visible during font loading by configuring font-display correctly. You'll also learn how to handle the common edge cases like Google Fonts loaded through Webflow, external font embeds, and icon fonts.

The core issue is simple: invisible text makes your page useless until fonts load. When visitors can't read your content, they suffer in concrete ways.
This problem shows up in audits like Lighthouse and PageSpeed Insights as the warning "Ensure text remains visible during webfont load". These tools can help you identify font-loading issues, but remember: the goal isn't passing an audit — it's making sure your users can read your content immediately (for example, using a third-party live chat widget might add a few hundred milliseconds to your "Time to Interactive" score, but the business value of real-time customer support far outweighs a slightly lower performance number).
Before changing anything, confirm that font loading is actually causing the problem. Invisible content can also come from CSS issues, JavaScript errors, or lazy-loading behavior.
The most reliable way to check is to experience your site like a user on a slow connection.
Pay attention to your hero section, navigation, and any text above the fold. If you see blank areas that suddenly "pop" with text after a moment, you've confirmed the problem.
PageSpeed Insights can point you to the exact font file causing the issue.
Write down the flagged URLs — this tells you exactly which font to fix:
Understanding why this happens makes the fix intuitive.
When a browser encounters a custom font in your CSS, it has a decision to make: what should I do while the font file downloads? By default, many browsers choose to hide the text completely until the font arrives. This behavior is called FOIT (Flash of Invisible Text).
FOUT is almost always better for users. Yes, they might briefly see a different font, but at least they can read your content immediately. That's the tradeoff we want.
The font-display property tells the browser what to do while waiting for your font. Instead of hiding text, you can instruct it to show fallback text immediately.
Think of it as giving the browser a plan B: "If my custom font isn't ready, show the text anyway with whatever font you have available."
Before implementing, understand your options. The font-display property accepts several values, but these three matter most:
Swap shows fallback text immediately and swaps to the custom font whenever it arrives — even if that takes several seconds.
Optional gives the font a very short window to load. If it doesn't arrive almost immediately, the browser sticks with the fallback font for the entire page session — it won't swap later.
Fallback is a middle ground — it gives the font a short block period (text invisible), then a swap period, then stops trying.
Recommendation: Start with Swap for most Webflow sites. It eliminates invisible text completely. Only switch to Optional if you notice significant layout shift problems.
This is the most straightforward case. If you've uploaded font files directly to Webflow, you can set font-display using native Webflow settings.

Important: If your design uses multiple weights or styles (Regular, Bold, Italic, etc.), repeat this for every variant you actually use. Setting it on one variant doesn't automatically apply to others.
Setting font-display doesn't affect how your fonts look or scale — it only controls the loading behavior. Your typography will work exactly as before, just without the invisible text period.
This is where most people get stuck. Webflow's native font-display setting only works for custom uploaded fonts — not for Google Fonts added through Webflow's integration.
When you add a Google Font via Project settings → Fonts, Webflow loads it through a script called webfont.js. You don't have direct control over the font-display value in this setup.
The cleanest solution is to download the Google Font and upload it as a custom font. This gives you full control.
After publishing, confirm the Google Font loader is gone:
If any of these appear, you still have a reference to Google Fonts somewhere in your project. Check your styles again — even one class using the old font name will keep the loader active.
If you must use Google-hosted fonts, you can add your own link with display=swap — but this only works if you completely remove Google Fonts from Webflow settings first. This approach is also useful if you want to optimize your Webflow hosting bandwidth, since font files are served from Google's CDN instead of counting against your Webflow plan.
Add this to your Project settings → Custom code → Head code:
<!-- Google Fonts with font-display control -->
<link
href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap"
rel="stylesheet"
/>
Replace Roboto and the weights with your actual font. The key is display=swap in the URL — this tells Google's CSS to include font-display: swap in the generated @font-face rules.
If your fonts are loaded through external CSS or a JavaScript-based font loader (like Adobe Fonts/Typekit patterns), Webflow's font settings won't help. You need to add font-display directly in the @font-face rule.
If you control the @font-face declaration (in your own external CSS or Webflow's Head code), add font-display: swap directly:
/*!
* BRIX Templates Custom Font Setup for Webflow
* ----------------------------------------------------------------------------
* Example @font-face with font-display to prevent invisible text (FOIT).
* Replace the font-family, src, and other values with your actual font.
*
* Version: 1.0.0
* Author: BRIX Templates
*/
@font-face {
font-family: "YourFontName";
font-style: normal;
font-weight: 400;
src: url("https://your-domain.com/fonts/your-font.woff2") format("woff2");
font-display: swap; /* Prevents invisible text while font loads */
}
Site-wide (recommended):

Page-level (only when needed for a specific page):

Icon fonts (Font Awesome, Bootstrap Icons, Material Icons, etc.) are a common reason the warning persists even after you fix your text fonts. They're loaded the same way as regular fonts, so they need font-display too.
With text fonts, Swap works great — users see fallback text, then it swaps. But with icon fonts, the "fallback" is usually empty squares or random characters, which looks broken. This makes icon fonts trickier to handle gracefully.
The cleanest solution is switching from icon fonts to SVG icons:
When you use inline SVGs via Embed elements, the icon code is part of your HTML — it doesn't add an extra network request, so there's no performance penalty to worry about.
This approach eliminates the problem entirely rather than just patching it.
If you must keep the icon font, ensure its @font-face includes font-display:
After applying the fix, test that icons don't visibly "pop" in a way that looks broken. If they do, SVGs are the professional solution.
If you don't verify correctly, you'll waste time thinking your changes "didn't apply."
If text appears right away (even in a fallback font that later swaps), your fix is working.
After real-world testing:
For custom fonts:
If the @font-face doesn't include font-display, your setting might not have published correctly, or the flagged font is coming from a different source.
"I set font-display to Swap in Webflow, but PageSpeed still shows the warning"
The flagged font probably isn't the one you configured. Check the URL in the PageSpeed warning — is it your custom font, a Google Font, or an icon font? Each source needs its own fix.
"Webflow still loads Google Fonts even after I removed them in settings"
One class or tag somewhere still references that font family. Use the Style panel selector search to find every instance using the old font name, replace them, then publish again. Verify by checking that webfont.js no longer appears in DevTools Network.
"My text flashes with a different font before the custom font loads"
That's FOUT — and it's the expected behavior with Swap. If the flash is too noticeable, choose a fallback font stack that's closer to your custom font (similar x-height and width), or use Optional with preloading for critical fonts.
"The warning is caused by Font Awesome or another icon font"
Either add font-display to the icon font's @font-face rule, or switch to SVG icons. Icon fonts are largely a legacy approach at this point — SVGs give you better control and eliminate this class of problems entirely.
"Lighthouse says it can't automatically check my font-display value"
Some implementations (iframes, script loaders, cross-origin CSS) limit what Lighthouse can validate. Focus on the real UX outcome: do you ever see invisible text? Test manually with network throttling and trust what you observe.
This warning means Lighthouse detected that your fonts might cause FOIT — text stays invisible until the custom font downloads. Visitors see a blank page (or blank text areas) while waiting.
The fix is telling the browser to show fallback text immediately using font-display: swap or similar. Once you configure this correctly for all your fonts, text will always be readable — it might briefly appear in a different font before swapping, but that's far better than invisible content.
For custom fonts uploaded to Webflow, use the native setting. Go to Project settings → Fonts → Custom fonts, click Edit on your font, and set Font display to Swap. Save and publish.
This adds font-display: swap to the font's @font-face rule, so text renders immediately with a fallback font while yours loads. Repeat this for every weight and style you use — setting it on Regular doesn't automatically apply to Bold or Italic.
Usually because the flagged font isn't the one you configured. Webflow sites often load fonts from multiple sources: your uploaded custom fonts, Google Fonts from the integration, icon fonts, and third-party embeds.
Check the exact URL in the PageSpeed warning. If it points to fonts.googleapis.com, you have a Google Fonts issue. If it points to Font Awesome's CDN, it's an icon font. Each source needs its own fix — the Webflow font-display setting only affects uploaded custom fonts.
Webflow's Google Fonts integration loads fonts via webfont.js, and you can't directly control font-display in this setup. The cleanest fix is to self-host: download the Google Font, upload it to Webflow as a custom font, set font-display to Swap, update your typography to use the uploaded version, then remove the Google Font from settings.
After publishing, verify that webfont.js and fonts.googleapis.com no longer appear in DevTools Network. If they do, you still have a reference somewhere.
These control how long the browser waits for your font before showing text. Swap shows fallback text immediately and swaps whenever the font arrives — best for most sites. Optional gives a tiny window, then sticks with fallback permanently — best for maximum stability. Fallback is a middle ground with a short invisible period then a limited swap window.
Start with Swap unless you notice significant layout shift when fonts swap in. In that case, try Optional combined with preloading your critical fonts.
Yes, in most cases. Icon fonts were popular years ago, but they create problems: font-loading delays, invisible icons during FOIT, accessibility issues, and this exact Lighthouse warning. SVGs render immediately, scale perfectly, and can be styled with CSS.
In Webflow, you can use Embed elements for inline SVGs or upload SVG files as images. Most icon libraries (Font Awesome, Heroicons, Feather) offer SVG options. The migration takes some work, but it eliminates font-loading problems for icons entirely.
No. The font-display property only controls loading behavior — what happens while the font file downloads. Once loaded, your fonts render exactly as before. Your typography, sizing, spacing, and styling remain unchanged.
The only visible difference is what users see during loading: fallback text instead of invisible text. And once the font arrives, it swaps in and looks exactly as you designed it.
That flash is called FOUT (Flash of Unstyled Text), and it's the intended behavior when using font-display: swap. The browser shows your fallback font immediately, then swaps to the custom font when it's ready.
If the flash is too noticeable, you can minimize it by choosing a fallback font with similar metrics to your custom font, or by preloading critical fonts so they arrive faster. But some FOUT is normal and far better than invisible text.
Test on the published site with network throttling. Open DevTools, throttle to Slow 3G, and reload. If text appears immediately (even in a fallback font), your fix is working. If text stays invisible for a moment, something's still wrong.
Then run PageSpeed Insights to confirm the audit passes. If it still warns, check which font URL is flagged — you might have fixed one source but missed another.
Font-display improves perceived performance — users see content faster, which feels faster even if actual load times are similar. This can reduce bounce rates and improve engagement signals.
For SEO specifically, fixing this warning helps your Core Web Vitals (Lighthouse uses it as an input), but the bigger benefit is user experience. Users who can read your content immediately are more likely to engage and convert.
Fixing the "Ensure text remains visible during webfont load" warning in Webflow comes down to one principle: give the browser a fallback plan. Set font-display to Swap so text renders immediately, even if your custom font takes a moment to load.
For custom fonts uploaded to Webflow, use the native Font display setting. For Google Fonts, self-host them to gain full control. For icon fonts, either add font-display or switch to SVGs. And always verify on the published site with network throttling — not just in PageSpeed reports.
The goal isn't a perfect audit score — it's making sure your visitors can read your content the moment they arrive.
If you'd like help optimizing font loading and typography performance across your Webflow site, our team can handle the implementation efficiently.

Click-to-load embeds in Framer with a Code Override: load Calendly/Google Maps only on click, with code, setup, and DevTools checks.

Prevent layout shift in Framer by reserving image space before load. Reduce CLS in hero, CMS, and responsive layouts.

Step-by-step guide to fix image layout shift in Webflow, covering hero sections, CMS content, and Rich Text blocks to stop jumps.