«Лігатура» в мобільній розробці — основи та застосування символьних з'єднань

Автор: IT Sectr Опубліковано: 2026-07-24 Час читання: 9 хв

Лігатура — це графічне з'єднання двох або більше символів в один типографічний знак для покращення читабельності та естетики тексту. Класичні приклади включають пари fi, fl, ff, ffi — де виступаючий елемент літери f зливається із сусіднім символом, запобігаючи візуальному конфлікту. У сучасній мобільній та веб-розробці лігатури керуються на рівні шрифту через OpenType-фічі та підтримуються на iOS, Android і в браузерах. За даними MDN Web Docs, CSS-властивість font-variant-ligatures дозволяє розробнику вмикати та вимикати різні типи лігатур: стандартні, discretionary (декоративні) та контекстні.

Головне

  • Лігатура — об'єднання кількох символів в один графічний елемент для покращення читабельності
  • Стандартні лігатури (fi, fl, ff) увімкнені за замовчуванням у професійних шрифтах
  • Discretionary лігатури (ct, st, sp) — декоративні, вмикаються опціонально
  • На iOS керуються через UIFontDescriptor з featureSettings для OpenType-фіч
  • У шрифтах для програмування лігатури об'єднують оператори: !=, >=, ->, =>

Що таке лігатура в типографіці

Лігатура — це типографічний прийом, при якому два або більше символів замінюються на один спеціально спроєктований знак. Основна мета лігатури — усунути візуальні конфлікти між сусідніми символами та покращити сприйняття тексту. У парі fi, наприклад, верхній виступ літери f стикається з точкою літери i — лігатура об'єднує їх в єдиний витончений символ.

Лігатури поділяються на обов'язкові (стандартні) та опціональні (декоративні). Стандартні лігатури — це пари, які зустрічаються в більшості шрифтів: fi, fl, ff, ffi, ffl. Вони вважаються необхідними для якісної типографіки та ввімкнені в шрифті за замовчуванням. Відповідно до OpenType Specification, стандартні лігатури кодуються тегом 'liga' і мають бути присутніми в будь-якому професійному шрифті.

Візуальний ефект: без лігатури пара fi виглядає як два окремі символи з небажаним дотиком. З лігатурою — як один гармонійний символ. Різниця особливо помітна у великих кеглях (заголовки, логотипи) і в тексті з великою кількістю повторюваних пар (наприклад, у німецькій мові з häufigen Buchstabenkombinationen).

Типи лігатур: стандартні, discretionary, контекстні

OpenType-шрифти підтримують кілька типів лігатур, кожен зі своїм тегом та призначенням. Стандартні (tag 'liga') — обов'язкові лігатури, ввімкнені в шрифті за замовчуванням. Вони покращують читабельність і не повинні вимикатися без вагомої причини. Містять пари fi, fl, ff, ffi, ffl та інші, специфічні для гарнітури.

Discretionary лігатури (tag 'dlig') — декоративні лігатури, які вмикаються опціонально на розсуд дизайнера. Вони не обов'язкові для читабельності й використовуються для стилізації тексту: ct, st, sp, Th, Qu та інші. Discretionary лігатури часто зустрічаються в шрифтах з історичним або каліграфічним характером — наприклад, у Garamond або Adobe Caslon. Застереження: надлишок discretionary лігатур погіршує читабельність, особливо для користувачів з дислексією.

Контекстні лігатури (tag 'clig') — лігатури, які залежать від оточення символу. Вони застосовуються лише за певних умов: якщо символ стоїть на початку або в кінці слова, після певного розділового знака тощо. Контекстні лігатури — просунута OpenType-фіча, яку підтримують не всі шрифти. Історичні лігатури (tag 'hlig') — застарілі лігатури, що імітують стиль стародруків (long s, &). Використовуються рідко, лише в історичних або стилізованих текстах.

Тип лігатуриOpenType тегПрикладиЗа замовчуванням
Стандартніligafi, fl, ff, ffiУвімкнено
Discretionarydligct, st, sp, ThВимкнено
КонтекстніcligЗалежить від позиціїУвімкнено
Історичніhliglong s, ct (історич.)Вимкнено

Рідкісні типи: існують також лігатури для математичного набору (tag 'dlig' для математичних символів) та лігатури ініціалів (drop caps) — але вони не використовуються в інтерфейсній типографіці та підтримуються лише спеціалізованими шрифтами.

Історія лігатур: від металевого набору до цифрових шрифтів

