The Invisible Art of Typography
How the smallest details shape the way we read, think, and feel
Typography is the craft of endowing human language with a durable visual form,
writes Robert Bringhurst at the opening of The Elements of Typographic Style. It is not merely the selection of a typeface — it is the orchestration of space, rhythm, contrast, and detail that transforms raw text into a reading experience. When done well, typography is invisible; when done poorly, it is all you see.
The Foundations: Measure, Leading & Scale
The measure — the length of a line of text — is perhaps the single most important factor in comfortable reading. Robert Bringhurst, in The Elements of Typographic Style1, recommends 45–75 characters per line for single-column text, with 66 characters (including spaces) widely regarded as ideal. Too short a measure causes the eye to jump back too frequently; too long, and the reader loses their place on the return sweep.
Leading2 — the vertical space between baselines — must be calibrated to both the typeface’s x-height and the measure. A generous measure demands more leading; a compact measure can tolerate less. The default line-height: normal in CSS typically resolves to roughly 1.2, but body text at comfortable measures generally benefits from values between 1.5 and 1.7. The relationship is not linear — it is a matter of feel, tested against the texture of the specific typeface at the specific size.
A modular typographic scale provides coherent sizing relationships. Rather than choosing arbitrary sizes like 14px, 18px, 22px, one might use a scale based on a ratio — say, the perfect fourth (1.333) or the augmented fourth (1.414). From a 1rem base, a perfect-fourth scale yields:
| Use | Step | Size |
|---|---|---|
| Captions, footnotes | −1 | 0.75rem |
| Body text | 0 | 1rem |
| H4, lead-ins | +1 | 1.333rem |
| H3 | +2 | 1.777rem |
| H2 | +3 | 2.369rem |
| H1 | +4 | 3.157rem |
Micro-Typography: The Details That Matter
Beyond the macro decisions of size and spacing lies the realm of micro-typography — the fine details that distinguish competent typesetting from exceptional craft. These are the details that most readers never consciously notice, yet their absence creates a subtle but persistent sense that something is off.
Ligatures & Contextual Alternates
In many typefaces, certain letter combinations create visual collisions. The sequence fi is the classic example: the dot of the i and the terminal of the f may overlap or create an awkward gap. Ligatures — single glyphs replacing these problematic pairs — solve this elegantly3. Common ligatures include fi, fl, ff, ffi, and ffl. OpenType’s liga feature enables standard ligatures, while dlig unlocks discretionary ones — decorative ligatures like ct and st that add character but may reduce readability if overused.
Contextual alternates (calt) allow glyphs to adapt to their neighbours. A well-designed script font uses contextual alternates extensively so that connecting strokes flow naturally, but even text faces use them — adjusting the shape of letters when they appear next to round or diagonal neighbours.
Figures: Old-Style vs. Lining
Most readers never think about the style of their numerals, but the distinction matters enormously. Lining figures (0123456789) share a uniform height, aligning with capital letters; they suit tables, ISBNs, and other tabular data. Old-style figures (0123456789) have ascenders and descenders — the 3, 4, 5, 7, and 9 dip below the baseline — and blend harmoniously into running text, much as lowercase letters do.
In CSS, these are controlled via the font-variant-numeric property:
/* Old-style figures for body text */
body { font-variant-numeric: oldstyle-nums proportional-nums; }
/* Lining, tabular figures for data tables */
table { font-variant-numeric: lining-nums tabular-nums; }
Small Caps, Abbreviations & Acronyms
Strings of capital letters — NATO, UNESCO, HTML, CSS — disrupt the even texture of body text. They shout. True small caps, drawn at a weight and proportion that match the lowercase, restore harmony. The CSS property font-variant-caps: all-small-caps requests these from the font; the critical word is true — synthesised small caps (simply scaled-down capitals) are thinner and lighter than their surroundings, defeating the purpose entirely4.
When combined with a slight letter-spacing increase (0.05em–0.1em), true small caps for abbreviations create a polished, professional texture. Compare:
The HTML specification maintained by the W3C defines the structure of DOM elements.
The HTML specification maintained by the W3C defines the structure of DOM elements.
The Texture of Text
Experienced typographers speak of text having colour — not hue, but the overall greyness of a text block as seen from a distance5. Even colour comes from consistent spacing, appropriate weight, and balanced proportions. Uneven colour — caused by rivers of white space, inconsistent word spacing, or poorly kerned letter pairs — fatigues the reader even when they cannot articulate why.
Kerning, the adjustment of space between specific pairs of letters, is handled automatically by most modern fonts via the kern OpenType feature. The CSS property font-kerning: normal (or equivalently, font-feature-settings: "kern" 1) enables this. Compare unkerned to kerned: AV AV, To To, Wa Wa. Without kerning the bounding boxes are placed mechanically; with it, the V tucks under the A and the o nests against the T.
Hanging Punctuation & Optical Alignment
A pull-quote or block-quote that begins with a quotation mark presents a subtle alignment problem. The visual weight of the text does not start at the quotation mark — it starts at the first letter. hanging-punctuation: first in CSS addresses this, though browser support remains limited as of . In its absence, a negative text-indent achieves a similar effect:
blockquote p::first-letter {
margin-left: -0.4em; /* Approximate; adjust per typeface */
}
Hyphenation & Justification
Justified text can be beautiful or terrible — the difference lies entirely in the quality of the hyphenation and word-spacing algorithms. CSS’s text-align: justify combined with hyphens: auto and a proper lang attribute enables browser-level hyphenation. The results in are serviceable but still inferior to TeX’s paragraph-level optimisation. For critical work, properties like hyphenate-limit-chars (e.g., 6 3 2 — minimum word length 6, minimum characters before the break 3, after 2) offer finer control.
Vertical Rhythm & the Baseline Grid
In music, rhythm is what makes a piece feel right
even when you cannot explain why. Typography has its own rhythm — the baseline grid. When all text elements (body, headings, captions, block quotes) snap to a shared vertical grid, the page acquires a sense of order and calm. The grid interval is typically the body text’s line-height.
Maintaining vertical rhythm in CSS requires discipline. Every margin, padding, and border must be a multiple of the baseline unit. A heading with font-size: 2rem and line-height: 1.2 occupies 2.4rem of vertical space; if the baseline grid is 1.6rem, the heading needs a bottom margin of 0.8rem to land back on the grid (2.4 + 0.8 = 3.2 = 2 × 1.6).
Use the Vertical Rhythm toggle above to visualise the baseline grid on this page. Notice how body paragraphs, headings, and block quotes all align — or fail to align — with the grid lines.
OpenType: The Hidden Treasure
Modern OpenType fonts can contain thousands of glyphs and dozens of features, most of which go entirely unused because software does not enable them by default. A partial inventory of features relevant to web typography:
kern- Pair kerning — adjusts spacing between specific letter pairs. Essential; should always be enabled.
liga- Standard ligatures (fi, fl, ff). Enabled by default in most browsers.
dlig- Discretionary ligatures (ct, st). Decorative; use sparingly.
onum/lnum- Old-style vs. lining figures. See the Figures section above.
pnum/tnum- Proportional vs. tabular figures. Proportional for running text; tabular for aligned columns.
smcp- Small capitals. Vital for abbreviations and acronyms in body text.
c2sc- Capitals to small caps. Converts uppercase letters already typed as capitals.
frac- Diagonal fractions. Turns sequences like 1/2 and 3/4 into proper fraction glyphs: ½, ¾.
ordn- Ordinals. Renders 1st, 2nd, 3rd with proper ordinal glyphs from the font — no fake superscripts required.
ss01–ss20- Stylistic sets. Font-specific alternate designs — a single-storey a, a tailless l, a round y.
swsh- Swash capitals and alternates. Decorative flourishes for display use.
- Custom variable axes
- Some variable fonts ship registered axes (
wght,opsz) and custom ones — tag names in UPPERCASE to mark them as outside the OpenType spec. Fraunces, for example, exposesSOFT(softness of terminals) andWONK(a flag for quirkier alternates). Switch to Fraunces + IBM Plex Mono in the toolbar and compare: Hamburgefonts — the g, a, and e swap to softer, more wonkish variants. Custom axes are addressed viafont-variation-settings: "SOFT" 100, "WONK" 1— the only placefont-variation-settingsis the right tool over a dedicated property.
Dark Mode & Colour Contrast
Typography does not exist in a vacuum — it lives on a background. In dark mode, the relationship between text weight and background luminance inverts. Light text on a dark background appears heavier than dark text on a light background at the same font-weight, a phenomenon called irradiation. Compensate by reducing the font weight slightly or increasing letter-spacing. The WCAG 2.2 standard requires a contrast ratio of at least 4.5:1 for body text and 3:1 for large text (above 18pt or 14pt bold).
Toggle the Dark Mode button above and observe how the type colour, weight adjustments, and spacing respond. Good dark-mode typography is not simply an inversion — it is a recalibration.
Bringing It All Together
The difference between setting some text in a nice font
and crafting typography is the accumulation of dozens of small, intentional decisions. No single property transforms the reading experience — but together, they compound. Proper ligatures eliminate visual snags. Old-style figures blend into prose. Small caps tame abbreviations. A baseline grid creates subconscious order. Kerning prevents letter-pair gaps. Hyphenation smooths the right rag. Hanging punctuation aligns optical edges.
Use the Crafted Typography toggle above to switch between the styled and unstyled versions of this page. The text is identical; only the CSS changes. Notice how the “unstyled” version — using only a typeface, basic sizing, and default spacing — feels subtly but unmistakably different: less polished, less comfortable, less considered.
That difference is the craft of typography.