Descender a kisbetűk azon része, amely a betűtípszer alapvonala (baseline) alá nyúlik. A latin ábécében tipikus descenderrel rendelkező betűk „g", „j", „p", „q", „y". A descender hossza meghatározza a betűtípszer alsó lenyúló elemét, és kritikus a sorköz kiszámításához: elegendő hely nélkül a baseline alatt a descenderrel rendelkező betűk beleütköznek a következő sorba. A Material Design Type Scale Guidelines (2025) szerint a descender elégtelen figyelembevétele a sorok ütközésének (collision) egyik fő oka a több soros szövegben mobileszközökön.
Főbb pontok
Descender a glif azon része, amely a baseline alatt található. Míg a betű fő teste a baseline-on áll, a descender azon túlnyúlik, jellegzetes sziluettet adva a betűtípusnak. A latin betűtípusokban a „g", „j", „p", „q", „y" betűk rendelkeznek alsó lenyúló elemekkel.
A descender mélysége a baseline-tól a glif alsó határáig (descender-line) tartó távolságot írja le. Minőségi betűtípusokban ez a távolság kiegyensúlyozott: a túl rövid descender megnehezíti a descenderrel rendelkező betűk felismerését, a túl hosszú pedig felesleges üres helyet teremt a sorok között, csökkentve a szöveg sűrűségét. A különböző betűcsaládok jelentős eltéréseket mutatnak a descender hosszában.
| Betűtípus | Descender / em-size | Példabetűk descenderrel |
|---|---|---|
| SF Pro | ~0.22 | g, p — kiegyensúlyozott lenyúlás |
| Roboto | ~0.24 | g, p — mérsékelt descender |
| Playfair Display | ~0.30 | g, q — hosszú díszítő elemek |
| Inter | ~0.26 | g, p — észrevehetően a baseline alatt |
| Noto Sans | ~0.20 | g — rövid descender, kompakt |
A Google Fonts Metrics Guide (2025) szerint a descender akkor tekinthető optimálisnak, ha mélysége a teljes em méret (1000 FUnits) 20–25%-a. A 15% alatti értékek megnehezítik a descenderrel rendelkező betűk megkülönböztetését, a 30% felettiek pedig a line-height kötelező növelését teszik szükségessé a sorütközések elkerülése érdekében.
A digitális betűtípusokban a descender negatív értékként van tárolva a metrika táblákban. Az OpenType formátumban ez a hhea.descent mező (hhea tábla) és az sTypoDescender (OS/2 tábla). Mindkét érték negatív, mivel a baseline-tól lefelé mérve kerülnek meghatározásra. A TrueType esetében az OS/2 táblát használják az usWinDescent mezővel — ennek értéke pozitív, de ugyanazt a metrikát jelöli.
# Descender kiolvasása a betűtípusból a fontTools segítségével
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)
# Átalakítás pixelekre 16pt betűméret esetén
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000 # 8 px
A platformok közötti kritikus különbség: az iOS a hhea.descent használja a rendereléshez, míg az Android az OS/2 sTypoDescender mezőjét. Ha ezek az értékek eltérnek (ami gyengén konfigurált betűtípusoknál előfordul), ugyanaz a szöveg eltérő sorközzel jelenik meg iOS-en és Androidon. A 100 FUnits különbség (16 pt méretnél kb. 1.6 px) már vizuálisan észrevehető.
A Microsoft OpenType Specification v1.9 (2025) szerint a helyes platformok közötti rendereléshez a hhea.descent és az sTypoDescender értékeinek 50 FUnits pontossággal egyenlőnek kell lenniük. Mobileszközökre szánt betűtípus kiválasztásakor ezt fontTools vagy hasonló segédprogram segítségével érdemes ellenőrizni.
iOS rendszerben a descender értéke az UIFont.descender tulajdonságon keresztül érhető el. Ez a tulajdonság negatív számot ad vissza, amely a baseline-tól a betűtípszer alsó széléig (a descendert is beleértve) mutatja a távolságot. Például az SF Pro esetében 17 pt méretnél a descender értéke kb. -4.2 pt. Minél nagyobb a szám abszolút értéke, annál hosszabbak a betűtípszer alsó lenyúló elemei.
// Descender lekérése iOS-en UIFont segítségével
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender // ~ -4.2 pt az SF Pro 17pt esetében
let ascender = font.ascender // ~ 16.2 pt
let lineHeight = font.lineHeight // ~ 20.4 pt
// Egyedi renderelés descender eltolással
let attrString = NSAttributedString(
string: "Sample text with letter p and y",
attributes: [.font: font]
)
// Core Text: határoló doboz lekérése descenderrel
let ctFont = CTFontCreateWithName(
"SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont) // ~4.2 pt
A TextKit (NSTextStorage, NSLayoutManager) használatakor a descender automatikusan figyelembe van véve a lineFragmentPadding és lineFragmentRect értékekben. Azonban egyedi rendereléskor a Core Graphics (draw(in:)) segítségével manuálisan kell beállítani a koordinátákat, hozzáadva a descender abszolút értékét a konténer alsó margójához. Ha ez nem történik meg, a descenderrel rendelkező betűk kilépnek a renderelési határon és levágódnak.
Android rendszerben a descender metrikái a Paint.FontMetrics.descent segítségével érhetők el. Az iOS-szel ellentétben itt a descent értéke pozitív — ez a baseline-tól a szöveg alsó határáig tartó távolság. A FontMetrics.bottom tulajdonság nemcsak a descendert foglalja magában, hanem a betűtervező által ajánlott további helyet (leading) is. A descender pontos figyelembevételéhez a descent értéket használjuk, ne a bottom-ot.
// Descender lekérése Androidon Paint segítségével
val paint = Paint().apply {
textSize = 17 * density
}
val metrics = paint.fontMetrics
val descent = metrics.descent // ~4.5 px 17sp esetében
val bottom = metrics.bottom // ~5.0 px leadinggel
// Egyedi renderelés descender eltolással
val baseline = y
canvas.drawText("Példa: gpq", x, baseline, paint)
// Alsó határ descenderrel
val bottomBound = baseline + descent // helyes alsó határ
Jetpack Compose keretrendszerben a descender a TextLayoutResult segítségével érhető el. A getLineBottom metódus visszaadja a sor alsó határának Y koordinátáját, amely már tartalmazza a descendert. Különböző méretű sorok (pl. akciós ár és teljes ár) egyedi elrendezésekor a baseline szerinti igazítás a descender figyelembevételével pontosabb eredményt ad, mint az alsó szél szerinti igazítás.
// Compose: szöveg alsó határának ellenőrzése
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)
// Annak ellenőrzése, hogy a descender nem lépi túl a konténer határait
}
}
)
A Google Material Design — Typography Implementation (2025) szerint a fix magasságú konténerekben a descender levágódásának megakadályozásához legalább a betűtípus descent értékével megegyező függőleges paddinget kell hozzáadni, függetlenül attól, hogy a jelenlegi szöveg tartalmaz-e descenderrel rendelkező betűket. Ez garantálja, hogy a szöveg dinamikus cseréjekor a felület nem fog elromlani.
Sorütközés (line collision) — az az állapot, amikor a felső sor betűjének descendere fizikailag keresztezi az alsó sor betűjének ascendert. Mobil felületeken ez különösen észrevehető a több soros címsorokban, termékkártyákban és kis sorközű szövegdobozokban. A probléma súlyosbodik hosszú descenderrel rendelkező betűtípusok és kis line-height használatakor.
Az ütközéseket megakadályozó minimális line-height a következő képlettel számítható ki: line-height = ascender + descender + 2 px tartalék. Az SF Pro esetében 17 pt méretnél ez kb. 22.4 pt line-height-ot ad (coeffiens ~1.32). A Roboto esetében 16 sp-nél — kb. 1.35. Ha a line-height kisebb ennél az értéknél, az ütközés garantált a „g", „j", „p", „q", „y" csoportba tartozó betűket tartalmazó szövegekben.
// iOS: minimális line-height kiszámítása az ütközések elkerüléséhez
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
]
)
Különösen óvatosnak kell lenni a dekoratív és kézírásos betűtípusokkal — ezek descendere elérheti az em méret 35–40%-át. Az ilyen betűtípusokat ritkán használják fő szöveghez, de címsorokban alkalmazhatók. Már egyetlen hosszú descenderrel rendelkező betű megjelenése egy címsorban ütközést okozhat a szomszédos felületi elemmel.
A leggyakoribb hiba a descender levágódása a gombokban és szövegmezőkben. Amikor a gomb vagy szövegmező magasságát a line-height-dal egyenlőre állítjuk, a descender figyelembevétele nélkül, a descenderrel rendelkező betűk az alsó szélen levágódnak. Ez különösen észrevehető a lekerekített sarkú rendszergombokon, ahol a descender túlléphet a lekerekítés határán.
A Nielsen Norman Group — Mobile Typography Research (2025) szerint a mobilalkalmazások 41%-ának van legalább egy olyan képernyője, ahol a descenderrel rendelkező szöveg túllép a komponens határain. Ez 15%-os olvashatóság csökkenéshez és a felhasználói feladat végrehajtási idejének növekedéséhez vezet. Rendszeres tesztelés a „g", „j", „p", „q", „y" betűket tartalmazó szöveggel segít az ilyen problémák korai felismerésében a fejlesztés során.
Gyakran ismételt kérdések
Baseline az a vízszintes vonal, amelyen a betűk állnak, míg a descender a betűnek az e vonal alatt található része. A baseline egy sorra nézve állandó, a descender egy adott betű tulajdonsága. Ne keverjük ezeket a fogalmakat: a baseline az igazításhoz használatos, míg a descender a sorközt befolyásolja, és figyelmet igényel a konténer magasságának beállításakor.
Használjuk a Paint.getFontMetrics().descent metódust a View-rendszerben vagy a TextLayoutResult-ot a Jetpack Compose-ban. Az iOS-szel ellentétben Androidon a descent értéke pozitív, és a baseline-tól a glif alsó határáig tartó távolságot mutatja. A sor teljes alsó határának kiszámításához adjuk hozzá a descent értékét a baseline Y koordinátájához.
A platformok különböző metrika táblákat használnak a betűtípszer fájljából: iOS — hhea.descent, Android — os/2.sTypoDescender. Ha ezek az értékek a betűtípusban eltérnek, a renderelés különbözni fog. Mindig ellenőrizzük mindkét értéket a fontTools segítségével. A minőségi rendszerbetűtípusok (SF Pro, Roboto, Noto) összehangolt metrikákkal rendelkeznek mindkét platformon.
A minimális line-height = ascender + descender + 2 px tartalék. A 17 pt rendszerbetűtípus esetében iOS-en ez kb. 22.4 pt. Androidon 16 sp Roboto esetében — kb. 22 sp. Ajánlott a legközelebbi egész számra kerekíteni és ellenőrizni a „gpq" tesztkarakterlánccal — ha nincs ütközés, a line-height elegendő.
Igen, de megszorításokkal. A hosszú descenderrel rendelkező betűtípusok (Playfair Display, dekoratív betűcsaládok) elfogadhatók címsorokhoz és akcidens szöveghez, ahol a line-height növelhető a dizájn károsítása nélkül. Fő szöveghez a 20–25% em méretű descenderrel rendelkező betűtípusok (SF Pro, Roboto, Inter) ajánlottak a felesleges függőleges hely megtakarítása érdekében.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is