В MUI (Material-UI) spacing является фундаментальной частью системы дизайна, отвечающей за отступы, размеры элементов и согласованность интерфейса. В основе лежит единая числовая шкала, которая позволяет управлять отступами и размерами компонентов в единых пропорциях.
MUI использует константу spacing, определяемую в
теме (theme). По умолчанию базовая единица равна 8
пикселям. Это означает, что вызов theme.spacing(1)
вернёт 8px, theme.spacing(2) —
16px и так далее.
const useStyles = makeStyles((theme) => ({
box: {
margin: theme.spacing(2), // 16px
padding: theme.spacing(3), // 24px
},
}));
Таким образом, spacing создаёт модульную систему, где все отступы и размеры выстраиваются по кратным числам, обеспечивая визуальную гармонию.
MUI интегрирует spacing непосредственно в компоненты через
системные пропсы, такие как sx,
margin, padding.
Пример с sx:
<Box sx={{ m: 2, p: 3 }}>
Контент с отступами
</Box>
Здесь m — сокращение для margin,
p — для padding. Значения цифр автоматически
умножаются на базовую единицу spacing (по умолчанию 8px).
Расширенные сокращения:
mt — margin-topmb — margin-bottomml — margin-leftmr — margin-rightmx — margin-left + margin-rightmy — margin-top + margin-bottomАналогично для padding: pt, pb,
pl, pr, px, py.
<Box sx={{ mt: 4, px: 2 }}>
Верхний отступ 32px, горизонтальные 16px
</Box>
Базовая единица может быть изменена при создании темы:
import { createTheme } from '@mui/material/styles';
const theme = createTheme({
spacing: 10, // теперь 1 единица = 10px
});
После этого вызов theme.spacing(2) вернёт
20px. Это особенно полезно при адаптации приложения к
дизайн-системе с отличными от стандартных масштабами.
Использование spacing эффективно в Grid и Flexbox.
Grid пример:
<Grid container spacing={3}>
<Grid item xs={6}>
Первый блок
</Grid>
<Grid item xs={6}>
Второй блок
</Grid>
</Grid>
Здесь spacing={3} означает интервал между элементами
24px (3 × 8). Grid автоматически применяет отрицательные
маргины для контейнера и padding для элементов, чтобы сохранить
консистентные зазоры.
Flexbox пример с sx:
<Box sx={{ display: 'flex', gap: 2 }}>
<Button>Кнопка 1</Button>
<Button>Кнопка 2</Button>
</Box>
Проп gap также использует базовую единицу spacing,
обеспечивая равномерные промежутки между элементами без
сложного расчёта margin.
theme.spacing может принимать несколько аргументов для
создания комплексных значений:
theme.spacing(1, 2, 3, 4);
// вернёт '8px 16px 24px 32px'
Параметры следуют стандартной CSS-последовательности:
top right bottom left. Это позволяет задавать
индивидуальные отступы для каждой стороны блока через единый вызов
функции.
sx, Grid, Box
и другие системные компонентыИспользование единой базовой единицы spacing обеспечивает согласованность интерфейса, облегчает масштабирование и поддержку кода, а также упрощает адаптивное проектирование и настройку темы под конкретные требования дизайна.