// csstahak/ · 04 z 10

Typografie

font-family, font-size, font-weight, line-height, letter-spacing, text-transform, text-decoration, text-align, white-space — vše o textu v CSS.

font-family

Rodina písma

Vždy font stack: preferovaný → záložní → generický. Variable fonts = jeden soubor pro všechny váhy.

inherit

Specifikuje font. Vždy dejte font stack — záložní fonty pokud hlavní není dostupný. Generická rodina (sans-serif, serif, monospace) musí být vždy poslední. Variable fonts = jeden soubor pro všechny váhy a styly — výrazně menší stahování.

// Systémový font stack = rychlostSystémový font stack: žádné stahování, uživatel vidí font který zná ze systému. Výborný pro aplikace. Google Fonts jsou populární alternativa — pohodlné, ale přidávají HTTP request. Variable fonts = kompromis (jeden soubor).
Generické rodiny
sans-serif serif monospace cursive fantasy system-ui
Živá ukázka

sans-serif — čistý moderní text

serif — tradiční s patkami

monospace — kód, terminál

system-ui — systémový font

  • Vždy generická rodina na konci jako fallback
  • font-display: swap zabrání neviditelnosti textu
  • Variable fonts: font-weight: 100 900 v @font-face
  • woff2 = nejmenší a nejpodporovanější formát
