{"id":14268,"url":"\/distributions\/14268\/click?bit=1&hash=1e3309842e8b07895e75261917827295839cd5d4d57d48f0ca524f3f535a7946","title":"\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c \u0438\u0433\u0440\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e?","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"f71e1caf-7964-5525-98be-104bb436cb54"}

Перестань рисовать ячейки — большой гайд по Figma Auto Layout

За последние года полтора я нашёл себя в создании и оптимизации дизайн-систем, а инструменты для дизайна начали подыгрывать мне и постоянно подкидывают новую функциональность на изучение. В этой статье я покажу хардкорное применение последнего нововведения в Figma — Auto layout.

Экраны «Яндекс.Музыки» на одном компоненте​

Три явных плюса от ультимейт-компонента

  1. Не нужно собирать компонент ячейки в каждом проекте заново.
  2. UIkit получается компактным, но при этом легко кастомизируемым.
  3. Ускоряет создание диза… Ой ладно, это просто круто!

Вот такие штуки можно делать после этого гайда. Если хочешь так же, открывай фигму, сейчас научу :)

Это и есть наша ячейка, разложенная по частям:

  • Какие-то форматы картинок слева.
  • Текст по центру.
  • Различные контролы справа.

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

Ссылка на этот Figma-проект есть в Telegram-канале. Там я всё аккуратно разложил по полочкам и добавил подсказки, а то когда я пришёл к такой ячейке в первый раз, было примерно так :D

Ну вот и гайд

Рисуем Frame и включаем вертикальный Auto layout с фиксированной шириной, которая тебе нужна в дизайне, — это контейнер ячейки, в котором кроме слоя с контентом и Padding’ов больше ничего не будет.

Примечание 1: в компонентах на лэйаутах часто получается много «пустых» слоёв, не паникуй, они все чуть-чуть влияют на компонент.

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

Следующий этап — слой с контентом. В этом артборде настрой только Spacing между частями ячейки, разумеется, переключи лэйаут по горизонтали, это же горизонтальный компонент.

Теперь переходим к самим деталям ячейки, но через несколько шагов вернемся к «пустым» контейнерам.

Это детальки, которые я использовал для демо, у тебя их может быть гораздо больше (помнишь скриншот моей первой ячейки? :). Естественно заведи все эти детали в компоненты. У текстового компонента обязательно включи лэйаут c Fixed width, потом нам это понадобится.

Начинается самое интересное

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

С левой частью всё легко. Просто группируем и включаем лейаут.

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

Сделать такие контейнеры не сложно, если ты включил Fixed width для текстовой детали (text root component) несколько шагов назад, просто растяни его на нужную ширину (вычти из ширины ячейки ширину левой и правой части ячейки).

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

Это нужно, чтобы ячейка не разъезжалась при переключении деталей внутри правой части, если они разной длины. Обсуди этот момент с разработчиками, чтобы предотвратить различные вопросы :)

Теперь предыдущие компоненты с деталями закидываем в дополнительные контейнеры, и включаем лейауты. Для левой части — горизонтальный Auto height (в продвинутом mode закидывай туда систему отступов), для центральной — вертикальный Auto width, а для правой части — горизонтальный Fixed height, размер которой поставь по высоте средней левой части, в моём случае — 48 pt.

Правую часть делаем так специально, чтобы ваши контролы не ехали вслед за растягивающимся текстом. В таком способе есть мини-костыль, в маленькой ячейке нужно будет переключить правую часть с Fixed на Auto height либо сделать несколько контейнеров, для маленькой ячейки и для ячеек размером побольше, но в 95% случаев моего способа будет достаточно, чтобы покрыть все кейсы.

Теперь закидываем все три слоя Left, Center и Right part в наш компонент Content — и наша ячейка готова…

Почему это последняя в твоей жизни ячейка?

Это базовый компонент кита, который покрывает большинство кейсов. Если мне понадобится что-то добавить, я добавлю, а если нужно сделать редизайн общего стиля, то кастомизирую детальки компонента — и вуаля.

Пример кастомайза из начала статьи​

По сути, я скруглил края аватарки в левой части, добавил кнопку (тоже на лэйаутах) в правую часть, и ячейка уже подходит под другое приложение.

Окей, круто! А как перенести компонент в другой проект-то?

