Descender je část malého písmene, která klesá pod základní linii (baseline) fontu. V latinské abecedě jsou typickými písmeny s descenderem „g", „j", „p", „q", „y". Délka descenderu určuje spodní výstupek fontu a je kritická pro výpočet řádkování: bez dostatečného prostoru pod baseline budou písmena s descenderem zasahovat do následujícího řádku. Podle Material Design Type Scale Guidelines (2025) je nedostatečné zohlednění descenderu jednou z hlavních příčin kolize řádků ve víceřádkovém textu na mobilních zařízeních.
Hlavní body
Descender je část glyfu umístěná pod linií baseline. Zatímco hlavní tělo písmene stojí na baseline, descender se za ní rozprostírá a vytváří charakteristickou siluetu fontu. V latinských fontech mají písmena „g", „j", „p", „q", „y" spodní výstupky.
Hloubka descenderu popisuje vzdálenost od baseline ke spodní hranici glyfu (descender-line). V kvalitních fontech je tato vzdálenost vyvážená: příliš krátký descender ztěžuje rozpoznání písmen s descenderem, příliš dlouhý vytváří nadměrný prázdný prostor mezi řádky a snižuje hustotu textu. Různé rodiny písem vykazují významné rozdíly v délce descenderu.
| Písmo | Descender / em-size | Příklad písmen s descenderem |
|---|---|---|
| SF Pro | ~0.22 | g, p — vyvážený výstupek |
| Roboto | ~0.24 | g, p — mírný descender |
| Playfair Display | ~0.30 | g, q — dlouhé dekorativní prvky |
| Inter | ~0.26 | g, p — znatelně pod baseline |
| Noto Sans | ~0.20 | g — krátký descender, kompaktní |
Podle Google Fonts Metrics Guide (2025) je descender považován za optimální, když jeho hloubka činí 20–25 % plné velikosti em (1000 FUnits). Hodnoty pod 15 % ztěžují rozlišení písmen s descenderem a nad 30 % vyžadují povinné zvýšení line-height, aby se předešlo kolizím řádků.
V digitálních fontech je descender uložen jako záporná hodnota v tabulkách metrik. Ve formátu OpenType jsou to pole hhea.descent (tabulka hhea) a sTypoDescender (tabulka OS/2). Obě hodnoty jsou záporné, protože se měří od baseline směrem dolů. Pro TrueType se používá tabulka OS/2 s polem usWinDescent — jeho hodnota je kladná, ale označuje stejnou metriku.
# Čtení descenderu z fontu pomocí fontTools
from fontTools.ttLib import TTFont
font = TTFont('Roboto-Regular.ttf')
hhea = font['hhea']
os2 = font['OS/2']
descent_hhea = hhea.descent # -500 FUnits (Roboto)
typo_descender = os2.sTypoDescender # -500 FUnits
win_descent = os2.usWinDescent # 500 (positive value)
# Převod na pixely pro velikost fontu 16pt
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000 # 8 px
Kritický rozdíl mezi platformami: iOS používá hhea.descent pro vykreslování, zatímco Android — sTypoDescender z OS/2. Pokud se tyto hodnoty liší (což se stává u nekvalitně nastavených fontů), stejný text se zobrazí s různým řádkováním na iOS a Androidu. Rozdíl 100 FUnits (přibližně 1.6 px při velikosti 16 pt) je již vizuálně patrný.
Podle Microsoft OpenType Specification v1.9 (2025) by pro správné vykreslování napříč platformami měly být hodnoty hhea.descent a sTypoDescender stejné s přesností 50 FUnits. Při výběru fontu pro mobilní aplikaci je vhodné to zkontrolovat pomocí fontTools nebo podobného nástroje.
V iOS je hodnota descenderu dostupná prostřednictvím vlastnosti UIFont.descender. Tato vlastnost vrací záporné číslo udávající vzdálenost od baseline ke spodnímu okraji fontu (včetně descenderu). Například pro SF Pro při velikosti 17 pt je hodnota descenderu přibližně -4.2 pt. Čím větší je absolutní hodnota, tím delší jsou spodní výstupky fontu.
// Získání descenderu na iOS pomocí UIFont
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender // ~ -4.2 pt pro SF Pro 17pt
let ascender = font.ascender // ~ 16.2 pt
let lineHeight = font.lineHeight // ~ 20.4 pt
// Vlastní vykreslování s odsazením descenderu
let attrString = NSAttributedString(
string: "Sample text with letter p and y",
attributes: [.font: font]
)
// Core Text: získání ohraničujícího rámečku s descenderem
let ctFont = CTFontCreateWithName(
"SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont) // ~4.2 pt
Při použití TextKitu (NSTextStorage, NSLayoutManager) je descender automaticky zohledněn v lineFragmentPadding a lineFragmentRect. Při vlastním vykreslování přes Core Graphics (draw(in:)) je však nutné nezávisle upravit souřadnice přidáním absolutní hodnoty descenderu ke spodnímu okraji kontejneru. Pokud se tak nestane, písmena s descenderem překročí hranici vykreslování a budou oříznuta.
V Androidu jsou metriky descenderu dostupné přes Paint.FontMetrics.descent. Na rozdíl od iOS je hodnota descent kladná — jedná se o vzdálenost od baseline ke spodní hranici textu. Vlastnost FontMetrics.bottom zahrnuje nejen descender, ale také dodatečný prostor doporučený návrhářem fontu (leading). Pro přesné zohlednění pouze descenderu použijte descent, nikoli bottom.
// Získání descenderu na Androidu pomocí Paint
val paint = Paint().apply {
textSize = 17 * density
}
val metrics = paint.fontMetrics
val descent = metrics.descent // ~4.5 px pro 17sp
val bottom = metrics.bottom // ~5.0 px s leadingem
// Vlastní vykreslování s odsazením descenderu
val baseline = y
canvas.drawText("Příklad: gpq", x, baseline, paint)
// Spodní hranice s descenderem
val bottomBound = baseline + descent // správná spodní hranice
V Jetpack Compose lze descender získat přes TextLayoutResult. Metoda getLineBottom vrací Y souřadnici spodní hranice řádku, která již descender obsahuje. Při vlastním rozvržení řádků s různými velikostmi (např. cena se slevou a plná cena) poskytuje zarovnání podle baseline s ohledem na descender přesnější výsledek než zarovnání podle spodního okraje.
// Compose: kontrola spodní hranice textu
val text = "Text with descenders: gpq"
var layoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
Text(
text = text,
onTextLayout = { layoutResult = it },
modifier = Modifier.drawBehind {
layoutResult?.let { result ->
val lastLine = result.lineCount - 1
val bottom = result.getLineBottom(lastLine)
val top = result.getLineTop(lastLine)
// Kontrola, zda descender nepřesahuje hranice kontejneru
}
}
)
Podle Google Material Design — Typography Implementation (2025) je pro zabránění oříznutí descenderu v kontejnerech s pevnou výškou nutné přidat vertikální padding odpovídající alespoň descentu fontu, bez ohledu na přítomnost písmen s descenderem v aktuálním textu. Tím je zaručeno, že při dynamické výměně textu se rozhraní nerozbije.
Kolize řádků (line collision) — situace, kdy descender písmene horního řádku fyzicky protíná ascender písmene spodního řádku. V mobilních rozhraních je to patrné zejména u víceřádkových nadpisů, karet produktů a textových bloků s malým řádkováním. Problém se zhoršuje při použití fontů s dlouhým descenderem a malým line-height.
Minimální line-height zabraňující kolizím lze vypočítat podle vzorce: line-height = ascender + descender + 2 px rezerva. Pro SF Pro při velikosti 17 pt to dává line-height přibližně 22.4 pt (koeficient ~1.32). Pro Roboto při 16 sp — přibližně 1.35. Pokud je line-height nižší než tato hodnota, kolize jsou zaručeny v textech obsahujících písmena ze skupiny „g", „j", „p", „q", „y".
// iOS: výpočet minimálního line-height k zabránění kolizím
let font = UIFont.systemFont(ofSize: 17)
let minLineHeight = abs(font.ascender) + abs(font.descender) + 2.0
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.minimumLineHeight = minLineHeight
paragraphStyle.maximumLineHeight = minLineHeight
let attributedText = NSAttributedString(
string: "Text with p on first line\nand y on second line",
attributes: [
.font: font,
.paragraphStyle: paragraphStyle
]
)
Zvláště opatrní buďte při práci s dekorativními a ručně psanými fonty — jejich descender může dosahovat 35–40 % velikosti em. Takové fonty se zřídka používají pro hlavní text, ale mohou být aplikovány v nadpisech. I jediný výskyt písmene s dlouhým descenderem v nadpisu může způsobit kolizi se sousedním prvkem rozhraní.
Nejčastější chybou je oříznutí descenderu v tlačítkách a textových polích. Když nastavíme výšku tlačítka nebo textového pole rovnou line-height, bez zohlednění descenderu, písmena s descenderem se oříznou na spodním okraji. To je patrné zejména na systémových tlačítkách se zaoblenými rohy, kde descender může přesahovat hranici zaoblení.
Podle Nielsen Norman Group — Mobile Typography Research (2025) má 41 % mobilních aplikací alespoň jednu obrazovku, kde text s descenderem překračuje hranice komponenty. To vede ke snížení čitelnosti o 15 % a zvýšení doby dokončení úkolu uživatelem. Pravidelné testování s textem obsahujícím písmena „g", „j", „p", „q", „y" pomáhá odhalit tyto problémy v raných fázích vývoje.
Často kladené otázky
Baseline je vodorovná čára, na které stojí písmena, zatímco descender je část písmene nacházející se pod touto čárou. Baseline je pro řádek konstantou, descender je vlastností konkrétního písmene. Nezaměňujte tyto pojmy: baseline se používá pro zarovnání, zatímco descender ovlivňuje řádkování a vyžaduje pozornost při nastavování výšky kontejneru.
Použijte Paint.getFontMetrics().descent pro View systém nebo TextLayoutResult v Jetpack Compose. Na rozdíl od iOS je hodnota descent na Androidu kladná a ukazuje vzdálenost od baseline ke spodní hranici glyfu. Pro výpočet plné spodní hranice řádku přičtěte descent k Y souřadnici baseline.
Platformy používají různé tabulky metrik ze souboru fontu: iOS — hhea.descent, Android — os/2.sTypoDescender. Pokud se tyto hodnoty ve fontu liší, vykreslování se bude lišit. Vždy kontrolujte obě hodnoty pomocí fontTools. Kvalitní systémové fonty (SF Pro, Roboto, Noto) mají konzistentní metriky pro obě platformy.
Minimální line-height = ascender + descender + 2 px rezerva. Pro systémový font 17 pt na iOS je to přibližně 22.4 pt. Na Androidu pro 16 sp Roboto — přibližně 22 sp. Doporučuje se zaokrouhlit na nejbližší celé číslo a zkontrolovat testovacím řetězcem „gpq" — pokud nedochází ke kolizím, line-height je dostatečný.
Ano, ale s výhradami. Fonty s dlouhým descenderem (Playfair Display, dekorativní písma) jsou přijatelné pro nadpisy a akcidenční text, kde lze line-height zvýšit bez poškození designu. Pro hlavní text jsou preferovány fonty s descenderem 20–25 % velikosti em (SF Pro, Roboto, Inter), aby se neplýtvalo zbytečným vertikálním prostorem.
Závěry
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také