Font Pair Previewer

Pick two Google Fonts and see how they look together at the sizes you will actually ship. Live contrast and line-length readouts, your own colours, and one click to copy the CSS — no signup, no API key needed.

Heading font
Playfair Display
Body font
Source Sans Pro
Suggested pairs
CSS import & declarations

      

How to pair Google Fonts

Preview heading and body font combinations on realistic layouts at real sizes, check the contrast and line length as you go, then copy the CSS and Google Fonts embed code.

🔤

1. Pick two fonts

Search 77 Google Fonts — every name in the list is rendered in its own typeface — or start from a curated pairing. The weight menu only offers the weights that family actually ships.

👀

2. Tune and judge

Five sample layouts, real size, line-height, tracking and measure controls, and your own text and background colours. Live readouts show the contrast ratio and the characters per line.

📋

3. Copy the code

The @import or link tag for just the two weights you chose, plus font-family custom properties for headings and body.

Classic pairing strategy: contrast, not conflict. A serif heading with a sans-serif body (Playfair Display + Source Sans Pro) reads editorial; a geometric sans heading with a humanist sans body (Montserrat + Open Sans) reads modern SaaS. Keep body text at 16px or larger and stick to two families per page. Test your palette against the pair with the Color Contrast Checker, and preview brand colors in the Palette Generator.

What makes a pairing work

The principle behind most successful pairings is contrast with a shared quality. Two typefaces that are similar but not identical look like a mistake, as though one failed to load — so the safest approach is either clear difference or deliberate unity.

The classic pairing of a serif with a sans-serif works because the difference is unmistakable while both can share proportions and era. Pairing two sans-serifs is harder and requires real difference in weight, width or character — a geometric sans against a humanist one can work; two neutral grotesques will not.

Superfamilies remove the problem entirely. Families designed with serif and sans variants share skeletons, proportions and metrics by construction, so they pair reliably and give a coherent system. Using one family across several weights is also a perfectly respectable choice, and often looks more considered than a mismatched pair.

Optical size, x-height and measure

The most common failure is not the pairing but the size relationship. Two typefaces set at the same point size rarely appear the same size, because x-height — the height of lowercase letters relative to capitals — varies enormously. A typeface with a large x-height looks noticeably bigger than one with a small x-height at identical point size, so pairings need optical adjustment rather than matching numbers.

Typefaces designed for display use have tighter spacing and finer details that fail at body size; text faces have more open spacing and sturdier forms that look clumsy very large. Using a display face for body copy is the most reliable way to make a page tiring to read.

Line length matters at least as much as typeface choice. The long-standing guidance of 45 to 75 characters per line exists because the eye loses its place returning to the start of an over-long line. Line height should rise with line length — around 1.5 for body text is a reasonable default, tightening for headings, where the default 1.2 or lower usually looks better than body line height.

Loading fonts without hurting the page

Every web font is a render-blocking-ish resource that delays text becoming visible, so restraint is a performance decision as much as an aesthetic one. Two families at two or three weights each is a sensible ceiling; loading five weights of two families is a common and expensive mistake, since each weight is a separate file.

Use font-display: swap so text renders immediately in a fallback and swaps when the web font arrives — the alternative is invisible text while the font loads. That swap causes a layout shift if the fallback's metrics differ, which is what size-adjust, ascent-override and related @font-face descriptors exist to fix: tune a local fallback to match the web font's metrics and the swap becomes nearly invisible.

Subsetting is the largest saving available. A full font file covers character sets most sites never use, and subsetting to Latin alone routinely cuts the file by more than half. Self-hosting with preload on the critical font, in WOFF2, avoids a third-party connection and is generally faster than loading from a font service. Variable fonts are worth considering where you need several weights, since one file covers a continuous range.

Reading the two numbers under the controls

A pairing you cannot read is not a pairing, so the previewer measures two things live. The first is the WCAG contrast ratio of the text against the background you set — computed on the composited colour, since the body copy carries slight transparency and measuring the raw value would flatter the result by a couple of tenths. The threshold moves with the type: WCAG treats 24px, or 18.66px at 700 and above, as large text and drops the requirement from 4.5:1 to 3:1, which is why a heading can pass at a ratio a caption fails at.

The second is characters per line, measured rather than estimated — the width of the rendered paragraph divided by the advance width of a digit in the exact font, weight and size on screen. This is what the familiar 45-to-75 guidance is actually about, and it moves as soon as you change the body font, because a condensed face fits far more characters into the same ch measure than a wide one. The measure slider is in ch units for the same reason: one ch is the width of a zero in the current font, so a fixed ch value keeps the line length roughly constant across typefaces where a fixed pixel width would not.

The weight menus list only the weights the family actually ships. Asking Google Fonts for a weight a family does not have is not an error — the API quietly clamps to the nearest available face and the browser synthesises the rest, so a preview can show a convincing fake bold that the copied font-weight: 900 will never reproduce. Nine of the families here have fewer than three weights, and two — DM Serif Display and Yeseva One — ship a single 400.

Font pairing FAQ

What fonts go well together?

Reliable combinations: Playfair Display + Source Sans Pro (editorial), Montserrat + Open Sans (clean SaaS), Lora + Roboto (readable blog), Oswald + Merriweather (bold news). The tool ships these as one-click presets.

How many fonts should a website use?

Two families is the sweet spot — one for headings, one for body. Use weights and sizes within each family for hierarchy. Three or more families usually looks chaotic and slows the page down.

Can I check contrast and line length here?

Yes, both are measured live. Set your own text and background colours and the previewer shows the WCAG contrast ratio for the heading and the body separately, using the correct threshold for each size — 3:1 once type counts as large, 4.5:1 below that. Next to it is the real characters-per-line count for the rendered paragraph, which is the number the classic 45-to-75 guidance refers to.

Why are some weights missing from the menu?

Because that family does not ship them. Asking Google Fonts for a weight a family lacks does not fail — the API clamps to the nearest face and the browser fakes the rest, so you would be judging a synthesised bold that your copied font-weight will never reproduce. The menu lists only real weights, and families with a single weight show the menu disabled. DM Serif Display and Yeseva One are both 400-only.

Can I use the keyboard?

Yes. Type in either search box to filter, move through the results with the arrow keys, Enter to choose and Escape to close. Each name in the list is rendered in its own typeface so you can see a face before you pick it. Ctrl/+Z undoes any change.

Are Google Fonts free for commercial use?

Yes. All fonts on Google Fonts are open source under the SIL Open Font License or Apache License, free for commercial websites, apps and print.

Serif or sans-serif for body text?

Both work on modern screens. Sans-serif (Open Sans, Inter, Roboto) reads slightly better at small sizes; serif (Lora, Merriweather) gives long-form articles a bookish feel. Whichever you pick, 16px minimum and 1.5–1.7 line height.

Why do my two fonts look mismatched in size?

X-height differs between typefaces, so the same point size produces different apparent sizes. Adjust the heading and body size sliders optically until they look right rather than matching the numbers.

How many fonts is too many?

Two families at two or three weights each is a reasonable ceiling. Every weight is a separate file, so five weights across two families is a substantial performance cost — a variable font is a better answer if you need a range. The CSS this tool copies requests only the two weights you actually selected.