Если у вас платная версия Figma, то всё легче некуда, ну а если бесплатная, то придётся потратить минуты две… О нет…

Принцип простейший:

  • Копируешь инстанс cell component в новый проект, он должен стать детачнутым.
  • Идёшь в самый низкоуровневый слой и делаешь из него компонент.
  • Формируешь компонент из слоя уровнем выше, что заставит нижнеуровневый компонент выпрыгнуть рядом, оставив внутри свой инстанс.
  • Profit!

Гайд закончился

Надеюсь, ты понял, что я тут наворотил. Если что-то не получилось, чекай Figma-файл в Telegram-канале, ну а если и это не помогло, задавай вопросы в комментарии или мне в личку (Telegram, «ВКонтакте»).

Спасибо, что дочитал. Если интересно, в следующей статье, я разберу не менее важную тему — неправильного использования стилей в дизайн-системе и как настроить их супер гибко, bye :)

0
64 комментария
Написать комментарий...
Pixel Lens

Из-за этих авто-лейаутов я пришёл к наплевательству на сетку 

Ответить
Развернуть ветку
Женя Иванов
Автор

Почему?))

Ответить
Развернуть ветку
Pixel Lens

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

Ответить
Развернуть ветку
Женя Иванов
Автор

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

Ответить
Развернуть ветку
Pixel Lens
Попробуй паддинги и марджины сделать компонентами и раскидывать во все компоненты

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

Ответить
Развернуть ветку
Женя Иванов
Автор

Пхах, ну если ты дизайнер различных промо страниц и прочего рекламного, то я всеми руками и ногами за, но не трогай святые интерфейсы))

Ответить
Развернуть ветку
Pixel Lens

Именно их я и собираюсь трогать. Не бойся, больно не будет 

}:-)

Кроме шуток, у меня давно зреет желание накатать статью, почему любые сетки и системы в макетах - это скрытое зло. При этом, я не топлю за хаос. Но истинная красота не рождается в оковах.

Ответить
Развернуть ветку
Женя Иванов
Автор

Ну мы с фронтом сейчас определили, что вот так ему будет удобно. То есть левый экран у меня полностью на лэйаутах и засунут в компонент, чтобы его можно было положить рядом и раскрыть сами отступы. Разраб просто пробегает по ним глазами и на раз-два вставляет условный padding-blue

Ответить
Развернуть ветку
Pixel Lens

Хэй, я в итоге пришёл к твоим квадратикам.

Возник новый проект, в котором я, как и обещал, решил полностью отказаться от любых колонок, сеток, линеек и прочего.

Очень удобным оказалось построить вообще ВСЁ на автолейаутах. И вот здесь я споткнулся об спейсинг в АЛ - он равен между любыми объектами. Выхода два: 

1) загонять объекты в компоненты, внутри которых отступаешь от краёв как тебе нужно,

2) сделать спейсинг в АЛ равным нулю и отбивать объекты прозрачными плашками (или непрозрачными, но цветом фона, короч чтоб их не было видно).

Выбрал второй путь.

Всего спустя неделю я поймал себя на том, что использую плашки размером в 4, 8, 12, 16, 20, 24, 28 и т.п.

Вспомнил тебя, побежал писать сей коммент. Сейчас планирую закомпонентить эти плашки-отступы, потому что вижу в этом потрясающую возможность контролировать макет: всего лишь с помощью настройки стилей шрифта и размеров этих плашек я могу тотально менять вёрстку сразу везде.

Правда показывать я их собираюсь не цветом, а нумерацией или литерацией, типа так:

A = 4 px
B = 8 px
и т.п.

По-любому споткнусь ещё обо что-нибудь, так что было бы прикольно если б ты разродился статьёй про этот плашечно-автолейаутный подход :)

Ответить
Развернуть ветку
Женя Иванов
Автор

Привет. Круто, что у тебя получается то, что ты описал. Тема системы отступов одна из самых сложных, потому что она затрагивает сразу множество элементов и легко ошибиться, поэтому её я оставил напоследок, после разбора всех хардкорных компонентов. Но если есть спрос, возможно я начну готовить эту тему пораньше, следи за обновлениями в телеге)

Ответить
Развернуть ветку
Pixel Lens

Спрос есть - на спектруме давно уже видел кривотолки про отступы в АЛ, люди сходятся во мнении что нужны вот эти вот плашечки искусственные :)