Лігатури з'явилися задовго до цифрової типографіки — ще в епоху металевого набору в XV столітті. Першодрукар Йоганн Гутенберг використовував лігатури для економії місця в рядках своєї 42-рядкової Біблії. Кожна літера була фізичним металевим блоком, і об'єднання двох символів в одну літеру економило свинець та спрощувало набір. Стандартні лігатури fi, fl, ffi, ffl — спадщина тієї епохи.

У фотонаборі (XX століття) лігатури втратили практичну функцію, але збереглися як естетичний елемент якісної типографіки. Дизайнери шрифтів продовжували включати лігатури у свої гарнітури, оскільки вони стали ознакою професіоналізму та уваги до деталей. В епоху цифрових шрифтів (PostScript, TrueType) лігатури реалізовувалися як окремі гліфи з програмною заміною.

OpenType (1996) став революцією: він ввів механізм GSUB (Glyph Substitution Table), який дозволяє автоматично замінювати послідовність символів на лігатуру без втручання користувача. GSUB підтримує контекстні заміни, умови та fallback-варіанти. Це дозволило шрифтам мати сотні лігатур, які вмикаються/вимикаються через теги. Сучасні шрифти — SF Pro, Roboto, Inter — підтримують OpenType-лігатури на всіх платформах: iOS, Android, macOS, Windows, веб.

Реалізація лігатур на iOS через UIFontDescriptor

На iOS лігатурами можна керувати через UIFontDescriptor з використанням атрибута featureSettings. Цей атрибут приймає масив словників, кожен з яких описує одну OpenType-фічу. Керування лігатурами через дескриптор — єдиний спосіб контролювати окремі типи лігатур, не зачіпаючи інші OpenType-фічі шрифту.

swift
let descriptor = UIFontDescriptor.preferredFontDescriptor(
    withTextStyle: .body
)

// Увімкнути discretionary лігатури
let ligatureDescriptor = descriptor.addingAttributes([
    .featureSettings: [
        [
            UIFontDescriptor.FeatureIdentifier: kLigaturesType,
            UIFontDescriptor.TypeIdentifier: kCommonLigaturesOnSelector
        ]
    ]
])

let font = UIFont(
    descriptor: ligatureDescriptor,
    size: 17
)

NSAttributedString також підтримує атрибут ligature: NSNumber. Значення 0 — вимкнути всі лігатури, 1 — увімкнути стандартні (за замовчуванням), 2 — увімкнути всі (включаючи discretionary). Однак атрибут ligature в NSAttributedString не дає тонкого контролю над типами лігатур — лише глобальне ввімкнення/вимкнення. Для вибіркового керування використовуйте UIFontDescriptor з featureSettings.

SwiftUI не надає прямого модифікатора для лігатур. Для керування лігатурами в SwiftUI створіть UIFont з потрібними налаштуваннями через UIFontDescriptor та використовуйте його через Font(descriptor:size:). Альтернативно — використовуйте AttributedString (iOS 15+) з атрибутом .ligature для NSMutableAttributedString в поданнях AppKit/UIKit.

swift
// SwiftUI з кастомними лігатурами через AttributedString
var attributedText: AttributedString {
    var text = AttributedString(
        "Effective typography with ligatures"
    )

    // Увімкнути всі лігатури для всього тексту
    text.ligature = .all

    return text
}

var body: some View {
    Text(attributedText)
}

Керування лігатурами в CSS та Android

У вебі лігатурами керують через CSS-властивість font-variant-ligatures, яка приймає ключові слова: common-ligatures (стандартні ввімкнено), no-common-ligatures (стандартні вимкнено), discretionary-ligatures, no-discretionary-ligatures, contextual, no-contextual. Властивість підтримується всіма сучасними браузерами з 2015 року. За замовчуванням браузери вмикають стандартні та контекстні лігатури.

css
/* Disable all ligatures for monospace */
code, pre {
    font-variant-ligatures: none;
}

/* Enable discretionary ligatures for headings */
.title-fancy {
    font-variant-ligatures:
        common-ligatures
        discretionary-ligatures
        contextual;
}

Android не має прямого API для керування лігатурами. На Android лігатури керуються на рівні шрифту та рушія рендерингу Minikin (Android 10+). Якщо шрифт містить OpenType-таблицю GSUB, лігатури застосовуються автоматично. Для вимкнення лігатур на Android використовуються кастомні Typeface, створені через Typeface.Builder, або препроцесинг тексту (заміна символів до відображення). Обмеження: на Android нижче 10 лігатури можуть працювати некоректно з деякими TTF-шрифтами.

Низькорівневий контроль: на всіх платформах можна використовувати CSS @font-face з параметром font-feature-settings для OpenType-фіч. Цей метод дає доступ до будь-яких OpenType-тегів, включаючи лігатури. Приклад: font-feature-settings: 'liga' 1, 'dlig' 1. Однак font-feature-settings — низькорівневий синтаксис, і MDN рекомендує використовувати font-variant-ligatures як вищорівневу альтернативу.

