Typography Principles for Designers Font Pairing, Hierarchy & Spacing
A practical audit for fixing type hierarchy, spacing, contrast, font pairing, and responsive behavior without turning every decision into a rule.
⚡ TL;DR
- Fix in this order: Hierarchy, spacing, contrast, then font personality. Most pages do not need a new typeface first.
- Use as a starting point: Keep the system small, constrain long lines, and test the actual content on real screens.
- Accessibility check: Measure contrast, zoom to 200%, and make sure user-defined text spacing does not break the layout.

Start with a five-minute type audit
If a page feels almost right, do not open the font menu yet. The problem is usually more basic: the levels are too similar, the text column is too wide, the spacing is cramped, or the contrast is doing less work than it looked like it would in Figma.
Audit the system in the order a reader experiences it. Structure first. Reading comfort second. Typeface personality last.
01
Blur the page
Can you still see the title, major sections, and next action? If everything becomes the same gray block, the hierarchy is too flat.
02
Read one paragraph
Use the real device and normal viewing distance. If you lose your place, inspect line length and line height before changing the font.
03
Count the text styles
Every distinct size, weight, color, and case treatment should have a job. Near-duplicates usually signal an unfinished system.
04
Check contrast and zoom
Measure the actual colors, then test at 200% zoom. A tasteful gray is not useful if the text disappears or the layout breaks.
05
Judge personality last
Only reconsider the typeface after the structure reads clearly. A new font cannot rescue weak hierarchy or cramped spacing.
The useful fix order
- 1.Hierarchy
- 2.Measure
- 3.Spacing
- 4.Contrast
- 5.Typeface
Fix hierarchy before you fix fonts
Hierarchy answers a simple question: what should someone notice first, second, and third? If every heading is large, every label is bold, and every card has its own style, the reader has to reconstruct the system for you.
Start with the smallest inventory that explains the page: a display or page title, a section heading, body text, and a small label or caption. Add a level only when the content has a real level to express.
A small system
Make the decision visible
Show the structure before the detail
Body text should feel quiet enough to read and strong enough to hold up on a real screen. The spacing around each level helps explain the relationship.
Supporting label
Check each level
- Role: What content belongs here?
- Difference: Is it clearly distinct from the level above and below?
- Consistency: Does the same role look the same everywhere?
- Restraint: Could two near-identical styles become one?
Treat a type scale as an inventory, not a law
A ratio can generate numbers. It cannot decide whether your product needs five text levels or whether a 52-pixel heading fits a German translation. Pick a short set of sizes that creates the distinctions your content needs, then test it with the longest real labels and headlines.
:root {
--text-label: 0.875rem;
--text-body: 1rem;
--text-subhead: 1.25rem;
--text-section: 1.75rem;
--text-display: clamp(2.25rem, 5vw, 4.5rem);
}Spacing, line height, and measure do most of the reading work
Type does not become readable because a formula says so. It becomes readable when the specific font, size, line length, contrast, and context work together. Use the numbers below as starting points, then adjust while reading the actual content.
Body line height
1.45–1.65
A useful web starting range. Fonts with a tall x-height may need less; dense or long-form reading may need more.
Text measure
Around 60–70ch
A practical starting width for paragraphs on larger screens. Narrow screens usually constrain the line naturally.
Heading rhythm
More above, less below
The heading should feel attached to the content it introduces, not stranded between two sections.
Good vs. Bad Spacing
Poor Spacing
Tight Headlines
This body text has insufficient line height making it hard to read comfortably. The cramped feeling makes users work harder to process the content.
No spacing between paragraphs creates a wall of text that's intimidating to scan or read.
Comfortable Spacing
Breathing Room
This body text uses 1.6 line height, making it comfortable to read. The relaxed spacing lets users process content without strain.
Proper paragraph spacing creates natural reading breaks and makes content feel approachable.
What WCAG actually says about text spacing
WCAG 2.2 does not require authors to set every paragraph to 1.5 line height. It requires the content to keep working when a user applies 1.5 line height, larger paragraph spacing, 0.12em letter spacing, and 0.16em word spacing.
Read WCAG 2.2 guidance for text spacingPair fonts with a job in mind
“These fonts look good together” is not a system. A second family should solve a problem: create a stronger editorial voice, make dense reading quieter, separate data from prose, or give display text a useful contrast.
If one family can create the hierarchy, use one. Consistency is not a lack of creativity. It gives the content a stable structure and leaves more room for color, imagery, and layout to carry personality.
One-family system
Inter Semibold
Inter Regular keeps the structure quiet, direct, and easy to maintain.
Editorial contrast
Newsreader
Source Sans 3 gives longer reading a neutral counterpoint.
Structured contrast
Space Grotesk
IBM Plex Sans keeps the body practical while the headings feel more distinct.
Before you commit to a pair
- • Give each family a specific role.
- • Test real names, prices, dates, and long headings.
- • Check every weight and style you plan to use.
- • Confirm the scripts and symbols your content needs.
- • Compare the pair at actual body and heading sizes.
- • Remove one family and see whether anything is lost.
Need combinations to try? Use the portfolio font-pairing guide, or preview your own words in the font-pairing tool. Treat both as a starting point, then come back to the real page.
Responsive and accessible type is type that survives change
The clean desktop frame is only one state. Text gets zoomed, translated, enlarged, replaced by user styles, and read on screens with very different widths and brightness. A type system is finished when it can absorb those changes without losing meaning or function.
Use flexible units with deliberate limits
Use rem units for a manageable scale and clamp() when a heading should grow between sensible minimum and maximum sizes.
h1 {
font-size: clamp(2.25rem, 6vw, 4.5rem);
line-height: 1.05;
max-width: 14ch;
}Test the states your canvas hides
- • 200% browser zoom on a narrow viewport.
- • The longest likely heading and navigation label.
- • Increased line, word, letter, and paragraph spacing.
- • Bright light, dark mode, and reduced contrast conditions.
- • A real screen reader heading list.
Contrast is measurable, but the threshold is not the finish line
WCAG 2.2 Level AA requires at least 4.5:1 contrast for normal text and 3:1 for large text. Check the actual foreground and background colors. Then test the weight and typeface in context, because two designs at the same ratio can still feel very different to read.
Fails AA (2.85:1)
This light gray does not reach the 4.5:1 minimum for normal text on white.
Passes AA (4.54:1)
This reaches the WCAG AA minimum for normal text on white. Test the typeface and weight in context.
Stronger (12.63:1)
This darker gray creates more contrast on white while staying slightly softer than black.
Use web fonts without turning them into a loading problem
A font file is part of the interface. It can delay text, shift the layout, or fail. Use WOFF2, request only the weights and character sets the page needs, and choose fallbacks that occupy similar space.
Do not preload every font. Preload only a truly critical file, and choose font-display based on the tradeoff you want. swap shows text quickly but can shift when the font arrives. optional avoids a late swap but may keep the fallback on a slow connection.
@font-face {
font-family: "Project Sans";
src: url("/fonts/project-sans-variable.woff2") format("woff2");
font-display: swap;
font-style: normal;
font-weight: 400 700;
}
body {
font-family: "Project Sans", ui-sans-serif, system-ui, sans-serif;
}Keep the font request boring
- • WOFF2 files only for modern-browser projects.
- • Only the weights and styles that appear on the page.
- • Character subsets that still cover real content and names.
- • A measured fallback that reduces layout shift.
- • One critical preload at most, unless testing proves more helps.
- • A network check instead of assuming the font is cheap.
Before you ship the type system
Do this on the rendered page, not only in the design file. A checklist is useful when it catches something you can fix, not when it produces a perfect score.
- A first-time reader can identify the page, sections, and next action without reading every word.
- Body text is comfortable on a real phone and a laptop, not only in the design canvas.
- Long text blocks have a deliberate maximum width instead of stretching across the screen.
- Headings have more separation from the previous section than from the text they introduce.
- Normal text reaches 4.5:1 contrast and meaning never depends on color alone.
- The layout still works at 200% zoom and with user-defined text spacing.
- Font files cover every language and symbol the product actually needs.
- Only the weights, styles, and font files used by the page are requested.
- Fallback fonts are close enough that loading does not destroy the layout.
- The type choices support the content instead of becoming the content.
Checklist done. Still not sure what matters most?
Upload the page or paste the URL. Your free First Read gives you a readiness verdict and the first typography move to consider.
Want to see the criteria before sending anything? Here is what the critique checks.
Standards and implementation sources
The practical ranges in this guide are starting points, not accessibility standards. These are the current primary references behind the requirements and font-loading guidance:
Everything You Need to Know
Quick answers to help you get started
Go deeper only where you need it
Choosing type for a portfolio? Open Typography for Portfolios. Need combinations to test? Use the Font Pairings Guide or the live font-pairing tool.
Building the implementation? The CSS Typography Guide covers the code-level details without repeating the design audit.
Share this resource

Written by
Nikki KippleProduct Designer & Design Instructor
Designer, educator, founder of The Crit. I've spent years teaching interaction design and reviewing hundreds of student portfolios. Good feedback shouldn't require being enrolled in my class — so I built a tool that gives it to everyone. Connect on LinkedIn →
Too close to the page to judge the type?
Send one page or screenshot. Your free First Read gives you a readiness verdict and the first move to consider.
Continue Reading
All resources →Get one actionable portfolio tip every week. No fluff.
Short reads you can use on your site. Unsubscribe anytime.