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

в 13:00, , рубрики: Без рубрики

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


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

display: flex;
justify-content: center; /* Горизонтальное центрирование */
align-items: center; /* Вертикальное центрирование */

Не спрашивайте, почему вам нужно запомнить четыре слова вместо просто горизонтальное/вертикальное; всё равно лучше, чем было до этого.

Ещё можно использовать сетку:

display: grid;
justify-items: center; /* Горизонтальное центрирование */
align-items: center; /* Вертикальное центрирование */

Также не спрашивайте, почему выражение justify-content стало justify-items.

Если вы не прочь немного вспомнить школу, то можем опереться на фундаментальные принципы:

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

Да даже ChatGPT умеет центрировать контент:

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

Перевод

Вы: Какую формулу использовать для расположения одного прямоугольника в центре другого?

ChatGPT: Чтобы центрировать один прямоугольник внутри другого, нужно совместить их центры. Предположим, у нас есть два прямоугольника — одни внутри другого.

Выберем обозначения:

  • (x1, y1) будут координатами центра внешнего прямоугольника.
  • w1, h1 будут шириной и высотой внешнего прямоугольника.
  • (x2, y2) будут координатами центра внутреннего прямоугольника.
  • w2, h2 будут шириной и высотой внутреннего прямоугольника.

Чтобы центрировать внутренний прямоугольник во внешнем, нужно установить координаты его центра (x2, y2) равными координатам центра внешнего прямоугольника (x1, y1).

Значит, формулами для центрирования внутреннего прямоугольника во внешнем будут:

x2 = x1
y2 = y1

Это обеспечит совпадение центров внутреннего и внешнего прямоугольников по вертикали и горизонтали, а значит и центрирование внутреннего прямоугольника во внешнем.

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

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

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

Или вот:

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

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

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

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

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

Теоретически между теорией и практикой разницы нет. К сожалению, мы живём в практическом мире. Так что же происходит? Будем разбираться.

▍ Шрифты

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

Его не может выровнять ни Apple:

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

Ни Microsoft:

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

Ни GitHub:

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

Ни Valve:

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

Ни Slack:

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

Ни Telegram:

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

Ни Google Maps:

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

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

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

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

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

Если вам недостаточно примеров со шрифтами, то очередной проблемой является высота строки.

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

Вот как это выглядит на практике. Slack:

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

Notion:

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

Airbnb:

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

YouTube:

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

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

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

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

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

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

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

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

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

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

▍ Иконки

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

Atom:

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

Бывший Twitter:

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

iOS:

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

Mozilla:

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

YouTube:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Теперь мы ничего не сможем выровнять:

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

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

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

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

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

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

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

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

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

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

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

Второй:

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

Третий:

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

Четвёртый:

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

Пятый:

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

Шестой:

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

Седьмой:

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

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

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

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

Сложнейшая проблема компьютерных наук: центрирование - 49
Текущая версия/моё исправление

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

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

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

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

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

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

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

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

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

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

▍ Горизонтальное центрирование

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

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

Я не думаю, что для этого есть какие-то глубокие причины, помимо банальной неаккуратности самих людей:

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

Ну серьёзно!

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

Разве так можно сделать намеренно?

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

Ну не знаю. Причём иконок это тоже касается:

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

Как и текста:

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

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

Итак, в чём проблема?

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

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

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

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

Или так:

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

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

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

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

Что же происходит в реальности?

В реальности метрики большинства шрифтов слегка искажены. Во многих эти искажения значительны:

Сложнейшая проблема компьютерных наук: центрирование - 65
Проценты указаны для cap-height

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

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

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

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

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

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

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

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

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

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

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

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

Важно! Вам не обязательно реально растягивать восходящие/спусковые элементы букв до этих границ. Как видно по картинке, у меня область под восходящую часть используется мало. Просто сделайте так, чтобы их размеры совпадали.

Как в веб-, так и в нативной разработке для избежания лишней головной боли выбирайте шрифт, который уже соответствует этому правилу. Например, SF Pro Text, Inter и Martian Mono ему следуют, значит, будут отлично центрироваться без дополнительных хлопот.

Подробнее читайте в статье: Font size is useless; let’s fix it.

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

С позиции разработки ситуация несколько сложнее.

Первым делом вам нужно понимать, какой шрифт вы будете использовать. К сожалению, предложенное мной решение не сработает, если вы планируете подстановочные шрифты.

Возьмём используемый на этой странице IBM Plex Sans. Вот его метрики:

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

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

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

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

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

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

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

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

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

Нужные метрики шрифтов можно найти по ссылке opentype.js.org/font-inspector.html (ascender, descender, sCapHeight).

Теперь, когда мы с этим разобрались, можно без особых проблем выравнивать и иконки. Вы устанавливаете vertical-align: baseline и затем смещаете их вниз на (iconHeight - capHeight) / 2:

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

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

Сложнейшая проблема компьютерных наук: центрирование - 77
Также в оригинале можно выделить текст, чтобы увидеть рамку, — прим. пер.

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

ПРЕКРАТИТЕ.
ИСПОЛЬЗОВАТЬ.
ШРИФТЫ.
ДЛЯ.
ИКОНОК.

Используйте обычный формат изображений. Тот самый — с шириной и высотой.

Я даже нарисовал для вас логическую блок-схему, чтобы было проще принять решение:

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

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

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

И всё безуспешно!

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

Победить в этой игре невозможно.

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

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

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

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

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

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

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

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

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

Я, например, хочу жить в мире красиво выровненных пользовательских интерфейсов. И верю, что вы хотите того же.

В конце концов приложенные старания того стоят.

▍ Отдельная благодарность

Статья оказалась бы неполной без вот этого красавца

Всех благ!

Автор: Дмитрий Брайт

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js