Příklady
CSS
/* Google Fonts */
@import url("https://fonts.googleapis.com/
  css2?family=Inter:wght@400;500;700");
body { font-family: 'Inter', sans-serif; }

/* Systémový font stack (doporučeno) */
body {
  font-family:
    -apple-system,
    BlinkMacSystemFont,
    'Segoe UI',
    Roboto,
    'Helvetica Neue',
    Arial,
    sans-serif;
}

/* Monospace stack pro kód */
code, pre {
  font-family:
    'JetBrains Mono',
    'Fira Code',
    Consolas,
    'Courier New',
    monospace;
}

/* Variable font — jeden soubor */
@font-face {
  font-family: 'Inter';
  src: url('Inter.woff2') format('woff2');
  font-weight: 100 900; /* rozsah vah */
  font-style: normal;
  font-display: swap; /* zabrání FOIT */
}

/* Víc fontů na jedné stránce */
h1, h2, h3 {
  font-family: 'Playfair Display', serif;
}
body {
  font-family: 'Source Sans Pro', sans-serif;
}
font-size

Velikost písma

rem pro přístupnost, em pro komponenty, clamp() pro fluid typography bez media queries.

inherit

rem = relativní k root (html) font-size — preferováno pro přístupnost (respektuje user nastavení prohlížeče). em = relativní k rodiči (hnízdí!). px = pevné (přepíše user preference). clamp() = fluid typography bez media queries.

// px přepíše user nastavení!Uživatelé mohou v prohlížeči nastavit větší základní font (16px → 20px) pro lepší čitelnost. font-size: px toto ignoruje. font-size: rem respektuje toto nastavení — font roste spolu s uživatelovou preferencí. WCAG doporučuje rem.
Hodnoty
1rem (16px) em (relativní k rodiči) px (pevné) vw (viewport width) % (relativní) clamp(min, val, max) smaller / larger
Živá ukázka — clamp() fluid

clamp(1rem, 2.5vw, 1.5rem) — mění se s šířkou okna

clamp(1.5rem, 5vw, 3rem) — fluid nadpis

  • rem respektuje user nastavení (WCAG)
  • 1rem = 16px default (user může změnit)
  • em hnízdí — em uvnitř em je komplexní
  • clamp() = fluid bez media queries
  • Minimum body font-size: 16px pro čitelnost
Příklady
CSS
/* REM — doporučeno */
body  { font-size: 1rem; }     /* 16px */
h1    { font-size: 2.5rem; }   /* 40px */
h2    { font-size: 1.875rem; } /* 30px */
small { font-size: 0.875rem; } /* 14px */

/* Fluid typography s clamp */
h1 {
  font-size: clamp(1.75rem, 5vw, 3.5rem);
  /* min: 28px, preferred: 5vw, max: 56px */
}

p {
  font-size: clamp(1rem, 1.2vw, 1.125rem);
  /* Jemně roste s viewportem */
}

/* EM pro komponenty (škáluje s rodiče) */
.btn {
  font-size: 1rem;
  padding: 0.75em 1.5em; /* roste s btn font-size */
}
.btn-large { font-size: 1.25rem; }
/* padding se automaticky přizpůsobí! */

/* Typografická škála s CSS proměnnými */
:root {
  --text-xs: clamp(0.75rem, 1vw, 0.875rem);
  --text-sm: clamp(0.875rem, 1.2vw, 1rem);
  --text-base: clamp(1rem, 1.5vw, 1.125rem);
  --text-lg: clamp(1.125rem, 2vw, 1.25rem);
  --text-xl: clamp(1.25rem, 2.5vw, 1.5rem);
  --text-2xl: clamp(1.5rem, 4vw, 2rem);
  --text-3xl: clamp(1.875rem, 5vw, 3rem);
}
font-size: 1rem — respektuje user prefs
font-size: 16px — přepíše user prefs
font-weight

Tučnost písma

100–900 numericky. 400 = normal, 700 = bold. Načtěte jen potřebné váhy z Google Fonts.

inherit

Numerické hodnoty 100–900 (krok 100). Klíčová slova: normal (400), bold (700), bolder, lighter. Variable fonts podporují libovolnou hodnotu 1–1000. Načtěte jen váhy které používáte — každá váha = extra HTTP request nebo větší soubor.

// Variable fonts a font-weightKlasické fonty: každá váha = separátní soubor (400, 700...). Variable font: jeden soubor podporuje libovolnou váhu v rozsahu (např. 100–900). Animovatelné! font-weight: 400; transition: font-weight 0.3s; = plynulá změna tučnosti.
Hodnoty
100 (Thin) 200 (ExtraLight) 300 (Light) 400 (Regular) 500 (Medium) 600 (SemiBold) 700 (Bold) 800 (ExtraBold) 900 (Black)
Živá ukázka

300 — Light: lehký text pro doplňkový obsah

400 — Regular: základní čtecí váha

500 — Medium: mírně zdůrazněný

600 — SemiBold: tlačítka, labely

700 — Bold: nadpisy, důležitý text

800 — ExtraBold: display nadpisy

  • Načtěte jen váhy které reálně používáte
  • Variable font: libovolná hodnota, jeden soubor
  • bolder/lighter = relativní k rodiči
  • Variable font font-weight lze animovat!
Příklady
CSS
/* Google Fonts — specifikovat váhy */
@import url(".../css2?family=Inter:wght@300;400;500;600;700");

body    { font-weight: 400; }
.label  { font-weight: 500; }
.btn    { font-weight: 600; }
h1, h2  { font-weight: 700; }
.display { font-weight: 800; }

/* Variable font — animovatelné */
@font-face {
  font-family: 'Inter';
  src: url('Inter-Variable.woff2')
    format('woff2');
  font-weight: 100 900;
}

/* Hover efekt na font-weight */
.nav-link {
  font-weight: 400;
  transition: font-weight 0.15s;
}
.nav-link:hover { font-weight: 600; }
/* Pozor: může způsobit layout shift! */
/* Řešení: font-variation-settings nebo */
/* -webkit-text-stroke místo weight */
line-height

Výška řádku (leading)

Bezjednotkové hodnoty jsou nejlepší — dědí se správně. 1.5–1.7 pro text, 1.1–1.2 pro nadpisy.

inherit

Bezjednotkové hodnoty (1.5) jsou nejlepší — jsou násobkem font-size a dědí se správně na children. Hodnoty s jednotkami (px, em) jsou fixní a neškálují s font-size children. WCAG doporučuje minimálně 1.5 pro čtecí text.

// Proč bezjednotkovéline-height: 1.5 = 1.5× font-size elementu. line-height: 24px = vždy 24px bez ohledu na font-size. Pokud child má font-size: 2rem a parent line-height: 24px, řádkování bude příliš těsné. Bezjednotkové se přepočítá pro každý element.
Doporučené hodnoty
normal 1.0 (tlačítka, nadpisy) 1.2 (nadpisy) 1.5 (WCAG minimum pro text) 1.7 (pohodlné čtení)
Živá ukázka

line-height: 1 — velmi těsné, obtížně čitelné pro delší text

line-height: 1.5 — WCAG minimum, přijatelné pro čtecí text

line-height: 1.7 — pohodlné čtení, vzdušný text pro delší obsah

  • Bezjednotkové hodnoty = dědí se správně
  • 1.5 = WCAG AA minimum pro čtecí text
  • 1.1–1.2 pro nadpisy (větší font potřebuje méně)
  • 1.0 pro tlačítka (chceme přesnou výšku)
Příklady
CSS
/* Globální nastavení */
body { line-height: 1.6; }

/* Nadpisy — těsnější */
h1, h2, h3 { line-height: 1.2; }
h4, h5, h6 { line-height: 1.3; }

/* Tlačítka */
.btn { line-height: 1; }

/* Článkový text */
.article-body { line-height: 1.75; }

/* WCAG minimum */
.accessible-text { line-height: 1.5; }

/* ❌ Fixní px — neškáluje */
p { line-height: 24px; }

/* ✅ Bezjednotkové — škáluje */
p { line-height: 1.6; }
letter-spacing

Prostrkání písmen (tracking)

Mezery mezi znaky. em hodnoty škálují s font-size. Uppercase textu: +0.05–0.15em.

inherit

letter-spacing mění mezery mezi znaky. em hodnoty jsou nejlepší — škálují s font-size. Velká písmena: +0.05–0.15em pro lepší čitelnost. Velké nadpisy: záporné hodnoty (moderní estetika). Nepoužívejte px — nešká luje.

// Uppercase + letter-spacingVerzálky jsou obtížně čitelné v těsném prostrkání. Přidejte letter-spacing: 0.08–0.15em pro uppercase texty. Klasický UI vzor: malé uppercase labely s letter-spacing pro elegantní look.
Hodnoty
normal 0.05em (mírné) 0.1em (label) -0.02em (tight heading) -0.04em (display)
Živá ukázka

Normal — žádné prostrkání

LABEL — 0.1em uppercase

Tight Heading -0.03em

SPACED · · ·

  • Em hodnoty škálují s font-size
  • Uppercase: +0.08–0.15em
  • Velké nadpisy: -0.02 až -0.05em
  • word-spacing pro mezery mezi slovy
Příklady
CSS
/* Uppercase label — klasický UI */
.label {
  text-transform: uppercase;
  letter-spacing: 0.1em;
  font-size: 0.75rem;
  font-weight: 600;
}

/* Tight heading — moderní */
.hero-title {
  font-size: clamp(2rem, 8vw, 6rem);
  font-weight: 800;
  letter-spacing: -0.03em;
}

/* Display — velký text */
.display-text {
  font-size: 4rem;
  letter-spacing: -0.05em;
}

/* Monospace kód */
code {
  font-family: monospace;
  letter-spacing: 0.02em; /* trochu více prostoru */
}

/* word-spacing */
.spaced-words {
  word-spacing: 0.3em;
}
text-transform

Transformace textu

uppercase, lowercase, capitalize. Jen vizuální — DOM text se nemění. Screen reader čte originál.

inherit

text-transform mění vizuální podobu textu. DOM text zůstává nezměněn — screen reader přečte originální text. capitalize = první písmeno každého slova. fullWidth = proporcionální → monospace (pro CJK písma).

Hodnoty
none uppercase lowercase capitalize full-width
Živá ukázka

none — Původní text zůstane

UPPERCASE — celé velké

lowercase — celé malé

Capitalize — První Písmeno Každého Slova

  • Screen reader čte originální DOM text
  • capitalize = první písmeno každého slova (ne jen věty)
  • Uppercase pro labely, navigaci, tlačítka UI
  • Nepoužívejte lowercase pro jména (estetické, ne sémantické)
Příklady
CSS
/* Uppercase badges a labely */
.badge, .tag {
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-size: 0.7rem;
  font-weight: 700;
}

/* Navigace */
.nav a {
  text-transform: uppercase;
  font-size: 0.8rem;
  letter-spacing: 0.05em;
}

/* Nadpisy jako uppercase */
h6 {
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: #888;
}

/* Dynamická data zachovají case v DOM */
/* Screen reader: "Jana Nováková"      */
/* Vizuálně:     "JANA NOVÁKOVÁ"       */
.username {
  text-transform: uppercase;
}
text-decoration

Dekorace textu

underline, line-through, overline. Shorthand pro -line, -color, -style, -thickness. text-underline-offset pro mezeru.

inherit

text-decoration shorthand pokrývá: -line (underline, line-through, overline), -color (barva nezávislá na color), -style (solid, wavy, dotted, dashed, double), -thickness. text-underline-offset posune podtržení dál od textu.

Hodnoty -line
none underline line-through overline
Hodnoty -style
solid wavy dotted dashed double
Živá ukázka

Klasické podtržení

Wavy žluté podtržení

Přeškrtnutý text (cena)Nová cena

Dotted podtržení pro zkratky

  • text-decoration-color nezávislý na color
  • text-underline-offset: 3px = mezera od textu
  • wavy = hezký efekt pro zkratky a spellcheck
  • line-through pro přeškrtnuté ceny v e-shopu
Příklady
CSS
/* Čistý odkaz */
a {
  text-decoration: none;
  color: #2563EB;
}
a:hover {
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* Vlastní stylované podtržení */
.fancy-link {
  text-decoration: underline;
  text-decoration-color: #F59E0B;
  text-decoration-style: wavy;
  text-decoration-thickness: 2px;
  text-underline-offset: 4px;
}

/* Shorthand */
.link {
  text-decoration: underline dotted #888;
}

/* Přeškrtnutá cena */
.old-price {
  text-decoration: line-through;
  color: #999;
}

/* Zkratka s dotted */
abbr[title] {
  text-decoration: underline dotted;
  cursor: help;
}

/* Přepsat barvu dekorace */
.highlight {
  color: #333;
  text-decoration-color: #F59E0B;
  text-decoration-line: underline;
}
text-align & white-space

Zarovnání a zalomení textu

text-align: left/center/right/justify. white-space: nowrap pro ellipsis, pre-wrap pro zachování mezer.

inherit

text-align zarovná text horizontálně. white-space řídí jak se text zalamuje a jak se zachází s bílými znaky. nowrap zabrání zalomení — nutné pro text-overflow: ellipsis. pre-wrap zachová mezery a zalomí na konci.

text-align hodnoty
left right center justify start end
white-space hodnoty
normal nowrap ← pro ellipsis pre pre-wrap pre-line break-spaces
  • text-align: start/end = RTL-friendly alternativa
  • justify vytváří nerovnoměrné mezery — opatrně
  • nowrap + overflow: hidden + text-overflow: ellipsis = zkrácení
  • pre-wrap pro user-generated content (zachová enter)
Příklady
CSS
/* Text zarovnání */
.left    { text-align: left; }
.center  { text-align: center; }
.right   { text-align: right; }
.justify { text-align: justify; }

/* RTL-friendly (moderní) */
.content { text-align: start; }

/* Ellipsis — zkrácení textu */
.truncate {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 200px;
}

/* Víceřádkový ellipsis */
.clamp-2 {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* Zachovat formátování (komentáře, kód) */
.user-content {
  white-space: pre-wrap;
  word-break: break-word;
}

/* Nepřerušit text (tagline, nadpis) */
.no-break { white-space: nowrap; }

/* word-break pro dlouhá slova / URL */
.url-display {
  word-break: break-all;
  overflow-wrap: anywhere;
}
// Kompletní typografický systém — copy-paste základ
CSS — typografický základ pro každý projekt
/* === TYPOGRAFICKÝ ZÁKLAD === */

/* 1. Reset a box-sizing */
*, *::before, *::after { box-sizing: border-box; }

/* 2. Globální typografie */
:root {
  /* Fonty */
  --font-sans: -apple-system, BlinkMacSystemFont,
    'Segoe UI', Roboto, sans-serif;
  --font-mono: 'JetBrains Mono', Consolas, monospace;

  /* Fluid velikosti */
  --text-sm:   clamp(0.875rem, 1vw,   0.9375rem);
  --text-base: clamp(1rem,     1.2vw, 1.0625rem);
  --text-lg:   clamp(1.125rem, 1.5vw, 1.25rem);
  --text-xl:   clamp(1.25rem,  2vw,   1.5rem);
  --text-2xl:  clamp(1.5rem,   3vw,   2rem);
  --text-3xl:  clamp(2rem,     5vw,   3.5rem);
}

/* 3. Base styly */
body {
  font-family: var(--font-sans);
  font-size: var(--text-base);
  line-height: 1.6;
  color: #1a1a2e;
  -webkit-font-smoothing: antialiased;
}

/* 4. Nadpisy */
h1, h2, h3, h4, h5, h6 {
  line-height: 1.2;
  font-weight: 700;
  letter-spacing: -0.02em;
}
h1 { font-size: var(--text-3xl); }
h2 { font-size: var(--text-2xl); }
h3 { font-size: var(--text-xl); }
h4 { font-size: var(--text-lg); }

/* 5. Odstavce */
p { margin-bottom: 1em; }
p:last-child { margin-bottom: 0; }

/* 6. Kód */
code {
  font-family: var(--font-mono);
  font-size: 0.875em;
  background: #f3f4f6;
  padding: 0.1em 0.3em;
  border-radius: 3px;
}

/* 7. Utility třídy */
.text-sm    { font-size: var(--text-sm); }
.text-lg    { font-size: var(--text-lg); }
.font-bold  { font-weight: 700; }
.uppercase  { text-transform: uppercase; letter-spacing: 0.08em; }
.truncate   { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
← 03 Grid 04 / 10 — Typografie 05 Barvy →