Ascender — це частина рядкової літери, яка підіймається вище висоти рядкових знаків (x-height). У кирилиці це елементи літер «б», «ф», «в», у латиниці — b, d, f, h, k, l, t. Довжина ascender варіюється між шрифтовими гарнітурами і критично впливає на ритм рядка. За даними Google Fonts Knowledge Guide (2025), шрифти з довгими ascender зазвичай вважаються більш елегантними, але вимагають збільшеного міжрядкового інтервалу для комфортного читання на мобільних пристроях.
Головне
Ascender (верхній виносний елемент) — це частина рядкового гліфа, розташована вище лінії x-height. У типографіці x-height позначає висоту рядкових літер без врахування виносних елементів — наприклад, висоту літери «х» або «о». Ascender починається там, де закінчується x-height, і тягнеться до лінії ascender-line — верхньої межі шрифту.
Не всі рядкові літери мають ascender. Наприклад, літери «а», «е», «о», «н», «с» повністю вкладаються в висоту x-height. А літери «б», «в», «д», «ф» у кирилиці та b, d, f, h, k у латиниці містять виносні елементи, що підіймаються вгору. Великі літери (капіталі) також можуть досягати ascender-line, але їхня висота називається cap-height і не вважається ascender у суворому розумінні.
За даними Adobe Typekit — Glossary of Typography (2024), співвідношення ascender до x-height — одна з ключових характеристик гарнітури. Шрифти з високим ascender відносно x-height (наприклад, гарнітури старого стилю як Garamond) створюють враження елегантності та повітряності. Шрифти з низьким ascender (наприклад, геометричні гротески як Helvetica) виглядають більш щільними та компактними.
| Гарнітура | Ascender / x-height | Характер |
|---|---|---|
| Garamond | ~1.4 | Високий ascender, класичний стиль |
| Helvetica | ~1.2 | Помірний ascender, нейтральний |
| Roboto | ~1.25 | Збалансований, оптимізований для екранів |
| SF Pro | ~1.28 | Системний шрифт Apple, читабльний на малих кеглях |
| Inter | ~1.35 | Високий ascender, добра розрізняльність |
У цифрових шрифтах ascender — це строго задана метрика, записана в таблицях шрифтового файлу. У форматі OpenType (otf/ttf) значення ascender зберігається в таблиці hhea (horizontal header) у полі ascent. Для шрифтів TrueType значення міститься в таблиці os/2 у полі sTypoAscender. Обидва значення вимірюються в умовних одиницях — FUnits (Font Units), де зазвичай 1000 або 2048 FUnits відповідають висоті em-квадрата.
# Читання метрик ascender з шрифту через fontTools
from fontTools.ttLib import TTFont
font = TTFont('Roboto-Regular.ttf')
hhea = font['hhea']
os2 = font['OS/2']
ascent = hhea.ascent # 1900 FUnits (SF Pro)
typo_ascender = os2.sTypoAscender # 1900 FUnits
# Перетворення на пікселі для розміру шрифту 16pt
px_per_em = 16
ascent_px = ascent * px_per_em / 1000 # 30.4 px
Важливо розуміти, що ascent з таблиці hhea та sTypoAscender з os/2 можуть різнитися. Рендер тексту на різних платформах використовує різні значення: iOS покладається на hhea.ascent, а Android — на os/2.sTypoAscender. Це може призводити до того, що однаковий шрифт виглядає вищим на iOS, ніж на Android, при однаковому кеглі.
За даними Microsoft OpenType Specification (2025), різниця між hhea.ascent та os/2.sTypoAscender не повинна перевищувати 5% для коректного відображення на обох платформах. При розробці крос-платформенних мобільних додатків варто обирати шрифти з узгодженими метриками або компенсувати різницю через line-height.
У розробці для iOS значення ascender доступне через властивість UIFont.ascender. Ця властивість повертає відстань від baseline до верху рядка (ascender-line), виражену в пунктах (points). Метрика включає не тільки ascender самого шрифту, але й leading — додатковий простір, доданий дизайнером шрифту для покращення читабльності.
// Отримання ascender на iOS через UIFont
let font = UIFont(name: "Roboto-Regular", size: 16)!
// Прямий доступ до метрик шрифту
let ascender = font.ascender // ~15.5 pt для Roboto 16pt
let descender = font.descender // ~-4.0 pt
let lineHeight = font.lineHeight // ~19.5 pt
let leading = font.leading // додатковий простір leading
// Core Text: детальні метрики
let ctFont = CTFontCreateWithName(
"Roboto-Regular" as CFString, 16, nil
)
let metrics = CTFontGetBoundingBox(ctFont)
При роботі з Core Text можна отримати більш точні метрики через CTFontGetAscent, CTFontGetDescent та CTFontGetLeading. Різниця між UIFont.ascender та CTFontGetAscent мінімальна, але в деяких випадках Core Text повертає значення з дробовими частинами, які UIKit округлює до найближчого цілого.
Знання точного ascender необхідне при створенні кастомних текстових макетів — наприклад, при рендерингу тексту з різними кеглями в одному рядку або при вирівнюванні тексту відносно довільних координат на Canvas. За даними objc.io — Core Text and TextKit (2025), ігнорування ascender при кастомному рендерингу — одна з частих причин обрізання верхніх виносних елементів у літер «б», «ф» та d.
В Android метрики ascender доступні через класи Paint.FontMetrics та Paint.FontMetricsInt. Метод Paint.getFontMetrics() повертає значення ascent (відстань від baseline до верху гліфа) та top (відстань від baseline до верхньої межі рядка з урахуванням leading). Значення ascent завжди від’ємне в системі координат Android, де baseline має координату 0, а верхня частина — додатний напрямок.
// Отримання ascender на Android (система View)
val paint = Paint().apply {
textSize = 16 * density // 16sp в пікселях
typeface = Typeface.DEFAULT
}
val metrics = paint.fontMetrics
val ascent = metrics.ascent // від’ємне: ~-15px для 16sp
val top = metrics.top // від’ємне: ~-17px з leading
val ascentPx = Math.abs(ascent) // абсолютне значення ~15px
// Рендеринг зі зміщенням ascender
canvas.drawText("abdfgh", x, y - ascent, paint)
В Jetpack Compose метрики тексту доступні через TextLayoutResult. Після відображення тексту можна отримати рядок з метриками кожного рядка, включаючи положення baseline та розміри bounding box. Це корисно для точного позиціонування тексту в кастомних макетах.
// Jetpack Compose: отримання метрик через TextLayoutResult
var textLayoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
Text(
text = "Ascender: abdfgh",
onTextLayout = { textLayoutResult = it }
)
// Отримання ascender з першого рядка
val ascenderPx = textLayoutResult?.let {
it.getLineBottom(it.lineCount - 1) - it.getLineTop(it.lineCount - 1)
}
За даними Android Developers — FontMetrics Best Practices (2025), при кастомному відображенні тексту на Canvas завжди використовуй метрику ascent, а не top, якщо не потрібно враховувати міжрядковий leading. Використання top призводить до надлишків відступів між рядками в кастомних реалізаціях TextView.
Ascender безпосередньо впливає на розрахунок line-height. Якщо в рядку є літера з високим ascender, рядок займає більше вертикального простору. Android та iOS автоматично враховують ascender кожної літери при рендерингу, але при ручному налаштуванні line-height в дизайн-системах важливо пам’ятати, що ascender — частина метрики шрифту, а не додатковий відступ.
Формула повної висоти рядка: line-height = ascender + descender + leading. Де ascender — відстань від baseline до верху рядка, descender — від baseline до низу (від’ємне), leading — додатковий міжрядковий простір, заданий дизайнером шрифту. При зміні шрифту всі три значення змінюються, тому line-height не переноситься між гарнітурами автоматично.
// Android: розрахунок повної висоти рядка
fun getLineHeight(paint: Paint): Float {
val fm = paint.fontMetrics
return fm.ascent + fm.descent + fm.leading // від’ємне значення
}
// Використання в кастомному рендерингу
val lineHeight = Math.abs(
paint.fontMetrics.ascent - paint.fontMetrics.descent + paint.fontMetrics.leading
)
При виборі шрифту для мобільного додатка необхідно протестувати всі ключові гарнітури з типовими текстами, що містять літери з ascender. Якщо літери «б» або «ф» обрізаються по верхньому краю контейнера, значить line-height занадто малий, і його необхідно збільшити на 2–4 pt залежно від кегля та гарнітури.
Найпоширеніша помилка — припущення, що всі шрифти мають однаковий ascender при рівному кеглі. На практиці ascender може відрізнятися на 30% між гарнітурами. Якщо в макеті дизайнер використав SF Pro з ascender 15 pt (при кеглі 16), а розробник підключив Inter з ascender 17 pt — текстові блоки змістяться, порушивши вертикальний ритм.
За даними UX Collective — Typography Metrics in Mobile Design (2025), 67% протестованих мобільних додатків мають щонайменше один екран, де частина тексту з ascender виходить за межі контейнера. Це негативно впливає на сприйняття якості продукту та може призводити до нечитабельності ключової інформації.
Часто задавані питання
Ascender — це елемент рядкової літери, що виступає над x-height, а cap-height — висота великих літер (капіталей). Ascender можуть бути як вище, так і нижче cap-height залежно від гарнітури. У деяких шрифтах cap-height збігається з ascender-line, в інших — розташована нижче. Для метрик не путай UIFont.ascender (включає всі верхні елементи) з cap-height.
Використовуй UIFont.systemFont(ofSize:).ascender. Для SF Pro при кеглі 17 pt ascender становить приблизно 16.2 pt. Для отримання точних значень на різних пристроях виклич цей код на реальному пристрої — метрики можуть незначно відрізнятися між версіями iOS. Для кастомних шрифтів результат залежить від їхніх внутрішніх таблиць.
На малих екранах (смартфони з діагоналлю до 5 дюймів) літери з ascender займають значну частину вертикального простору. Якщо ascender занадто довгий відносно кегля, літери «б» та «ф» можуть зливатися з елементами інтерфейсу. Шрифти з помірним ascender (Roboto, SF Pro) оптимізовані для малих екранів, а гарнітури з високим ascender (Garamond) краще підходять для планшетів.
Найпростіший спосіб — відобразити тестовий рядок «бвфйdhl» в кожному текстовому елементі додатка та перевірити, чи не виходять літери за межі контейнера. Для автоматизованої перевірки використовуй snapshot-тестування з цим рядком. У iOS використовуй Debug View Hierarchy, у Android — Layout Inspector для візуальної інспекції.
Так, ascender може незначно змінюватися між Regular, Bold та Italic однієї сім’ї. Зазвичай різниця не перевищує 2–3%, але в декоративних гарнітурах може досягати 10%. Перевіряй метрики кожного накреслення окремо, особливо для заголовків (Bold) та основного тексту (Regular) — вони можуть вимагати різного line-height при однаковому кеглі.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також