Прямо щас переделываю весь проект, ну то есть убираю автоматические отступы и внедряю компонентные.

Пока что столкнулся со следующим: если АЛ состоит из абсолютно однородных объектов, то внедрять туда компонентные отступы бессмысленно. Например, обычный список гиперссылок - вертикальный или горизонтальный. Или галерея карточек. 

А вот если АЛ состоит из объектов различной природы - иконки, тексты, кнопки - вот там да, компонентные отступы рулят.

Еще сходу напоролся на оформление самих компонентов для отступов. Решил не делать нумерацию, потому что легко спутать номер и размер самого компонента (например из имени indent-04 можно ошибочно сделать вывод, что он равен 4 рх, а он просто четвертый по счёту)

Поэтому дал им буквенные имена: indent-a, -b, -c и т.п.

Красить их в различные цвета тоже не рискнул, так как цвета тоже легко спутать, да и не напасёшься цветов.

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

Так вот, про имена опять таки. У меня щас так:

a = 4 px
b = 6 px
c = 8 px
... после 'e' увеличение идёт на 4 рх, после 'h' - на 8, и вот тут заковыра: что, если мне понадобится некое промежуточное значение? Получать его суммируя имеющиеся? Тупо как-то. Внедрять новый компонент? Тогда как его называть, если пространство имён уже определено? Добавлять еще один суффикс? Какой? тоже буквенный? Запутанно. Числовой? типа indent-i-01 - ну, можно конечно, но выглядит не оч

Напрашивается полная независимость имени не только от размера индента, но и от его места в последовательности всей линейки индентов. Тут на помощь могут прийти эмодзи (см. скрин) 

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

Короче! Охуенно много деталей всплывает.

Ответить
Развернуть ветку
Artem Milovanov

Если честно, то я не совсем понял что ты делаешь. Но то, что от пиксельной сетки отказался - хорошо.

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

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

И ещё. Если ты делаешь систему отступов, то шаг +4 или +8 пикселей приведет к тому, что на высоких значениях у тебя будут практически одинаковые отступы и ты снова начнешь тратить время на обдумывание, какой отступ выбрать в этот раз. Идеально, когда у отступов есть прогрессия, и каждый последующий отступ больше предыдущего настолько, чтобы была видна разница.

Как получить отступы? 

Есть Columns Grid, между колонками всегда задают отступ. Вот ты берешь этот отступ, делишь на 1,4 и умножаешь на 1,4 (1,4 это множитель). Проворачиваешь с получившимися значениями тоже самое, пока в конечном итоге у тебя не получится набор отступов от 2 до максимальных значений, которые тебе нужны. Желательно их округлять, чтобы они были кратны 2, так их удобнее использовать (чтобы были отступы не 2 и 3, а 2 и 4). Чем больше отступ между колонками берешь за основу, тем «воздушнее» макет получится с системой отступов.

Ну и стоит сказать, что это не я придумал. Я лишь понял и использую)

Ответить
Развернуть ветку
Pixel Lens

Колонки я не юзаю теперь =) Я отмеряю объектам ровно столько пространства, сколько они требуют для себя, не стесняя их колонками.

Но я примерно понял. Другое дело, что не обязательно брать что-то за основу, имхо.

Просто чтобы отступ по альту был, не надо туда подставлять компоненты и плашки какие-то)

Речь про AL. Автолейаутом оч удобно всякие длинные портянки дизайнить, нашпигованные элементами разной природы. Идеальный пример - дизайн статьи. В ней может быть всё что угодно: текст, цитаты, дивайдеры, картинки, кэпшены, многоуровневые заголовки, твиты и т.п. Но чтобы задавать разные отступы между элементами потребуется задать спейсинг внутри АЛ равным нулю и отбивать элементы плашками.

Думаю ты с этим тоже когда-нибудь столкнёшься)

Ответить
Развернуть ветку
Artem Milovanov

Все равно не понял) Ты типа все элементы в один автолэйаут собираешь и потом ставишь прозрачные фреймы (выключая их видимость), чтобы отступы разные делать?)

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

Прикрепил пример как это выглядит. Для наглядности наложил отступы поверх этого блока.

Ответить
Развернуть ветку
Pixel Lens
У тебя вложенность получается, с разными отступами.

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

ы типа все элементы в один автолэйаут собираешь и потом ставишь прозрачные фреймы