Лігатури в шрифтах для програмування

Особливий клас лігатур — програмістські лігатури, які об'єднують оператори та символи коду в більш читабельні знаки. Шрифти для програмування, такі як Fira Code, JetBrains Mono, Cascadia Code, включають discretionary лігатури для поширених операторів: != (стає ≠), >= (стає ≥), -> (стає стрілкою), => (стає товстою стрілкою), === (стає потрійним дорівнює).

Програмістські лігатури — спірна тема в спільноті розробників. Прихильники стверджують, що лігатури прискорюють читання коду, оскільки оператори сприймаються як єдині концепти. Дослідження (Kera et al., PLATEAU 2020) показало, що лігатури не впливають на швидкість читання коду, але суб'єктивно подобаються 67% розробників. Противники лігатур зазначають, що вони спотворюють код: символ != у редакторі відображається як ≠, але в текстовому файлі зберігається як два символи, що може заплутувати при колаборації.

Технічна реалізація: програмістські лігатури — це discretionary OpenType-лігатури (тег 'dlig'). Вони вимкнені за замовчуванням і вмикаються в редакторі коду через налаштування шрифту. Розробники, які використовують такі шрифти, мають налаштовувати редактор на ввімкнення discretionary лігатур. У терміналі (iTerm2, Windows Terminal) лігатури також підтримуються через налаштування шрифту. Сумісність: не всі редактори та термінали підтримують OpenType-лігатури. Перед вибором шрифту перевірте сумісність із вашим інструментарієм.

kotlin
// Приклад: операторні лігатури в JetBrains Mono
val isEqual = a != b  // != відображається як ≠
val arrow = x -> x + 1  // -> відображається як →
val range = 1 .. 10  // .. відображається як діапазон

Популярні шрифти з програмістськими лігатурами: Fira Code (перший масовий шрифт із лігатурами, 2015), JetBrains Mono (оптимізований для читання коду, 2020), Cascadia Code (від Microsoft, 2019), Iosevka (настроюваний шрифт із модульною системою лігатур). Кожен шрифт має свій набір лігатур — від 50 до 150+ замін. Рекомендація: починайте з Fira Code або JetBrains Mono — вони мають найкращу підтримку в редакторах та IDE.

Часті запитання

Як вимкнути лігатури на iOS?

Встановіть attribute ligature = 0 у NSAttributedString або використовуйте UIFontDescriptor з kCommonLigaturesOffSelector. У SwiftUI — створіть AttributedString з .ligature = .disabled.

Чим лігатура відрізняється від кернінгу?

Лігатура замінює два символи на один новий знак, змінюючи форму. Кернінг регулює відстань між символами, не змінюючи їхньої форми. Лігатура — графічне з'єднання, кернінг — просторова корекція.

Чи підтримує Android лігатури?

Так, починаючи з Android 10 (API 29). Minikin-рендеринг повністю підтримує OpenType GSUB-таблиці. На більш ранніх версіях підтримка залежить від виробника пристрою та версії шрифтового рушія.

Чи варто використовувати лігатури в інтерфейсі застосунку?

Для основного тексту достатньо стандартних лігатур (fi, fl, ff) — вони покращують читабельність і непомітні користувачеві. Discretionary лігатури використовуйте лише в заголовках або декоративному тексті, оскільки вони знижують читабельність довгих текстів.

Чому лігатури в коді відображаються не у всіх редакторах?

Редактор має підтримувати OpenType-тег 'dlig' і вміти відображати discretionary лігатури. VS Code, IntelliJ IDEA, Sublime Text підтримують. Старі термінали та редактори (nano, vim без GUI) — ні. Перевірте налаштування редактора: увімкніть font-ligatures.

Підсумки

  • Лігатура — об'єднання кількох символів в один графічний елемент для естетики та читабельності
  • Стандартні лігатури (fi, fl, ff) увімкнені за замовчуванням у професійних шрифтах
  • Discretionary лігатури (ct, st, sp) — декоративні, вмикаються через CSS font-variant-ligatures
  • На iOS керуються через UIFontDescriptor з featureSettings або атрибут ligature
  • У вебі керуються через font-variant-ligatures або font-feature-settings ('liga', 'dlig')
  • Програмістські лігатури (Fira Code, JetBrains Mono) об'єднують оператори: !=, >=, ->
  • Для інтерфейсної типографіки використовуйте лише стандартні лігатури — discretionary знижують читабельність

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також