Flex-утилиты
Полный набор классов для Flexbox-вёрстки: направление, выравнивание, перенос, gap и flex-grow. Все утилиты имеют адаптивные варианты для каждого брейкпоинта.
Активация flex
| Класс | CSS |
|---|---|
.gr-flex | display: flex |
.gr-inline-flex | display: inline-flex |
Направление (flex-direction)
| Класс | CSS |
|---|---|
.gr-flex-row | flex-direction: row |
.gr-flex-col | flex-direction: column |
Перенос (flex-wrap)
| Класс | CSS |
|---|---|
.gr-flex-wrap | flex-wrap: wrap |
.gr-flex-nowrap | flex-wrap: nowrap |
Выравнивание по главной оси (justify-content)
| Класс | CSS | Поведение |
|---|---|---|
.gr-flex-start | justify-content: flex-start | Элементы в начале |
.gr-flex-center | justify-content: center | Элементы по центру |
.gr-flex-end | justify-content: flex-end | Элементы в конце |
.gr-flex-between | justify-content: space-between | Равномерно с отступами по краям |
.gr-flex-around | justify-content: space-around | Равномерно с половинными отступами |
.gr-flex-evenly | justify-content: space-evenly | Равномерно с одинаковыми отступами |
.gr-flex-start
.gr-flex-center
.gr-flex-between
.gr-flex-evenly
Выравнивание по поперечной оси (align-items)
| Класс | CSS |
|---|---|
.gr-flex-items-start | align-items: flex-start |
.gr-flex-items-center | align-items: center |
.gr-flex-items-end | align-items: flex-end |
.gr-flex-items-stretch | align-items: stretch |
.gr-flex-items-baseline | align-items: baseline |
.gr-flex-items-center
Индивидуальное выравнивание (align-self)
| Класс | CSS |
|---|---|
.gr-flex-self-start | align-self: flex-start |
.gr-flex-self-center | align-self: center |
.gr-flex-self-end | align-self: flex-end |
.gr-flex-self-stretch | align-self: stretch |
Flex-grow
| Класс | CSS |
|---|---|
.gr-flex-1 | flex: 1 |
Gap-утилиты
Классы отступа общие для флекса, сетки и раскладок data-gr-layout:
один .gr-gap вместо отдельных флекс- и грид-модификаторов.
| Класс | Значение gap | До md (768px) | С md |
|---|---|---|---|
.gr-gap-sm | var(--gr-gap-sm) | 0.375rem | 0.5rem |
.gr-gap | var(--gr-gap) | 0.75rem | 1rem |
.gr-gap-lg | var(--gr-gap-lg) | 1.25rem | 2rem |
Отдельных вариантов с суффиксом брейкпоинта нет: значение меняют сами токены, поэтому один и тот же класс даёт меньший отступ на мобильном и привычный — на десктопе.
Центрирование одним классом
<div class="gr-flex gr-flex-center gr-flex-items-center">
<div>Идеально по центру</div>
</div>
Адаптивные варианты
Все flex-утилиты имеют варианты с суффиксом брейкпоинта. Они применяются только начиная с указанного размера экрана.
Доступны суффиксы: -sm, -md, -lg, -xl.
| Базовый класс | Адаптивный вариант | Применение |
|---|---|---|
.gr-flex | .gr-flex-md | flex от 768px |
.gr-flex-row | .gr-flex-row-lg | row от 1024px |
.gr-flex-col | .gr-flex-col-sm | column от 640px |
.gr-flex-wrap | .gr-flex-wrap-xl | wrap от 1280px |
.gr-flex-center | .gr-flex-center-md | center от 768px |
.gr-flex-between | .gr-flex-between-lg | space-between от 1024px |
.gr-flex-items-center | .gr-flex-items-center-md | align-items: center от 768px |
.gr-flex-self-end | .gr-flex-self-end-sm | align-self: flex-end от 640px |
.gr-inline-flex | .gr-inline-flex-md | inline-flex от 768px |
.gr-flex-1 | .gr-flex-1-lg | flex: 1 от 1024px |
Адаптивные варианты действуют от брейкпоинта и выше — накопительно,
в отличие от раскладок data-gr-layout-*, где диапазоны не пересекаются.
Поэтому базовый класс задаёт мобильное поведение, а суффиксные его перекрывают:
.gr-flex-col .gr-flex-row-md — колонка до 768px, ряд дальше.
Порядок классов в атрибуте роли не играет, решает порядок правил в CSS
(sm → md → lg → xl).
<div class="gr-flex gr-flex-col gr-flex-row-md">
<div>На мобильных — колонка</div>
<div>На планшетах — ряд</div>
</div>
Контейнерные варианты
Направление и перенос переключаются и по ширине контейнера — ближайшего
предка с .gr-cq. Суффикс тот же, с буквой c впереди:
.gr-flex-row-cmd против .gr-flex-row-md, шкала —
та же карта брейкпоинтов. Так собирается блок, который стоит то в боковой
колонке, то в содержимом: столбик в узком гнезде, ряд в широком, без второй
разметки и без JS.
| Базовый класс | Контейнерный вариант | Применение |
|---|---|---|
.gr-flex-row | .gr-flex-row-c{sm,md,lg,xl} | row от ширины контейнера |
.gr-flex-col | .gr-flex-col-c{sm,md,lg,xl} | column от ширины контейнера |
.gr-flex-wrap | .gr-flex-wrap-c{sm,md,lg,xl} | wrap от ширины контейнера |
<div class="gr-cq">
<div class="gr-flex gr-flex-col gr-flex-row-csm gr-gap">
<div>В гнезде уже 640px — столбик</div>
<div>От 640px ширины гнезда — ряд</div>
</div>
</div>
Только направление и перенос. Выравнивания
(.gr-flex-center, .gr-flex-items-*,
.gr-flex-self-*), .gr-flex-1 и сам
display контейнерных вариантов не получили: по ширине гнезда
меняется, куда течёт ряд, а не как он выровнен, и каждый суффикс — ещё
четыре правила на класс. Показать или спрятать блок по гнезду —
.gr-hidden-c* / .gr-block-c* из утилит
(контейнерные запросы).
Примеры использования
Флекс — рабочая лошадка одномерных раскладок: всё, что выстраивается
в ряд или колонку, собирается из него и токена .gr-gap-*.
Рецепты ниже — от шапки до скролл-ленты; двумерные сетки и именованные
области — территория грида.
Шапка с навигацией
<header class="gr-flex gr-flex-between gr-flex-items-center gr-p-4">
<div class="gr-flex gr-flex-items-center gr-gap">
<strong>Logo</strong>
<nav class="gr-flex gr-gap">
<a href="#">Home</a>
<a href="#">About</a>
<a href="#">Contact</a>
</nav>
</div>
<button>Login</button>
</header>
Карточки в ряд с переносом
<div class="gr-flex gr-flex-wrap gr-gap">
<div>Карточка 1</div>
<div>Карточка 2</div>
<div>Карточка 3</div>
</div>
Карточка 1
Карточка 2
Карточка 3
Идеальное центрирование
Пустое состояние, сплэш, содержимое модалки — один блок точно по центру
обеих осей. Флексом это пара .gr-flex-center
.gr-flex-items-center; когда центрируется ровно один элемент,
то же самое короче делает .gr-grid-place-center
из грида. Флекс-вариант выигрывает, когда
в центре стоит стопка: спиннер, подпись и кнопка складываются
в .gr-flex-col с зазором.
<div class="gr-flex gr-flex-center gr-flex-items-center gr-min-h-screen">
<div class="gr-flex gr-flex-col gr-flex-items-center gr-gap-sm">
<span class="gr-spinner gr-spinner-lg"></span>
<p class="gr-m-0 gr-text-ink-secondary">Загружаем проекты…</p>
</div>
</div>
.gr-flex-col внутри (в демо высота ограничена)Загружаем проекты…
Выравнивание по базовой линии
Цена «2900 ₽ /мес» и шапка секции с ссылкой «Все →» — случаи, где
элементы разного кегля должны стоять на одной строчной линии, а не
по центру блока: центр у разных кеглей «пляшет».
.gr-flex-items-baseline сажает всех на базовую линию текста,
.gr-flex-between разводит заголовок и ссылку по краям.
<!-- цена -->
<p class="gr-flex gr-flex-items-baseline gr-gap-sm">
<span class="gr-text-4xl gr-font-extrabold">2900 ₽</span>
<span class="gr-text-sm gr-text-ink-secondary">/мес</span>
</p>
<!-- шапка секции -->
<div class="gr-flex gr-flex-between gr-flex-items-baseline">
<h2>Новинки</h2>
<a href="#">Все →</a>
</div>
Горизонтальная скролл-лента
Мобильный ряд категорий или карточек «с этим покупают»: ряд не
переносится (.gr-flex-nowrap) и прокручивается пальцем —
.gr-overflow-x-auto на контейнере. Карточкам нельзя
сжиматься; класса «flex-none» в ядре нет, и он не нужен — флекс
не сжимает элемент ниже его минимума, поэтому ширину ленты держит
.gr-min-w-[160px] произвольным значением. Прищёлкивание
к краю (scroll-snap) в утилитах не живёт — при желании это две строки
своего CSS поверх той же разметки.
<div class="gr-flex gr-flex-nowrap gr-gap gr-overflow-x-auto gr-pb-2">
<div class="gr-min-w-[160px]">Карточка</div>
<div class="gr-min-w-[160px]">Карточка</div>
…
</div>