Сложнейшая проблема компьютерных наук: центрирование

Заявляю: «Мы, как цивилизация, разучились использовать центрирование». Ну то есть мы, конечно, знаем, как это делать — очень просто.

Хорошо, пусть не сразу, но в конечном итоге он находит решение. Я лишь хочу сказать, что все знают, как делать центрирование. Это просто. И если вы запутаетесь, то информация всегда под рукой.

Тем не менее, когда мы смотрим на реальные приложения, то видим, что эти методы не используются. Вот пример:

Сложнейшая проблема компьютерных наук: центрирование, image #1

Или вот:

Сложнейшая проблема компьютерных наук: центрирование, image #2

Или даже такой:

Сложнейшая проблема компьютерных наук: центрирование, image #3

То есть между «знанием как» и фактическим применением этого знания явно возникает какой-то пробел.

Сложнейшая проблема компьютерных наук: центрирование, image #4

▍ Шрифты

В шрифтах происходит одно из самых серьёзных нарушений. Плохо выровненный текст встречается повсюду. Приведу примеры.
Его не может выровнять ни Apple:

Сложнейшая проблема компьютерных наук: центрирование, image #5

Ни Microsoft:

Сложнейшая проблема компьютерных наук: центрирование, image #6

Ни GitHub:

Сложнейшая проблема компьютерных наук: центрирование, image #7

Ни Valve:

Сложнейшая проблема компьютерных наук: центрирование, image #8

Ни Slack:

Сложнейшая проблема компьютерных наук: центрирование, image #9

Ни Telegram:

Сложнейшая проблема компьютерных наук: центрирование, image #10

Ни Google Maps:

Сложнейшая проблема компьютерных наук: центрирование, image #11

Честно говоря, я могу с ходу привести бесконечный список примеров криво выровненных надписей кнопок:

Сложнейшая проблема компьютерных наук: центрирование, image #12

Думаю, смысл вы поняли. Многочисленные компании — крупные и малые, в нативной или веб-среде — имеют проблемы с выравниванием текста.

▍ Высота строки

Если вам недостаточно примеров со шрифтами, то очередной проблемой является высота строки.
Это довольно сложная тема, и для лучшего её понимания советую каноническую статью Винсента де Оливейры Deep dive CSS: font metrics, line-height and vertical-align.
Вот как это выглядит на практике. Slack:

Сложнейшая проблема компьютерных наук: центрирование, image #13

Notion:

Сложнейшая проблема компьютерных наук: центрирование, image #14

Airbnb:

Сложнейшая проблема компьютерных наук: центрирование, image #15

YouTube:

Сложнейшая проблема компьютерных наук: центрирование, image #16

Выровнять два элемента в разных контейнерах практически невозможно:

Сложнейшая проблема компьютерных наук: центрирование, image #17

Многие пробовали:

Сложнейшая проблема компьютерных наук: центрирование, image #18

Но немногие преуспели:

Сложнейшая проблема компьютерных наук: центрирование, image #19

Помешать может CSS (разные элементы управления имеют разные значения, которые нужно отменить, прежде чем начать выравнивание):

Сложнейшая проблема компьютерных наук: центрирование, image #20

И здесь нет лёгкого решения. Просто закатываем рукава и ныряем в спецификации.

▍ Иконки

Иконки подобны небольшим прямоугольникам, вставляемым в текст. Поэтому здесь актуальны все те же проблемы, которые связаны с текстом и высотой строки. Выравнивание иконок рядом с текстом реально непростая задача.
Atom:

Сложнейшая проблема компьютерных наук: центрирование, image #21

Бывший Twitter:

Сложнейшая проблема компьютерных наук: центрирование, image #22

iOS:

Сложнейшая проблема компьютерных наук: центрирование, image #23

Mozilla:

Сложнейшая проблема компьютерных наук: центрирование, image #24

YouTube:

Сложнейшая проблема компьютерных наук: центрирование, image #25

Иногда иконка выигрывает у текста:

Сложнейшая проблема компьютерных наук: центрирование, image #26

Иногда текст выигрывает у иконки:

Сложнейшая проблема компьютерных наук: центрирование, image #27

Иногда оба проигрывают:

Сложнейшая проблема компьютерных наук: центрирование, image #28

Некоторые иконки — это просто старые элементы управления HTML:

Сложнейшая проблема компьютерных наук: центрирование, image #29

Некоторые стилизованы:

Сложнейшая проблема компьютерных наук: центрирование, image #30

Иногда люди достигают точного выравнивания креативным способом:

Сложнейшая проблема компьютерных наук: центрирование, image #31

Но в целом это безнадёжная игра:

Сложнейшая проблема компьютерных наук: центрирование, image #32

