text-box-edge и text-box-trim: доступны во всех браузерах

• css

Введение

Недавно вышел Файерфокс 154, а это значит, что text-box-trim и text-box-edge доступны во всех браузерах:

text-box
133
154
18.2

Думаю, пришло время напомнить, что это за свойства и в каких случаях они полезны. А заодно порадуемся, что они заработали везде.

Чуть-чуть про отрисовку текста

Исторически занимаемое текстом место не равно физическому размеру букв в пикселях, а несколько больше. Дальше мы переходим к лайн-боксам, разным базовым линиям и метрикам шрифтов. Если кратко – то над и под буквами есть свободное место, которое зарезервировано под выносные элементы и подобное. И место это настраивается в шрифта, а значит, оно разное для разных пользователей.

Abcde

Мы не можем полагаться, что у всех людей символы будут визуально рисоваться в одном и том же месте. Или можем?

text-box-edge и text-box-trim

Свойство text-box-trim позволяет задать обрезку пустого места вокруг букв, тем самым изменяя занимаемую высоту и выравнивание текста. Значение none задано по дефолту, а trim-start/trim-end/trim-both задают обрезку сверху/снизу/с двух сторон.

.text {
    text-box-trim: trim-both;
}

Однако его одного не хватит, чтобы что-то изменить, нужно задать и text-box-edge. Оно задаёт, по какой именно линии нужно обрезать прямоугольники с текстом. Для верхней линии можно указать значения text, ideographic, ideographic-ink, cap и ex, а для нижней – text, ideographic, ideographic-ink и alphabetic. Значения ideographic и ideographic-ink актуальны для китайского/корейского/японского (CJK) языков, поэтому остановимся на остальных значениях.

text в обоих вариантах использования означает обычное поведение, с ним ничего не обрежется.

cap означает верхнюю границу прописной (большой, заглавной) буквы.

ex отсылает к соответствующей единице измерения и означает верхнюю границу строчной (маленькой) буквы.

alphabetic означает нижнюю границу букв (как заглавных, так и строчных).

Abcde
.text {
    text-box-edge: ex alphabetic;
}

Значения можно задать через пробел (сначала верхнее, затем нижнее). Если значения совпадают, можно указать одно ключевое слово.

Также есть сокращение через свойство text-box, которое объединяет оба рассмотренных свойства. В нём сначала нужно указать значение для text-box-trim, а затем для text-box-edge:

.text {
    text-box: trim-both ex alphabetic;
}

Примеры использования

Наверно, основным примером, который касается данных свойств, является выравниванием иконки относительно текста. vertical-align: middle в данном случае не подходит (так как не является визуальным центром), другие способы будут опираться на параметры конкретного шрифты и сломаются в случае фолбека или замены:

something

Схожий, но немного другой пример. Цифра или буква внутри маленького кружка. Исторически лучшего результата тут можно было добиться с помощью SVG, так как иначе текст мог смотреться или выше, или ниже нужного (в зависимости от шрифта, браузера, зума, операционной системы и так далее):

5

Выравнивание текста. Если по какой-то причине текст должен чётко попадать в нужные пиксели или иметь одинаковый отступ сверху и снизу над буквами,то text-box отлично справится с задачей:

company

Похожий пример: если нужно воспроизвести какой-то текст средствами CSS (например, внешний вид платёжной карты), то “лишние отступы”, особенно в случае разных шрифтов, могут привести к неточному позиционированию текста.

ascent-override и descent-override

В директиве @font-face можно задать дескрипторы ascent-override и descent-override, которые управляют аналогичными отступами.

ascent-override
87
89
preview

Есть и важные отличия. text-box удобнее для описанных выше примеров за счёт работы в отдельных селекторах, в то время как дескрипторы для @font-face работают на весь шрифт целиком и в первую очередь предназначены для выравнивания шрифтов между друг другом (для случаев смены фолбечного шрифта на кастомный).

Итого

Наконец-то до нас добирается text-box. Подождём пару лет, и в инструментарии будет ещё одна возможность, которая иначе делалась бы костыльно или неточно.

Кстати, о хотелках. Там на горизонте замаячило свойство, которое может сократить ширину многострочного текста до реальной (а не быть равной ширине контейнера). Вот тогда вообще все мечты сбудутся.

Обсудить в Telegram

Почитать ещё посты

  • CSS Link Parameters, что ты такое?
  • calc-mix() и progress() – что за функции и в чём разница?
  • Автоматические размеры полей с field-sizing
  • text-fit: свойство, которое дождались
  • Декораторы отступов, или свойства, которые у нас уже давно были