Chakra UI предоставляет мощный механизм для построения адаптивного интерфейса с использованием breakpoints. Одной из ключевых особенностей является возможность задавать массивы значений для стилей, которые автоматически распределяются по определённым точкам останова (breakpoints). Это позволяет создавать гибкий и удобный responsive-дизайн без необходимости писать медиа-запросы вручную.
В Chakra UI любой пропс, который поддерживает responsive-значения, может быть представлен как:
Пример использования массива для свойства fontSize:
<Box fontSize={['12px', '14px', '16px', '18px']}>
Пример текста
</Box>
В этом случае:
'12px' — значение для базового размера (mobile-first,
smallest breakpoint)'14px' — для следующего breakpoints (sm)'16px' — для md'18px' — для lg и вышеВажно: Chakra UI использует mobile-first стратегию, поэтому массив обрабатывается по принципу «снизу вверх»: если значение не указано для более крупного breakpoint, оно наследуется от предыдущего.
Массивы можно применять практически ко всем style-пропсам:
padding, margin, width,
height, display,
gridTemplateColumns и др.
<Box
p={[2, 4, 6, 8]}
w={['100%', '80%', '60%', '40%']}
display={['block', 'flex']}
>
Контент
</Box>
Разбор:
p={[2, 4, 6, 8]} — padding увеличивается с ростом
экрана.w={['100%', '80%', '60%', '40%']} — ширина контейнера
адаптируется под размеры экрана.display={['block', 'flex']} — на маленьких экранах
блок, на больших — flex-контейнер. Если массив короче числа breakpoints,
оставшиеся значения наследуются автоматически.Breakpoints задаются в теме Chakra UI:
const theme = extendTheme({
breakpoints: {
sm: '30em',
md: '48em',
lg: '62em',
xl: '80em',
},
})
Массив [val1, val2, val3, val4] будет
соответствовать:
val1 → base (до sm)val2 → sm и вышеval3 → md и вышеval4 → lg и вышеПри необходимости можно пропускать значения, используя
null:
<Box fontSize={['12px', null, '16px', '18px']}>
Пример текста
</Box>
Здесь значение fontSize для sm будет наследовано от base
(12px), а для md и lg устанавливаются соответственно.
Иногда удобнее использовать объекты для именованных breakpoints:
<Box fontSize={{ base: '12px', md: '16px', lg: '18px' }}>
Текст
</Box>
Разница между массивом и объектом:
1. Адаптивная сетка:
<Grid templateColumns={['repeat(1, 1fr)', 'repeat(2, 1fr)', 'repeat(4, 1fr)']} gap={4}>
<Box bg="red.300" height="100px" />
<Box bg="green.300" height="100px" />
<Box bg="blue.300" height="100px" />
<Box bg="yellow.300" height="100px" />
</Grid>
Сетка автоматически меняет число колонок в зависимости от ширины экрана:
2. Адаптивные отступы:
<Stack spacing={[2, 4, 6]} direction={['column', 'row']}>
<Button>Кнопка 1</Button>
<Button>Кнопка 2</Button>
</Stack>
spacing увеличивается с ростом экрана.direction меняется с вертикальной на
горизонтальную.Массивы значений для breakpoints — это ключевой инструмент Chakra UI для построения responsive интерфейсов. Они позволяют:
Массивы работают с любыми стилевыми пропсами и являются стандартным подходом к адаптивному дизайну в Chakra UI.