
How to choose a font for your website?
- Sajjad
- Typography
- 11 Oct, 2026
To choose a font for your website, start with the job it has to do, then filter candidates by readability, language support, available weights and styles, licensing and file size, and only then decide on personality. For body text you want a typeface with a generous x-height, open letter shapes, clear distinctions between similar characters and reliable rendering at 16px to 18px. For headings you can be more expressive, as long as the font fits your brand and pairs well with the body face. Test your shortlist with real content on real devices, not with lorem ipsum in a design tool. A good choice is one readers don't notice while they're reading, but would miss if it changed.
Fonts shape how a site feels before anyone reads a word, and they decide how comfortable it is to read once they do. They also affect page speed, accessibility and legal risk. In this article you'll learn a step-by-step process for choosing a website font, the technical checks to run before committing, how to evaluate readability, how to think about personality without guesswork, and how to load your choice efficiently.
Step 1: Define What the Font Needs to Do
Before browsing fonts, write down the requirements. This prevents choosing a typeface because it looked good in a specimen and discovering later that it lacks a bold or doesn't support your languages.
Ask these questions:
- What will people mostly read? Long articles, short marketing copy, product listings, data tables or interface labels each favour different designs.
- Where will it be read? Mostly phones, mostly desktops, or both. Small screens favour sturdy letterforms with open counters.
- Which languages and scripts? English only, Western European languages, Central European, Vietnamese, Greek, Cyrillic or non-Latin scripts.
- Which roles? Body text, headings, navigation, buttons, captions, code, numbers in tables.
- What tone? Formal, friendly, technical, editorial, playful. Pick two or three words, not ten.
- What budget and licence? Free and open source, a one-off purchase, or a subscription.
Write the answers as a short brief. Every font you consider should be checked against it.
Step 2: Decide How Many Fonts You Need
Most sites need one or two typefaces. A single well-designed family with several weights can handle body text, headings and interface elements on its own. Adding a second family for headings gives more character but adds decisions and file weight.
| Approach | Best for | Trade-off |
|---|---|---|
| One family | Apps, documentation, minimal brands | Less contrast between headings and body |
| Two families | Most content sites and brands | Needs careful pairing |
| System fonts | Performance-critical apps, internal tools | Looks different on each platform |
If you plan to use two families, see how to pair fonts effectively once you've chosen the body face. Choose the body font first, because it covers most of the page.
Step 3: Check Readability for Body Text
Body text is where most of the reading happens, so it deserves the most scrutiny. Look for these characteristics.
- Generous x-height: Lowercase letters that are tall relative to capitals look larger and stay legible at small sizes.
- Open apertures: The openings in letters like c, e and a should be wide, so they don't close up at small sizes or on low-resolution screens.
- Distinct letterforms: Check that capital I, lowercase l and the numeral 1 are distinguishable, and that 0 and O differ. This matters for codes, usernames and data.
- Moderate contrast: Very high contrast between thick and thin strokes, as in many Didone faces, breaks up at small sizes on screen.
- Even texture: A paragraph should look like an even grey without dark blotches or gaps.
- Comfortable spacing: Tight default spacing that looks elegant in headlines can feel cramped in paragraphs.
A quick test string covers most of the trouble spots:
Il1| O0 rn m cl d g9q 5S 2Z 8B
The quick brown fox jumps over the lazy dog. 0123456789
Minimum illumination: 111 lumens at 1.1 m.
Words like "minimum" and "illumination" quickly reveal whether vertical strokes blur together.
Serif or Sans-Serif?
Both can work for body text on modern high-resolution screens. Sans-serifs tend to feel neutral and modern, and are common in interfaces. Serifs often feel more literary or authoritative and suit long-form reading. Research hasn't produced a consistent winner for screen readability, so choose based on tone and the specific typeface's quality rather than the category.
Step 4: Run the Technical Checks
A beautiful font that fails these checks will cause problems later.
Character Set and Language Support
Check that the font covers every character your content uses, including accented letters, curly quotes, dashes, currency symbols and any special characters in product names. Missing glyphs fall back to a different font, which looks broken.
If you have the font file, you can list its supported characters with fontTools:
pip install fonttools
python3 -c "
from fontTools.ttLib import TTFont
font = TTFont('SourceSerif4-Regular.ttf')
cmap = font.getBestCmap()
needed = 'ąćęłńóśźżčřšžőű€£–—“”‘’…'
missing = [c for c in needed if ord(c) not in cmap]
print('Missing:', ''.join(missing) or 'none')
"
Missing: none
Weights and Styles
Make sure the family includes at least a regular, a true italic and a bold. Without a real italic or bold, browsers create synthetic versions that look distorted. Variable fonts often cover the whole weight range in one file, which is convenient and efficient.
OpenType Features
Useful features for websites include tabular numerals for tables and prices, proper ligatures, small caps and alternate characters. Check what the font supports before you rely on it:
.price-table {
font-variant-numeric: tabular-nums;
}
If the font lacks tabular figures, this declaration silently does nothing.
File Size and Performance
Each weight and style of a static font is a separate download, typically 15KB to 100KB or more per file in WOFF2 depending on character coverage. Four static files can easily exceed the size of a single variable font. Check the total, and plan to subset to the characters you need where the licence allows.
Licensing
Confirm that the licence covers web use. Desktop licences often don't permit embedding with @font-face. Open-source licences such as the SIL Open Font License, used by most Google Fonts, allow web embedding and self-hosting. Commercial web licences are sometimes priced by page views or domains. Keep a copy of the licence with your project.
Step 5: Consider Personality and Context
Once a font passes the practical checks, think about how it feels. Personality comes from details such as stroke contrast, the shape of terminals, the width of letters and how geometric or humanist the forms are.
- Geometric sans-serifs: Built from circles and straight lines. They feel clean, modern and confident, but some have single-storey a and g shapes that reduce legibility at small sizes.
- Humanist sans-serifs: Based on handwriting proportions, with varied stroke widths and open shapes. They feel friendly and are very readable.
- Neo-grotesque sans-serifs: Neutral and even, like Helvetica or Inter. They suit interfaces and brands that want to stay out of the way.
- Transitional and old-style serifs: Warm and bookish, well suited to editorial sites and long reading.
- Slab serifs: Sturdy and confident, good for headings and brands with a practical character.
Look at sites in your sector, but don't copy them. A distinctive yet readable font can set you apart.
Step 6: Test With Real Content
Specimen pages are designed to flatter fonts. Your content might not. Build a simple test page with a real article, a real product page or a real form, and swap fonts with a CSS custom property.
<!doctype html>
<html lang="en-GB">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Font test</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,400;0,8..60,600;1,8..60,400&family=Public+Sans:ital,wght@0,400;0,600;1,400&display=swap" rel="stylesheet">
<style>
:root { --body-font: "Source Serif 4", Georgia, serif; }
body {
font-family: var(--body-font);
font-size: 1.125rem;
line-height: 1.6;
max-width: 66ch;
margin: 2rem auto;
padding-inline: 1rem;
}
</style>
</head>
<body>
<h1>Paste a real headline here</h1>
<p>Paste two or three real paragraphs here, including <em>italic</em>,
<strong>bold</strong>, numbers like 1,250.00 and a <a href="#">link</a>.</p>
</body>
</html>
Then switch fonts from the DevTools console:
document.documentElement.style.setProperty(
"--body-font",
'"Public Sans", system-ui, sans-serif'
);
Check each candidate on:
- A phone in daylight and in a dim room.
- A Windows laptop and a Mac, since rendering differs.
- Light and dark themes, if you have both.
- Browser zoom at 200%.
Read a full article in each candidate. The one you notice least while reading is usually the right body font.
Step 7: Load the Font Efficiently
Once you've chosen, load only what you use. Self-hosting gives you the most control:
@font-face {
font-family: "Source Serif 4";
src: url("/fonts/SourceSerif4-Variable.woff2") format("woff2");
font-weight: 200 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Source Serif 4";
src: url("/fonts/SourceSerif4-Italic-Variable.woff2") format("woff2");
font-weight: 200 900;
font-style: italic;
font-display: swap;
}
body {
font-family: "Source Serif 4", Georgia, "Times New Roman", serif;
}
Always include a fallback stack with fonts of similar proportions, so text remains readable while the web font loads and doesn't shift too much when it swaps in.
FAQ: Choosing a Website Font
There is no single most readable font. Readability depends on size, spacing, line length and contrast as much as the typeface. Fonts with a large x-height, open shapes and distinct characters, such as Source Sans 3, Inter, Atkinson Hyperlegible or Source Serif 4, are reliable choices.
Either can work well on modern screens. Choose based on tone and the quality of the specific typeface. Sans-serifs often suit interfaces and modern brands, while serifs suit editorial and long-form content.
One or two typefaces is enough for most sites. A single family with several weights can handle everything, and a second family can add character to headings. More than two usually makes a design feel inconsistent.
Not necessarily. Many desktop font licences do not allow web embedding. Check the licence, or choose fonts released under the SIL Open Font License or bought with a web licence.
They add downloads, but the impact can be small if you load only the weights you need, use WOFF2, subset where allowed, use font-display swap and preload the most important file.
System fonts load instantly and look native, which suits apps and performance-critical sites. The trade-off is less brand distinction and different appearance on each operating system.
Conclusion
Choosing a font for your website is easier when you treat it as a set of requirements before a matter of taste. Define what the font must do, decide how many families you need, check body text readability, and confirm language support, weights, OpenType features, file size and licensing before falling for a specimen.
Then judge personality, and test your shortlist with real content on real devices and in different conditions. Load the winner efficiently with sensible fallbacks. A font chosen this way will look right for your brand, read comfortably for your audience and cause no surprises when the site goes live.


