Article

Website Fonts: How to Choose and Pair Them in 2026

How to choose, pair, size, license and load website fonts, with the real pairings used in six live templates.

Good website fonts come down to five decisions: use one or two families, pair a distinctive heading face with a plain body face, set body text at 16–18px with a line height near 1.5, check the licence covers web use, and load WOFF2 files with a sensible `font-display` value.

This guide covers each of those decisions with checkable numbers. Where it names fonts, they are ones we found today in the CSS of live Waida Studio templates, so you can open the demos and see the pairings at real sizes rather than on a specimen sheet.

How Many Fonts Should a Website Use?

Most websites need one or two font families. One family with several weights is the safest choice for product, SaaS and business sites. Two families give you contrast, usually a display or serif face for headings and a neutral sans for everything else. A third family is rarely worth the extra download.

Count families, not files. A family such as Inter Tight can ship as a single variable font that covers every weight, while a static family ships one file per weight and style. Every extra family adds requests and more chances for text to shift as fonts arrive.

Setup

When it works

Watch out for

One family, 2–4 weights

SaaS, startups, dashboards, most business sites

Headings that look too close to body text; fix it with weight and size, not a second font

Two families (display + text)

Agencies, portfolios, brands with a personality

A display face used for long paragraphs

Two families (sans + serif accent)

Clinics, consultancies, editorial pages

Accent text that is too small to read in the serif

Three or more

Rarely; an icon or mono face for code samples

Page weight and layout shift

Font Pairing: What Actually Works

A pairing works when the two faces differ clearly in one way and agree in another. The usual difference is width, weight or classification (serif against sans). The usual agreement is proportion: similar x-heights so the two sit comfortably on the same line. If you can't name the difference, use one family.

These are the pairings in six Waida templates, read today from the CSS of their live HTML builds:

Template

Headings

Body

Pattern

Mariq

Anton

Geist

Condensed display + neutral sans

Medonix

Inter Tight

Inter Tight, with Lora for accent text

One sans + serif accent

Avande

Inter Tight

Inter Tight, with Stack Sans Notch as a third face

One family + display accent

Finos

Inter Tight

Inter Tight

One family, weight contrast

Steelcrest

Inter

Inter

One family, weight contrast

Zelda

Creato Display

Creato Display

One family, light to medium weights

Mariq shows the two-family pattern at its clearest. Anton is a tall, condensed display face classified as Display on Google Fonts, so it only appears in large headings. Geist, a plain sans, handles every paragraph, button and label. Medonix does the opposite: one sans does almost everything, and a serif appears only on a few highlighted words.

  • Keep the display face big. Condensed and decorative faces lose legibility below about heading size.
  • Give the body face the boring job. It should be readable at 16px on a cheap phone screen, in every weight you use.
  • Test real copy. Your longest headline and a 60-word paragraph tell you more than a pangram.
  • Check the characters you need. Currency symbols, accented names and numerals in tables vary between fonts.

Font Size, Line Height and Line Length

Set body text at 16–18px, line height around 1.5, and lines of no more than about 80 characters. Those figures come from accessibility guidance and match what the Waida templates ship: Medonix sets its default paragraph at 16px, and Mariq sets its default text at 18px.

Setting

Starting point

Source or reason

Body size

16–18px (1rem–1.125rem)

Set sizes in rem so text scales with the reader's browser settings

Line height (body)

1.4–1.6

WCAG 1.4.12 requires layouts to survive 1.5

Line height (headings)

1.0–1.2

Large text needs less leading

Line length

Up to 80 characters

WCAG 1.4.8 (AAA) sets 80 characters, 40 for CJK

Paragraph spacing

At least 1× the font size

WCAG 1.4.12 tests 2× without content breaking

Alignment

Left-aligned, not justified

WCAG 1.4.8 asks for text that is not justified

