Вёрстка макета

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

  • Системно мыслить. Лучше продумывать детали реализации и краевые случаи ещё на этапе дизайна.
  • Ускорять разработку. Разработчик видит закономерности и иерархию сущностей. Это уменьшает количество ошибок на этапе разработки и количество правок при тестировании.

  • Сокращать текстовые описания. Самодокументируемый* макет требует меньше пояснений и комментариев на полях.

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

  • Дорабатывать дизайн в будущем. Легче поддерживать и дорабатывать макет, особенно когда дизайнеров в команде несколько.

  • Снижать нагрузку на компьютер. «Лёгкие» макеты быстрее загружаются, в них быстрее сохраняются изменения.

Блочная модель

Html-вёрстка имеет блочную структуру: все элементы — это прямоугольные контейнеры, идущие в потоке друг за другом. Они могут располагаться по вертикали или по горизонтали. Каждый элемент может содержать в себе другие элементы, и они также будут жить по законам блочной структуры.

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

Три окна браузера с вёрсткой и кодом рядом. Три пустых div идут друг под другом. Средний div с абзацем «Text» растягивается по высоте. При width: 100px и display: inline-block блоки встают в строку.

По умолчанию у элементов нет отступов внутри и снаружи, но их можно настроить. Для этого есть специальные css-атрибуты:

  • Padding — это отступ от контента до края блока.
  • Border — обводка.
  • Margin — отступы до соседних элементов.

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

Блочная модель вложенными рамками: внутри position — margin, в нём border, в нём padding, в центре — «Содержимое»

В Figma можно верстать очень близко к html-коду. Используйте это, включайте автолейауты и констрейнсы, чтобы помочь разработчику быстрее понять задумку дизайнера и точнее воспроизвести вёрстку макета средствами html и css.

Названия слоёв и фреймов

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

Например, здесь названия слоёв однозначно говорят о том, что перед нами список пунктов с буллитами:

Дерево слоёв Figma. Неправильно: перечёркнуты безликие названия Group 7, Group 11, t, Rectangle 1. Правильно: слой Items, внутри Item со слоями title и bullet.

А здесь, что перед нами не просто картинка, а аватарка:

Неправильно: перечёркнут слой-картинка с бессмысленным названием «qftwjpfgbcwrkjg zum 1». Правильно: слой-картинка называется Avatar.

Размеры элементов

Задавайте размеры элементам, чтобы показать, как они ведут себя при изменении контента. Например:

Список «Пункт раз», «Пункт ещё раз», «Пункт два». Неправильно: у текстовых слоёв режим Auto width, рамки разной ширины. Правильно: режим Auto height, рамки одной ширины.

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

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

Неправильно: слои «Текст» и «Текст в несколько строк, растущий по высоте» в режиме Fixed size, многострочный текст вылезает за рамку. Правильно: режим Auto height, рамка растёт вместе с текстом.

Группировка элементов

Группируйте элементы так, как они будут связаны в html-вёрстке. Объединение по другим принципам может запутать разработчика. Например, здесь непонятно, связаны буллиты с текстом или нет:

Неправильно: буллиты сгруппированы в одну рамку, а три пункта списка — в другую, отдельно от них

Группируя с помощью фреймов и автолейаутов, можно показать, какая область ховера у элемента, и объяснить логику отступов между элементами:

Список из трёх пунктов: каждая строка — отдельный фрейм на всю ширину с буллитом и текстом внутри, рамка строки показывает область ховера

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

Анимация: ромб прижат к левому краю контейнера, пятиугольник и шестиугольник сгруппированы у правого; при растягивании контейнера расстояние между ними растёт, при сужении — сокращается

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

Компоненты

Если вы собираетесь скопировать фрагмент интерфейса, подумайте, а не сделать ли его компонентом. Несинхронизованные копии приведут к расхождениям версий и путанице при чтении макета.

Организация конкретного компонента

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

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

Тултип «Информация об ошибке. Короткий объясняющий текст» выделен на холсте, справа в свойствах компонента Tooltip переключатели вариантов Direction и Position

