font-display: swap and the invisible text problem

A browser waiting on a web font shows nothing where the text should be — for up to three seconds in most engines — and on a slow connection that is the entire perceived load time.

@font-face {
    font-family: 'Inter';
    src: url('/fonts/inter.woff2') format('woff2');
    font-display: swap;
    font-weight: 400;
}

swap renders immediately in the fallback and swaps when the font arrives, which trades a visible reflow for text that can be read. The reflow is worth minimising by choosing a fallback with similar metrics, and optional is the alternative for anyone who would rather never swap than swap late. Preloading the font file alongside this is the other half — font-display controls what happens while waiting and does not shorten the wait.