The text spacing criterion is Level AA, and it is about resilience rather than defaults: your design doesn't have to use line height 1.5, letter spacing 0.12em and word spacing 0.16em, but nothing may be clipped or overlap when a reader applies them. Fixed-height buttons and cards with tight text are where this usually fails.

Headings follow the same logic. Your hero headline can be large and tightly set, but test it at mobile width with the longest wording you plan to use; our hero section design guide covers headline length in more detail.

System Fonts, Google Fonts or Self-Hosted?

System fonts cost nothing to load, Google Fonts are the easiest hosted option, and self-hosting gives you control over files and caching. Many sites use a system stack (`system-ui, sans-serif`) for body text and one hosted face for headings, which is a pattern web.dev suggests.

  • System fonts (`system-ui`): no download, and the text looks native on each device. The trade-off is that it looks different on Windows, macOS and Android.
  • Google Fonts API: link a stylesheet and the files come from Google's servers. web.dev's font guide recommends a `preconnect` to fonts.googleapis.com and a second one, with `crossorigin`, to fonts.gstatic.com.
  • Self-hosted: you serve the WOFF2 files from your own domain. web.dev notes the speed gain is not guaranteed, so test it, and apply the subsetting and compression a provider would otherwise do for you.

The Waida HTML builds we checked self-host their fonts: Medonix, Mariq and Avande load WOFF2 files from the same domain, each declared with `font-display: swap`.

Font Licences: What You Can Do With a Free Font

Check that the licence covers web embedding before you upload a font anywhere. Most Google Fonts use the SIL Open Font License, which lets you use, embed and redistribute the font in commercial work. The one thing it forbids is selling the font files on their own.

All five Google families in the table above (Inter, Inter Tight, Lora, Anton and Geist) are listed as OFL in the google/fonts repository, which is also where each font's licence file lives. The OFL text adds a few conditions: keep the copyright notice and licence with the font files, and don't release a modified version under a reserved font name.

Commercial fonts are different: a desktop licence does not automatically cover embedding the font on a website, so read the licence for the exact use you have in mind. Webflow's own help article on uploading fonts tells you to confirm you have permission before uploading.

Loading Fonts Fast: WOFF2, font-display and Subsetting

Serve WOFF2, load only the weights and character sets you use, and choose a `font-display` value on purpose. Fonts are often among the largest files a template downloads, and a late font causes either invisible text or a visible jump when it swaps in.

WOFF2 is the format to use: web.dev reports it compresses about 30% better than WOFF and has the widest browser support. The `font-display` descriptor decides what happens while the file is still downloading:

Value

Behaviour

Good for

`swap`

Fallback text shows almost at once; the web font replaces it whenever it arrives

Headings and brand text that must use the font

`fallback`

Short invisible period, then fallback; the font swaps in only if it arrives within a short window

A middle ground for body text

`optional`

Fallback shows; the font is used only if it is already available, so there is no swap

Body text when layout stability matters most

`block`

Text stays invisible for a short time, then the font swaps in whenever it loads

Icon fonts, which are better replaced with SVG

`auto`

The browser decides

Leaving it to the browser

The behaviours above follow MDN's font-display reference. Two more techniques cut layout shift: subsetting, so a page downloads only the Latin or Cyrillic glyphs it needs via `unicode-range`, and the `size-adjust` descriptor, which scales the fallback font to match the web font's proportions.

Adding Fonts in Framer and Webflow

Both builders include Google Fonts out of the box and accept uploaded fonts, and both recommend WOFF2. The difference is where you do it: Framer uploads through the font picker on a text layer, while Webflow uploads in Site settings.


Framer

Webflow

Built-in libraries

Google Fonts and Fontshare in the font picker

Google Fonts and Adobe Fonts integrations in Site settings > Fonts

Uploading

Select a text layer, open the font picker, Custom tab, Upload Fonts

Site settings > Fonts > Custom fonts

Recommended format

WOFF2

