CSS to Figma Auto Layout: Flexbox и Grid в Auto Layout Figma
Как CSS превращается в Auto Layout Figma: flex-direction, gap, padding, выравнивание, flex-grow, wrap, grid, absolute и max-width — и советы для чистого импорта.
EUREKA! · · 10 мин чтения
Если вы пишете фронтенд, Auto Layout в Figma кажется знакомым: направление, gap, padding, выравнивание, дочерние элементы в режиме hug или fill. Соблазнительно считать, что CSS to Figma Auto Layout — перевод один к одному. Это не так. Flexbox и Grid богаче, браузер вычисляет margin, проценты и intrinsic-размеры, которых в Auto Layout нет, а один и тот же визуальный результат может получаться из совершенно разного CSS.
В этом гайде объясняется, как HTML to Frames переносит CSS-раскладки в Auto Layout, почему каждый результат проверяется по браузеру, где проходят границы и как писать CSS, который чисто импортируется.
Подход: сначала геометрия, потом вывод
Наивный конвертер читает display: flex и копирует свойства. Это быстро ломается: flex-контейнер с gap: 0 и margin у дочерних элементов, блочный элемент, который лишь выглядит как вертикальный стек, или grid, который рендерится двумя аккуратными рядами.
HTML to Frames работает от того, что браузер реально отрисовал:
- Сборка с точностью до пикселя. Сначала страница собирается в Figma с абсолютными позициями из измеренной браузером геометрии.
- Обход изнутри наружу. Начиная с самых глубоких фреймов, плагин по позициям и размерам выводит вертикальные стеки, горизонтальные стеки, переносящиеся ряды, gap, padding и выравнивание.
- Адаптивный смысл. Центрированный контент получает Center, блоки с max-width остаются по центру, одинаковые карточки и
flex-growполучают Fill, а в панели «логотип … меню … иконки» промежуточный элемент становится Fill. - Проверка. Auto Layout применяется, а затем позиция каждого дочернего элемента сверяется с оригиналом с допуском 2 px.
- Безопасный откат. Если проверка не прошла, пробуется более простой план. Если не проходит и он, фрейм сохраняет абсолютные позиции с разумными constraints (Stretch, Scale, Center, Min, Max).
Поскольку вывод строится от отрисованной геометрии, стопка блочных элементов становится вертикальным Auto Layout так же, как flex-колонка. Механизм CSS важен меньше, чем результат. Общий обзор — в статье Auto Layout: как это устроено.
Таблица соответствий
Вот как обычно переносятся типовые CSS-паттерны. Считайте это ожидаемым результатом, а не обещанием: последнее слово за проверкой.
| CSS | Результат в Auto Layout Figma | Примечания |
|---|---|---|
flex-direction: column | Вертикальный Auto Layout | Обычный блочный поток тоже сюда попадает |
flex-direction: row | Горизонтальный Auto Layout | |
row-reverse, column-reverse | Стек в отрисованном порядке | Слои идут в визуальном порядке |
gap: 24px | Item spacing 24 | Измеряется по реальным расстояниям |
| Одинаковые margin между соседями | Item spacing | Выводится, если расстояния постоянны |
padding: 32px 24px | Padding сверху/снизу 32, слева/справа 24 | Измеряется по смещениям дочерних элементов |
justify-content: flex-start | Основная ось: start | |
justify-content: center | Основная ось: center | |
justify-content: flex-end | Основная ось: end | |
justify-content: space-between | Space between или промежуточный элемент становится Fill | Шапки часто становятся «логотип, Fill, иконки» |
align-items: center | Поперечная ось: center | |
align-items: stretch | Дочерние элементы Fill по поперечной оси | Когда они действительно растягиваются |
flex: 1 / flex-grow: 1 | Fill container по основной оси | Одинаковые карточки — одинаковые Fill-элементы |
Фиксированная width у дочернего элемента | Фиксированная ширина | |
| Элемент по размеру контента | Hug contents | |
flex-wrap: wrap | Переносящиеся ряды | Используется wrap в Auto Layout |
display: grid с равными колонками | Переносящиеся ряды или вложенные стеки | Зависит от того, что пройдёт проверку |
grid-template-columns со span | Вложенные горизонтальные/вертикальные стеки | Или absolute, если ячейки перекрываются |
max-width + margin: 0 auto | Центрированный блок во фрейме на всю ширину | Контент остаётся по центру при ресайзе |
position: absolute | Absolute внутри своего фрейма, с constraints | Перекрытия не укладываются в стек |
position: fixed / sticky | Поведение fixed или sticky в режиме Present | Шапки работают в прототипах |
z-index | Порядок слоёв | Совпадает с наложением в браузере |
transform: rotate() / scale() | Применяются поворот и масштаб | Skew и 3D пока не поддерживаются |
Flexbox подробно
Направление и порядок
flex-direction определяет, станет ли контейнер горизонтальным или вертикальным стеком. Поскольку вывод опирается на отрисованные позиции, обратные направления и order просто дают слои в визуальном порядке. Что вы видите в браузере, то и получаете в панели слоёв.
Gap и padding
gap — самый чистый вход: одно постоянное расстояние между дочерними элементами, которое напрямую становится item spacing в Auto Layout. Margin между соседями работают, если они одинаковые. Если нет — скажем, 16, 24, 16 — плагин не может выразить это одним gap, и проверка либо выберет другой план, либо оставит позиции абсолютными.
Padding измеряется по тому, где дочерние элементы реально находятся внутри контейнера, поэтому в результат вносят вклад и padding, и толщина border, и внутренние margin.
Justify и align
justify-content соответствует выравниванию по основной оси, align-items — по поперечной. Интересный случай — space-between. В шапке вида «логотип … меню … иконки» плагин делает промежуточный элемент Fill, и при ресайзе логотип остаётся слева, иконки — справа, а середина растягивается. Это именно тот адаптивный смысл, которого вы ждёте, а не фиксированный отступ, работающий лишь в одной ширине.
flex-grow и Fill
Дочерние элементы с flex-grow или flex: 1 становятся Fill container. Ряды одинаковых карточек становятся одинаковыми Fill-элементами, так что при ресайзе родительского фрейма карточки меняют размер вместе — как в браузере.
Перенос
flex-wrap: wrap соответствует режиму wrap в Auto Layout и даёт переносящиеся ряды. Это естественный вариант для списков тегов, стен логотипов и сеток карточек на flexbox.
CSS Grid подробно
Auto Layout в Figma — модель стеков, а не двумерная сетка. Поэтому grid-раскладки переносятся в ближайшую структуру, которая проходит проверку:
- Равномерные сетки (равные колонки, равные gap) обычно становятся переносящимися рядами.
- Асимметричные сетки (сайдбар и основная колонка, деление 2:1) обычно становятся вложенными стеками: горизонтальный стек из вертикальных или наоборот.
- Ячейки со span и перекрытиями, которые не раскладываются на стеки, сохраняют абсолютные позиции с constraints.
В любом случае визуальный результат совпадает с браузером в пределах допуска. Меняется лишь то, какую часть фрейма можно гибко ресайзить в Figma.
Абсолютное позиционирование, центрирование и auto-margin
position: absolute
Абсолютно позиционированный бейдж, декоративное пятно или оверлей не место в стеке, потому что перекрывают соседей. Такие элементы сохраняют абсолютные позиции, а плагин назначает им constraints, чтобы они вели себя разумно при ресайзе родителя: бейдж, прибитый к правому верхнему углу, там и остаётся, полноэкранный оверлей растягивается.
max-width и margin: auto
Классический контейнер max-width: 1200px; margin: 0 auto становится центрированным блоком внутри фрейма на всю ширину. Здесь же вступает в игру Site width: плагин измеряет реальную дизайн-ширину страницы при импорте. Full-bleed-дизайны приходят в ширине 1920 с контентом по центру, сайты с контейнером — в ширине контейнера, резиновые — в 1440. Измеренное значение сохраняет логику вашего контейнера.
Auto-margin во flex
margin-left: auto у flex-элемента отталкивает его в конец — частый паттерн в навигации. Как и space-between, это выводится из геометрии, обычно как промежуточный Fill-элемент, удерживающий отодвинутый элемент у дальнего края.
Почему важна проверка
Без проверки у конвертеров два плохих варианта: применять Auto Layout везде и мириться с тем, что часть фреймов съезжает, перекрывается или схлопывается, — или избегать Auto Layout и отдавать замороженные абсолютные слои.
HTML to Frames применяет Auto Layout, а затем проверяет позицию каждого дочернего элемента с точностью 2 px. Если фрейм не проходит, пробуется более простой план; если не проходит и он, фрейм остаётся абсолютным. Дизайн никогда не ломается. Вы можете доверять тому, что видите в Figma: это совпадает с браузером, а полученный Auto Layout действительно держится.
Экран результатов показывает общую долю Auto Layout, а для фреймов, оставшихся абсолютными, объясняет почему (диагностика). Вопрос «почему здесь нет Auto Layout?» превращается в конкретную правку в вашем CSS.
В наших тестах на реальных сайтах Auto Layout выводился примерно для 86–97 процентов фреймов — например, 93 процента на одном продуктовом сайте и 88 процентов на Linear и Stripe. Ваши цифры зависят от того, как написан CSS.
Ограничения
- Семантики двумерной сетки в Auto Layout нет; сетки становятся переносящимися рядами или вложенными стеками, а сложные span могут остаться абсолютными.
- Неравномерные отступы между соседями нельзя выразить одним gap.
- Перекрытия (отрицательные margin, абсолютные дочерние элементы) оставляют такие элементы абсолютными.
- Skew и 3D-трансформации, clip-path через
path(), многослойные маски и цвета Display-P3 пока не конвертируются. - Встроенный контент — iframe, WebGL-canvas и видео без постера — приходит как скриншот своего блока.
- Одна ширина за раз. Каждый экран раскладывается в своей ширине. Используйте responsive set (Desktop, Tablet, Mobile), чтобы захватить каждый брейкпоинт отдельным фреймом.
Советы: как писать CSS, который чисто импортируется
Эти привычки чаще дают Auto Layout — и в любом случае это хорошая практика CSS.
- Используйте
gapвместо margin между соседями. Одно постоянное значение напрямую становится item spacing. - Держите отступы одинаковыми внутри контейнера. Разнобой вынуждает откат.
- Для одномерных раскладок предпочитайте flexbox. Навигация, тулбары, группы кнопок и ряды карточек переносятся напрямую.
- Для сеток карточек используйте grid с равными треками. Равные колонки становятся чистыми переносящимися рядами.
- Оборачивайте асимметричные раскладки в явные контейнеры. Сайдбар и область контента в собственном flex-ряду дают понятные вложенные стеки.
- Используйте
flex: 1для элементов, которые должны растягиваться. Это сигнал для Fill. - Центрируйте контент через
max-widthиmargin: 0 auto. Он станет центрированным блоком, который остаётся по центру. - Оставьте
position: absoluteдля настоящих оверлеев. Не используйте его для обычной раскладки. - Избегайте отрицательных margin в раскладке. Они создают перекрытия, которые нельзя уложить в стек.
- Называйте цвета через custom properties. Со Styles & variables (Pro)
--brand-primaryстановится переменнойbrand/primary. - Используйте настоящий текст. Текст на картинках не может стать редактируемым текстовым слоем.
Как увидеть соответствие на своём коде
Быстрее всего понять, как переносится ваш CSS, — импортировать его. Вставьте код или загрузите папку через сценарий HTML to Figma, захватите локальную сборку расширением для Chrome или попросите AI-инструмент отправить её через MCP. Затем откройте экран результатов, проверьте долю Auto Layout и прочитайте диагностику для фреймов, оставшихся абсолютными.
Включите Reference screenshot (Pro), чтобы добавить скрытый заблокированный слой с оригинальной страницей и переключаться между импортом и рендером браузера. Включите Detailed layers (Pro), если нужна более подробная структура слоёв.
Подробнее о том, как страницы становятся фреймами, — в разделе о конвертации HTML to frame, а всё, что поддерживает импорт, — на странице возможностей. В документации подробно описана каждая опция импорта.
Частые вопросы
- HTML to Frames читает мой CSS, чтобы создать Auto Layout?
- Плагин работает от отрисованной браузером геометрии, а не копирует CSS-свойства. Сначала страница собирается с точностью до пикселя, затем изнутри наружу выводятся стеки, gap, padding и выравнивание. Позиция каждого дочернего элемента проверяется с точностью 2 px, поэтому результат совпадает с тем, что нарисовал браузер, — будь раскладка на flexbox, grid или обычном блочном потоке.
- Как конвертируется CSS Grid, если в Figma нет grid в Auto Layout?
- Сетки переносятся в ближайшую структуру, которая проходит проверку. Равномерные сетки с равными колонками обычно становятся переносящимися рядами, асимметричные раскладки — вложенными горизонтальными и вертикальными стеками, а ячейки со сложными span или перекрытиями сохраняют абсолютные позиции с constraints. Визуальный результат в любом случае совпадает с браузером.
- Что происходит, если фрейм не может стать Auto Layout?
- Сначала пробуется более простой план раскладки. Если и он не проходит проверку, фрейм сохраняет абсолютные позиции и получает разумные constraints — Stretch, Scale, Center, Min или Max, — чтобы корректно вести себя при ресайзе. Экран результатов объясняет, почему каждый такой фрейм остался абсолютным, и это помогает поправить CSS.
- flex-grow становится Fill container в Figma?
- Да, в типичных случаях. Элементы, растущие через flex-grow или flex: 1, становятся Fill container, а ряды одинаковых карточек — одинаковыми Fill-элементами. В шапках, где логотип, меню и иконки разнесены, промежуточный элемент становится Fill, и при ресайзе фрейма крайние элементы остаются прижатыми к краям.
- Какая часть страницы обычно получает Auto Layout?
- В наших тестах на реальных сайтах Auto Layout выводился примерно для 86–97 процентов фреймов — например, 93 процента на одном продуктовом сайте и 88 процентов на Linear и Stripe. Результат зависит от того, как написан CSS: постоянные gap, flexbox и явные контейнеры повышают долю.
Хватит перерисовывать веб вручную.
Вставьте ссылку и за секунды получите настоящие редактируемые адаптивные слои Figma. Начать можно бесплатно — 10 импортов каждый месяц.