Проблема в том, что CSS нам тут не поможет. У свойства vertical-align есть 13 возможных значений, но ни одно из них не выровняет иконку как следует:

Сложнейшая проблема компьютерных наук: центрирование, image #33

Ближе всего text-align: middle, но это свойство выравнивает по x-height, а не cap-height, которая по-прежнему выглядит криво:

Сложнейшая проблема компьютерных наук: центрирование, image #34

Именно поэтому люди так любят веб-программирование. Здесь для них всегда есть вызов.

▍ Шрифты иконок

Выравнивать прямоугольники относительно легко, а вот текст — трудно. Иконки прямоугольные. А что получится, если поместить их в файл шрифтов?
Теперь мы ничего не сможем выровнять:

Сложнейшая проблема компьютерных наук: центрирование, image #35

Равно как и установить размер иконок. В примере выше для всех иконок были установлены одинаковые размер шрифта и высота строки. Как видите, в итоге все они получились разных размеров с разными отступами, и ни одна не выровнена как следует.
Несмотря на множество их недостатков и практически полное отсутствие плюсов, компании стремятся использовать иконки повсюду. И вот что мы получаем в итоге:

macOS 10.14 → macOS 10.15
macOS 10.14 → macOS 10.15

Обратите внимание, что операторы утратили вертикальное выравнивание и получились размытыми. Всё из-за переключения на иконочный шрифт.

В Apple были настолько привержены к использованию иконочных шрифтов, что даже испортили кнопку записи в QuickTime:

Сложнейшая проблема компьютерных наук: центрирование, image #37

Только посмотрите на неё:

Сложнейшая проблема компьютерных наук: центрирование, image #38

Да, так она и выглядит по сей день. Как и калькулятор. Но это далеко не единственный пример. Вот ещё один:

Сложнейшая проблема компьютерных наук: центрирование, image #39

Второй:

Сложнейшая проблема компьютерных наук: центрирование, image #40

Третий:

Сложнейшая проблема компьютерных наук: центрирование, image #41

Четвёртый:

Сложнейшая проблема компьютерных наук: центрирование, image #42

Пятый:

Сложнейшая проблема компьютерных наук: центрирование, image #43

Шестой:

Сложнейшая проблема компьютерных наук: центрирование, image #44

Седьмой:

Сложнейшая проблема компьютерных наук: центрирование, image #45

То же, что и в случае выравнивания текста — бесконечное число примеров криво выровненных иконок.

▍ Недостаток навыков

Но с выравниванием проблемы наблюдаются не только у программистов. То же касается и дизайнеров:

Текущая версия/моё исправление
Текущая версия/моё исправление

Проблема с иконками в том, что иногда для получения красивой картинки вам нужно учесть их форму:

Плохое выравнивание / хорошее выравнивание
Плохое выравнивание / хорошее выравнивание

Треугольники особенно проблематичны:

Сложнейшая проблема компьютерных наук: центрирование, image #48

Иногда они уезжают влево:

Сложнейшая проблема компьютерных наук: центрирование, image #49

Иногда вправо:

Сложнейшая проблема компьютерных наук: центрирование, image #50

А могут оказаться задраны (здесь снова высота строки):

Сложнейшая проблема компьютерных наук: центрирование, image #51

▍ Что делать: дизайнерам?

Итак, в чём проблема?
Всё начинается со шрифта. Сейчас рамка текстового блока выглядит так:

Сложнейшая проблема компьютерных наук: центрирование, image #52

Проблема в том, что она может выглядеть и так:

Сложнейшая проблема компьютерных наук: центрирование, image #53

Или так:

Сложнейшая проблема компьютерных наук: центрирование, image #54

А что произойдёт, если попробовать выровнять текст, центрировав его рамку?

Сложнейшая проблема компьютерных наук: центрирование, image #55

Текст сместится! Несмотря на то, что прямоугольники идеально отцентрованы. Но даже если метрики шрифта и могут исказиться, это не значит, что так и есть.
Что же происходит в реальности?
В реальности метрики большинства шрифтов слегка искажены. Во многих эти искажения значительны:

Проценты указаны для cap-height
Проценты указаны для cap-height

И 10% — это немало. При размере шрифта 13 — это целый пиксель. А при двухкратном масштабировании уже два! Это легко заметить.

По сути, именно из-за Segoe UI интерфейс GitHub в Windows выглядит так:

Сложнейшая проблема компьютерных наук: центрирование, image #57

Решение здесь простое: использовать рамки вокруг текста. Тогда центрировать шрифт будет легко.

Сложнейшая проблема компьютерных наук: центрирование, image #58

Если вы используете сервис Figma, то он это умеет (хоть и не по умолчанию):

