Stack — это компонент библиотеки MUI (Material-UI), предназначенный для упрощённого создания вертикальных и горизонтальных макетов без необходимости использовать сложные CSS-сетки или flexbox вручную. Он оборачивает дочерние элементы и автоматически управляет их расположением и промежутками.
direction Определяет направление компоновки элементов. Может принимать значения:
"row" — горизонтальная компоновка, элементы
выстраиваются слева направо;"column" — вертикальная компоновка, элементы
располагаются сверху вниз (значение по умолчанию);"row-reverse" и "column-reverse" —
зеркальное отображение по оси.Пример:
import Stack from '@mui/material/Stack';
import Button from '@mui/material/Button';
<Stack direction="row" spacing={2}>
<Button>Кнопка 1</Button>
<Button>Кнопка 2</Button>
<Button>Кнопка 3</Button>
</Stack>
В данном примере кнопки выстроятся горизонтально с промежутком между ними.
<Stack spacing={4} direction="column">
<Button>Кнопка A</Button>
<Button>Кнопка B</Button>
</Stack>
Здесь элементы будут разделены 32px (8px * 4).
alignItems Контролирует выравнивание элементов по перпендикулярной оси. Основные варианты:
"flex-start" — по началу контейнера;"center" — по центру;"flex-end" — по концу;"stretch" — растягивание на всю высоту/ширину
контейнера.Пример для вертикального стека:
<Stack direction="column" spacing={2} alignItems="center">
<Button>Центрированная кнопка 1</Button>
<Button>Центрированная кнопка 2</Button>
</Stack>
justifyContent Управляет распределением элементов вдоль основной оси. Поддерживает все стандартные значения flexbox:
"flex-start", "center",
"flex-end", "space-between",
"space-around", "space-evenly".<Stack direction="row" spacing={2} justifyContent="space-between">
<Button>Левая</Button>
<Button>Центр</Button>
<Button>Правая</Button>
</Stack>
Stack отлично поддерживает вложенность. Можно создавать сложные макеты, комбинируя вертикальные и горизонтальные стеки:
<Stack spacing={4}>
<Stack direction="row" spacing={2}>
<Button>Кнопка 1</Button>
<Button>Кнопка 2</Button>
</Stack>
<Stack direction="row" spacing={2} justifyContent="center">
<Button>Кнопка 3</Button>
<Button>Кнопка 4</Button>
</Stack>
</Stack>
Вложенные стеки позволяют легко комбинировать различные выравнивания и направления, что делает компонент очень гибким для построения интерфейсов.
Для визуального разделения элементов Stack можно использовать компонент Divider из MUI. Stack автоматически вставляет его между элементами:
import Divider from '@mui/material/Divider';
<Stack direction="row" spacing={2} divider={<Divider orientation="vertical" flexItem />}>
<Button>Элемент 1</Button>
<Button>Элемент 2</Button>
<Button>Элемент 3</Button>
</Stack>
Для вертикального стека orientation="horizontal" создаст
разделительные линии между строками.
Свойство direction может принимать объект с брейкпоинтами, что позволяет менять ориентацию стека в зависимости от ширины экрана:
<Stack
direction={{ xs: 'column', sm: 'row' }}
spacing={2}
>
<Button>Мобильная кнопка 1</Button>
<Button>Мобильная кнопка 2</Button>
</Stack>
На маленьких экранах элементы будут вертикальными, а на больших — горизонтальными.
<Stack direction="row" spacing={2} sx={{ backgroundColor: 'lightgray', padding: 2 }}>
<Button>Стиль 1</Button>
<Button>Стиль 2</Button>
</Stack>
Stack компилируется в обычный flex-контейнер, что делает его лёгким и быстрым. В отличие от Grid, он удобен для простых последовательностей элементов, где не требуется сложная сетка.
Ключевые рекомендации:
Stack обеспечивает быстрый, гибкий и понятный способ управления пространством между элементами интерфейса, делая код чище и уменьшает необходимость писать кастомный CSS для большинства типовых задач по компоновке.