WOFF2 (also accepts WOFF, TTF, OTF, EOT, SVG; 4MB per file)

Automatic optimisation

Converts to WOFF2, splits subsets, `swap` with size-matched fallbacks

Creates fallback fonts for uploaded families

Paid plan needed to upload

Not stated

No

Sources: Framer's help articles on adding custom fonts and how fonts are optimised, and Webflow's article on uploading custom fonts. One Webflow gotcha: if you upload a font that shares a name with a Google font, such as Montserrat, rename it or Webflow may keep loading Google's copy.

If your fonts come from a design file, set them up before you rebuild the layout; our guide to moving from Figma to Framer covers which fonts need uploading after you paste.

Templates With the Typography Already Set

A template saves you the pairing and sizing work, because the type scale is already tested across breakpoints. These four are Waida Studio's own templates, so treat them as our picks rather than a neutral review. Each is free on Framer with a free Waida account.

Mariq: Anton and Geist

Mariq — Marketing Agency Template preview

Mariq is an 11-page template that uses Anton for headings and Geist for body text, a clear example of a condensed display face paired with a quiet sans. It is free on Framer, $79 on Webflow, $39 as HTML and $49 for Next.js or Astro.

Check out Mariq template

Medonix: Inter Tight with a Lora accent

medonix feature

Medonix is a 13-page SaaS and business template that runs on Inter Tight throughout, with Lora reserved for accent text. It is free on every platform, and its Figma file is free too.

Check out Medonix template

Avande: Inter Tight with a display accent

avande feature image

Avande is a 16-page agency template that sets headings and body in Inter Tight and adds Stack Sans Notch as a third, decorative face. It is free on Framer, $99 on Webflow, $39 as HTML and $49 for Next.js or Astro.

Check out Avande template

Finos: one family, weight contrast

finos feature image

Finos is a 15-page SaaS template that uses Inter Tight for everything and builds hierarchy from size and weight alone. It is free on Framer, $59 on Webflow, $39 as HTML and $49 for Next.js or Astro.

Check out Finos template

Swapping a template's fonts is usually a style-level change in Framer or Webflow, but recheck headings, buttons and navigation afterwards, because a wider font can push text out of fixed boxes. If you'd rather not, our customisation service starts at $499.

Templates to start from

All 46 templates

Frequently asked questions

What is the best font for a website?

There is no single best font. For body text, choose a plain, well-hinted sans such as Inter or Geist, or a system font stack; for headings, choose a face that suits the brand and stays readable at large sizes.

How many fonts should a website use?

One or two families. One family with several weights suits most business and SaaS sites; two give contrast between headings and body text. A third family rarely justifies the extra download and layout shift.

What font size should body text be on a website?

Use 16–18px for body text, set in rem so it scales with the reader's browser settings, with a line height around 1.5 and lines of no more than about 80 characters.

Are Google Fonts free for commercial websites?

Most are. Google Fonts families are mainly released under the SIL Open Font License, which allows commercial use and embedding on websites but forbids selling the font files on their own. Check each font's licence file to be sure.

Which font format should I use on a website?

Use WOFF2. It compresses better than WOFF, TTF or OTF and works in all modern browsers, and both Framer and Webflow recommend it for uploaded fonts.

What does font-display: swap do?

It shows text in a fallback font almost immediately and replaces it with the web font whenever that file finishes loading. Text is never invisible, but a late font can cause a visible jump.

Pick one or two families, give the body face 16–18px and room to breathe, confirm the licence allows web use, and serve WOFF2 with a deliberate `font-display` value. Then test your real headlines on a phone before you publish; our website launch checklist has the rest of the pre-launch checks.

If you want a tested type system to start from, browse the Framer templates, where many are free with a free account, or the Webflow templates. Paid templates are also included in Pro, from $12 a month billed yearly.

Kazi Mohammed EhsanFounder of Waida Studio

More from Kazi

Related articles

More in Design Craft