Организация множества компонентов

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

Компонент actions — три кнопки с иконками, справа его описание: «Кнопки действий в карточке компании» и ключевые слова на русском и английском, например «выгрузка», «архив», actions, notes

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

Например, можно сделать приватным «базовый» компонент, а его инстансы* изменять, чтобы создать разные состояния. И уже эти состояния оборачивать в новый компонент, который пойдёт в публикацию. При таком подходе изменения базового компонента будут распространяться на все копии.

Инстанс (instance) — так разработчики называют экземпляр объекта, который наследует характеристики родительского объекта

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

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

Стили

Все цвета в макете должны быть занесены в библиотеку стилей. Так можно использовать цвет в интерфейсе системно — помогает избежать появления близких оттенков и не плодить варианты, когда они не нужны.

Как шутят фронтендеры — в макете неопытного дизайнера по пятьдесят оттенков серого

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

Цвета текста с названиями по функции: text-default, text-second, text-disabled, text-link, text-positive, text-warning, text-negative

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

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

Цветные теги «Контрагенты», «Поставщики», «Любимые», «Должники», «Чёрный список», справа их стили с названиями по цвету: tag-green, tag-blue, tag-pink, tag-yellow, tag-black и text-light

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

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

Используйте стили для разных ситуаций, в них можно добавлять не только цвета и типографику. Также в стили можно добавлять изображения (например, аватарки), обводки, тени и другие эффекты, а также настроенные сетки.

Круглая аватарка на холсте, справа панель Color Styles с группами стилей: «Аватары» с фотографиями, «Текст», «Концерты» и «Театры» с картинками

Как рисовать без лишних элементов

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

Неправильно: перечёркнута аватарка из группы Avatar, где картинка Image под маской Rectangle. Правильно: один слой Avatar с фотографией в заливке.

Как описывать разные состояния интерфейса

Не дублируйте страницу целиком, когда нужно описать поведение элементов интерфейса.

Don't repeat yourself (DRY) — это принцип разработки, направленный на повторное использование кода. Но его также можно использовать и при вёрстке макетов. Следование правилу «не повторяйся» повышает читаемость и консистентность макетов.

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

Шесть копий целой страницы «Мои встречи» в приложении Толк, которые отличаются одной деталью: открыто меню «Новая», календарь, меню встречи, пустое состояние «Встреч нет» и другие

Неправильно

Акцентируйте внимание на различиях. Показывайте состояния элементов рядом, используйте подписи, где они нужны.

Только изменяющиеся фрагменты с подписями: плашка «Киано» со сменой иконки громкости, слайдер громкости в четырёх положениях, меню участника для админа и для не админа

Правильно

Именуйте корневые фреймы. Их названия видны даже при зумировании. С осмысленными названиями проще найти нужный фрагмент макета.

Корневые фреймы с окнами конференции. Неправильно: фреймы названы от frame_01 до frame_04. Правильно: названы по смыслу — «Участники», «Модераторы» и два фрейма «Позвонить…».

Если хотите собрать кликабельный прототип, но он портит читабельность макета — собирайте его на отдельной странице.

Как вовремя остановиться

Степень проработки макета зависит от этапа проектирования. Если вы только начали думать над задачей и работаете в режиме генерации концепций, не стоит верстать идеально. Это может помешать, потому что вы начнёте думать «как нарисовать» вместо «что нарисовать». А на этапе подготовки макета к передаче в разработку приходит время подумать о понятной вёрстке.

Макеты, которые дополняются новыми задачами и правками, со временем «захламляются». В них нужно периодически проводить уборку, подобно рефакторингу в коде.

Рефакторингом разработчики называют процесс улучшения кода без изменения его функциональности. Цель — написать «чистый» код, который просто читать, понимать и поддерживать.

Структурируя макет, будьте разумными в степени перфекционизма. Делайте макеты понятными, но не забывайте, что главный приоритет — продукт, а не макеты.