ага. тут преимущество в том, что во-первых структура макета становится абсолютно плоской. В нём конечно могут быть сложносоставные карточки со своими автолейаутами - и вот кстати чем больше там фарша, тем сложнее его править (это в дополнение к предыщему абзацу о вложенности). Во-вторых, со временем ты образуешь некую систему отступов, потому что используются +- одни и те же - и их уже удобно загонять в компоненты, на перспективу

См. скрин. В таком подходе очень легко внедрять новые элементы и переставлять их местами, да и банально менять отступы.

Плашки я "подсветил" чёрным для наглядности

Ответить
Развернуть ветку
Artem Milovanov

Осталось только ответить на вопрос зачем в фигме дизайнить статьи) Ну ок, тебе нужно для макета. Но зачем тебе её по десять раз редактировать? Вместо добавления этих квадратов можно было сесть и один раз нормально отредактировать статью, а потом заказать в автолэйаута.

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

P.S Редактирование статей происходит на уровне движка сайта, поэтому статьи нет необходимости дизайнить в фигме миллион раз)

Ответить
Развернуть ветку
Pixel Lens
зачем в фигме дизайнить статьи

Я не дизайню статьИ, я дизайню статьЮ) Это часть дизайна интерфейса сайта. Это шаблон, по которому будут верстаться ВСЕ статьи на сайте.

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

пока не попробуешь - не поймешь) Оч удобно дизайнить сразу в автолейауте. 

Проблема надуманная)

Да нет никакой проблемы))) Наоборот - я просто делюсь охуенно удобным способом делать дизайн. 

Редактирование статей происходит на уровне движка сайта

Ты непонел - см. первый абзац :)

Ответить
Развернуть ветку
Artem Milovanov

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

Ответить
Развернуть ветку
Pixel Lens

Это ж сколько дополнительной работы... 

Эх, всё это прокатывает когда тебя еще не заебали твердолобые упрямые фронты, и есть силы как-то им объяснять что-то. Я занимаюсь интерфейсами 6 лет, вроде недолго, а устал смертельно именно из-за наплевательства фронтов. 

Ответить
Развернуть ветку
Женя Иванов
Автор

Не, кстати, вообще работы не прибавилось, экраны наоборот на системе отступов проще собирать, они же там сами разлетаются, если лэйауты юзаешь. А насчёт последнего... может проблема тогда в конкретных фронтах, с кем ты работаешь, я про своего не могу так сказать, как ты про своего))

Ответить
Развернуть ветку
Pixel Lens
может проблема тогда в конкретных фронтах, с кем ты работаешь, я про своего не могу так сказать, как ты про своего

Проблема в 99% фронтов. Тебе реально повезло, если твой - адекватный и умный. Люби его. Однако он не всегда будет с тобой, будут и другие фронты :С И вот когда ты познаешь их - приходи, братан, выпьем с тобой, посетуем на долю нашу дизайнерскую)

Ответить
Развернуть ветку
Женя Иванов
Автор

С этим фронтом мы пилим совместные проекте (на скрине один из них), а так на работе у меня полно других обычных коллег, но они тоже вроде нормально относятся к таким нововведениям, типа системы отступов и остального, может я просто везучий на команду. Но твоё предложение запомню, если что напишу))

Ответить
Развернуть ветку
Artem Milovanov

Не надо их пугать такими словами как система отступов. Надо просто говорить: «Солнышко, верстай пиксель-перфект» :D

Ответить
Развернуть ветку
Женя Иванов
Автор

Ахахаха, возьму на заметку :D

Ответить
Развернуть ветку
Никита Баринов

Не вздумай!

Ответить
Развернуть ветку
Pixel Lens
Солнышко, верстай пиксель-перфект

...иначе уволим нахуй

Ответить
Развернуть ветку
Artem Milovanov
Это ж сколько дополнительной работы...

Вообще нисколько. Он просто знает что у него есть отступ 12px, например, и юзает его.

Ответить
Развернуть ветку
Женя Иванов
Автор

Ну мы тупо цвета юзаем. То есть условный отступ 16px - синий. Фронту остаётся указать, что сюда вставляем синий паддинг, а цифровое значение подставляется из заранее заготовленных переменных

Ответить
Развернуть ветку
61 комментарий
Раскрывать всегда