Most developer portfolios, documentation sites, and SaaS landing pages use one font for everything or pair two fonts that fight each other. Typography is one of those skills that separates "looks professional" from "looks like a side project," and font pairing is the highest-leverage typographic decision you will make.
The core principle is simple: pair fonts that contrast but do not conflict. A serif heading with a sans-serif body creates visual hierarchy through contrast. Two sans-serif fonts at similar weights create confusion because the reader's eye cannot immediately tell which is the heading and which is the body.
The three reliable pairing strategies
1. Serif headings, sans-serif body. This is the classic pairing and it works almost every time. The serif font provides personality and gravitas for headings, while the sans-serif body text stays clean and readable at small sizes.
Proven combinations:
- Playfair Display + Source Sans Pro
- Merriweather + Roboto
- Lora + Open Sans
- DM Serif Display + DM Sans
2. Sans-serif headings, serif body. Less common but works beautifully for content-heavy sites. The sans-serif headings feel modern while the serif body text provides the comfortable reading experience that serifs are known for in long-form content.
Proven combinations:
- Montserrat + Merriweather
- Raleway + Lora
- Work Sans + Source Serif Pro
- Poppins + Crimson Text
3. Superfamily pairing. Some type designers create font families that include both serif and sans-serif variants designed to work together. These are foolproof because the designer already solved the pairing problem.
Examples:
- IBM Plex Sans + IBM Plex Serif
- Noto Sans + Noto Serif
- Source Sans Pro + Source Serif Pro
- PT Sans + PT Serif
The technical details that matter
Weight contrast. If your heading font and body font are the same weight, the pairing falls flat. Headings typically work best at 600-800 weight, while body text should be 400 (regular). Some font families look thin at 400 on screen, so test at the actual sizes you will use.
x-height matching. The x-height is the height of lowercase letters relative to uppercase. If your heading font has a tall x-height and your body font has a short x-height, setting them at the same font-size produces visually mismatched text. Adjust sizes so the visual weight feels balanced.
h1 {
font-family: 'Playfair Display', serif;
font-size: 2.5rem;
font-weight: 700;
line-height: 1.2;
}
body {
font-family: 'Source Sans Pro', sans-serif;
font-size: 1.125rem;
font-weight: 400;
line-height: 1.6;
}
Loading performance. Each font file is typically 20-50 KB for a single weight in WOFF2 format. Loading two font families with three weights each means six font files, potentially 200+ KB of web fonts. Be intentional about which weights you actually use.
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Source+Sans+Pro:wght@400;600&display=swap" rel="stylesheet">
Only load the weights you use. The display=swap parameter prevents invisible text while fonts load.
Pairings to avoid
Two decorative fonts. If both fonts have strong personality, they compete for attention and the result looks chaotic. At least one font in your pairing should be neutral.
Fonts that are too similar. Pairing Helvetica with Arial or Roboto with Open Sans creates subtle visual inconsistency without meaningful contrast. If you are going to use two sans-serifs, they need distinctly different characteristics -- one geometric and one humanist, for example.
More than two fonts. Every additional font family increases visual noise and page weight. Two fonts are enough for 95% of projects. If you need a third, make it a monospace font for code blocks.
Testing your pairing
The real test of a font pairing is not how it looks in a type specimen. It is how it looks in your actual content at your actual sizes on your actual background color. Dark mode changes the feel of a font pairing significantly -- thin fonts that look elegant on white backgrounds can look fragile and hard to read on dark backgrounds.
Test with real content, not Lorem Ipsum. "The quick brown fox" tells you nothing about how your fonts handle a technical blog post or a pricing page.
I built a font pair generator at zovo.one/free-tools/font-pair-generator that suggests tested font combinations and lets you preview them with your own text. Browse curated pairings, see them rendered at heading and body sizes, and grab the Google Fonts embed code when you find the right match. Takes the guesswork out of a decision that disproportionately affects how professional your project looks.
I'm Michael Lip. I build free developer tools at zovo.one. 500+ tools, all private, all free.
Top comments (0)