The problem with bad pairings

Most bad font pairings fail in one of two directions:

  • Too similar — two humanist sans-serifs from different foundries, or two transitional serifs. The eye registers them as "almost the same but not quite," which reads as a mistake rather than an intentional pairing. The result feels sloppy even if neither font is bad.
  • Too different — a formal Didone serif paired with a rounded comic sans, or a blackletter paired with a technical monospace. The contrast is so extreme that the design feels chaotic and lacks a coherent voice.

The sweet spot is contrast that reads as intentional — the differences are immediately visible and support the content's structure.

Principle 1 — Contrast in classification

The most reliable axis of contrast is classification difference. Pair fonts from clearly different categories:

  • Serif heading + Sans-serif body — the most common editorial pattern. High-contrast serif display for headlines, neutral sans-serif for extended reading.
  • Display sans + Neutral sans — geometric or condensed display font for headings, humanist sans-serif for body. Works well for modern SaaS and marketing sites.
  • Monospace accent + Sans-serif body — mono for code blocks, keys, or technical accents, with sans-serif body. Common on developer documentation.
  • Serif heading + Serif body — two serifs of clearly different weights and historical styles (e.g., a Didone display with a Garamond body). Harder to pull off; succeeds when the contrast in style is obvious.

What to avoid: two transitional serifs from different foundries, or two neutral humanist sans-serifs. The differences are too subtle to read as intentional.

Principle 2 — Harmony in proportion

Beyond classification, fonts must share underlying proportions to feel like a coherent set:

  • Similar x-height ratio — one font with a tall x-height (Inter, ~0.72) paired with one that has a small x-height (Cormorant, ~0.6) creates baseline and vertical rhythm problems. Text set in the two fonts looks like it belongs on different pages.
  • Similar historical voice — a sixteenth-century Garamond revival paired with a Bauhaus-era geometric sans works because both are historically coherent styles, even across 400 years. A Victorian display font paired with a modern geometric sans reads as inconsistent.
  • Compatible stroke contrast — a very high-contrast Didone paired with a monolinear geometric sans can work, but the visual weight balance is delicate. Most successful pairs have roughly similar stroke contrast levels, or use the difference to support hierarchy.

Principle 3 — Hierarchy through weight

Beyond the pairing itself, hierarchy comes from weight and size variation within each font. A well-designed page uses at least four distinct treatments:

  • Hero headline — 800–900 weight, 2.5–4rem
  • Section heading — 700 weight, 1.5–2rem
  • Subheading or label — 600 weight, 1.125rem, often uppercase
  • Body text — 400 weight, 1rem
  • Caption or metadata — 400 weight, 0.8125rem, muted color

This means you rarely need a third font family. The two-font maximum holds because weight variation within one family provides almost all the hierarchy a page needs.

Principle 4 — The metrics must match

Two fonts with very different metrics create subtle layout problems that are hard to identify but obvious in aggregate:

  • Units per em — different UPM values cause fonts to render at different visual sizes even at the same CSS font-size
  • Ascender/descender ratios — affect vertical rhythm and how tightly text feels packed
  • Cap-height to x-height ratio — affects how headings align with body text

Use the Font Comparison Analyzer to check metrics side by side before committing to a pairing. If the metrics differ significantly, you may need to adjust font-size slightly for each font to make them appear to match.

Worked examples

Editorial magazine: Playfair Display + Inter

A high-contrast Didone serif for headlines paired with a neutral geometric sans for body. The contrast is maximal — Didone and geometric sans are as far apart as serif and sans can be — but the harmony holds because both fonts share a modernist, screen-first design philosophy. The Playfair Display should be used only at sizes above 24px (below that, its high contrast reduces legibility); Inter handles all body text at 1rem and above.

Long-form blog: Merriweather + Open Sans

Both fonts are humanist, but they differ in classification (serif vs sans-serif) enough to register as intentional. Merriweather's large x-height and generous spacing support its use at body size, not just headings — this pairing can serve an editorial site where serif body text is desired. Open Sans handles UI labels, buttons, and navigation. Both are strong performers on low-DPI screens.

Modern SaaS: Manrope + Inter

Two sans-serifs, but with meaningful contrast: Manrope is geometric with wide letterforms, Inter is more neutral with tighter spacing. The difference reads as intentional because it is visible at every weight. Manrope handles marketing headings (weight 700–800); Inter handles UI text and body (weight 400–600). Both are variable fonts, so the total page weight stays low.

Technical documentation: IBM Plex Mono + IBM Plex Sans

The rare case where a single superfamily is the right answer. IBM Plex Sans handles body text, headings, and UI. IBM Plex Mono handles code blocks, command examples, and inline code. Because they were designed together, metrics match precisely — no manual adjustments needed.

Avoid: Two similar humanist sans-serifs

Pairing Open Sans with Lato, or Inter with DM Sans, produces a pairing that looks almost right but subtly wrong. The fonts are too similar to register as a deliberate contrast, and the differences (small variations in letterform proportions, x-height, and terminals) create visual noise rather than clarity. If you want both, use one for headings and one for body — but understand you will spend time adjusting metrics to make them look intentional.

Practical checklist

  1. Choose by contrast axis — serif + sans, display + neutral, mono + sans. Never two fonts from the same subcategory.
  2. Verify x-height ratios — aim for both fonts within 0.05 of each other, using the Accessibility Checker
  3. Test at body size — both fonts at 16px on a phone screen, not just at hero sizes
  4. Test weight range — do both fonts have at least 400, 600, 700? If one has fewer weights, you may need a third font after all
  5. Test in a live layout — a heading over a paragraph over a caption. Metrics problems appear immediately when text is stacked.
  6. Test at 320px — narrow viewports reveal spacing problems
  7. Verify licenses — both fonts must permit your intended use

Use the Font Combination Tester to preview any pairing live with real content, and the Font Pairing Generator for 30 pre-validated pairings from editorial, SaaS, and technical contexts.

Frequently asked questions

What makes a good font pairing?

Contrast in classification (serif + sans-serif, display + neutral) with harmony in proportion (similar x-heights, compatible historical voice). Avoid two fonts that are too similar or too different.

How many fonts should a website use?

Two is the standard maximum for text content — one heading font, one body font. Use weight variation within each family for additional hierarchy.

What are classic font pairings?

Playfair Display + Inter, Merriweather + Open Sans, Libre Baskerville + Lato, DM Serif Display + DM Sans, and Cormorant Garamond + Roboto are reliable editorial combinations.

Can I pair two sans-serif fonts?

Yes, with caution. Pair a geometric display sans with a neutral body sans so the difference is obvious. Two humanist sans-serifs from different foundries usually look mismatched.

Should headings and body use the same font?

Often yes, for performance and consistency. Use weight and size contrast instead of adding a second family. This is the correct choice for many modern SaaS products and marketing sites.

Do I need a monospace font for code?

Yes, if you show code or command examples. Use JetBrains Mono, Fira Code, or IBM Plex Mono. The mono font pairs naturally with a humanist sans body font.