Сложнейшая проблема компьютерных наук: центрирование, image #59

▍ Что делать: дизайнерам шрифтов?

Если вы дизайнер шрифтов, то можете упростить всем жизнь, настроив метрики так, чтобы ascender − cap-height = descender:

Сложнейшая проблема компьютерных наук: центрирование, image #60

Вот тот же принцип наглядно:

Сложнейшая проблема компьютерных наук: центрирование, image #61

Важно! Вам не обязательно реально растягивать восходящие/спусковые элементы букв до этих границ. Как видно по картинке, у меня область под восходящую часть используется мало. Просто сделайте так, чтобы их размеры совпадали.
Как в веб-, так и в нативной разработке для избежания лишней головной боли выбирайте шрифт, который уже соответствует этому правилу. Например, SF Pro Text, Inter и Martian Mono ему следуют, значит, будут отлично центрироваться без дополнительных хлопот.
Подробнее читайте в статье: Font size is useless; let’s fix it.

▍ Что делать: веб-разработчикам?

С позиции разработки ситуация несколько сложнее.
Первым делом вам нужно понимать, какой шрифт вы будете использовать. К сожалению, предложенное мной решение не сработает, если вы планируете подстановочные шрифты.
Возьмём используемый на этой странице IBM Plex Sans. Вот его метрики:

Сложнейшая проблема компьютерных наук: центрирование, image #62

Устанавливая font-size, вы устанавливаете UPM (это значение также будет равно 1em). Тем не менее фактическое занимаемое текстовым блоком пространство находится между областями восхождения (ascender) и спуска (descender).

Сложнейшая проблема компьютерных наук: центрирование, image #63

Путём простых расчётов мы выясняем, что нам поможет добавление padding-bottom: 0.052em:

Сложнейшая проблема компьютерных наук: центрирование, image #64

Должно получиться так:

Сложнейшая проблема компьютерных наук: центрирование, image #65

Либо в реальном CSS (в оригинале можно выделить текст, чтобы увидеть окружающую его рамку, — прим. пер.):

Сложнейшая проблема компьютерных наук: центрирование, image #66

Нужные метрики шрифтов можно найти по ссылке opentype.js.org/font-inspector.html (ascender, descender, sCapHeight).
Теперь, когда мы с этим разобрались, можно без особых проблем выравнивать и иконки. Вы устанавливаете vertical-align: baseline и затем смещаете их вниз на (iconHeight - capHeight) / 2:

Сложнейшая проблема компьютерных наук: центрирование, image #67

К сожалению, для этого необходимо знать метрики шрифта и размер иконок. Но такое решение хотя бы работает:

Сложнейшая проблема компьютерных наук: центрирование, image #68

▍ Что делать: с иконочными шрифтами?

ПРЕКРАТИТЕ.
ИСПОЛЬЗОВАТЬ.
ШРИФТЫ.
ДЛЯ.
ИКОНОК.
Используйте обычный формат изображений. Тот самый — с шириной и высотой.
Я даже нарисовал для вас логическую блок-схему, чтобы было проще принять решение:

Сложнейшая проблема компьютерных наук: центрирование, image #69

Вы только взгляните, как усердно в Apple стараются вписать галочку в прямоугольник, а прямоугольник разместить рядом с текстовой меткой:

Сложнейшая проблема компьютерных наук: центрирование, image #70

И всё безуспешно!
Что может быть проще, чем выровнять два прямоугольника. Но что может быть сложнее, чем пытаться выровнять текст, вокруг которого есть произвольный объём пустого пространства.
Победить в этой игре невозможно.

▍ Что делать: с визуальной корректировкой?

Мы, как разработчики, можем математически выровнять лишь идеальные прямоугольники. Поэтому всё, что требует ручной подстройки, заключайте в достаточно большой прямоугольник и визуально выравнивайте иконку внутри:

Сложнейшая проблема компьютерных наук: центрирование, image #71

▍ Что делать: всем?

Будьте внимательны. Будьте осторожны. Плохое выравнивание может испортить прекрасный интерфейс:

Сложнейшая проблема компьютерных наук: центрирование, image #72

И напротив, с правильно выровненным текстом ваш интерфейс обретёт утончённую красоту:

Сложнейшая проблема компьютерных наук: центрирование, image #73

Даже если это трудно. Даже если инструменты создают неудобства. Даже если приходится искать решения. Я верю, что вместе мы можем разобраться, как засунуть один прямоугольник в другой ровно.
Я, например, хочу жить в мире красиво выровненных пользовательских интерфейсов. И верю, что вы хотите того же.
В конце концов приложенные старания того стоят.

Источник

2877 views·13 shares