Компонент Wrap в Chakra UI предназначен для удобного расположения элементов в строке с автоматическим переносом на следующую линию, когда пространство ограничено. Это особенно полезно для списков карточек, кнопок, тегов и любых компонентов, которые должны выстраиваться в ряды с гибкой адаптацией под ширину контейнера.
Wrap является оберткой, которая сочетает возможности
flexbox и управления промежутками между элементами, обеспечивая чистый и
предсказуемый дизайн.
import { Wrap, WrapItem, Box } from "@chakra-ui/react";
function Example() {
return (
<Wrap spacing="30px">
<WrapItem>
<Box w="100px" h="100px" bg="teal.500" />
</WrapItem>
<WrapItem>
<Box w="100px" h="100px" bg="orange.500" />
</WrapItem>
<WrapItem>
<Box w="100px" h="100px" bg="purple.500" />
</WrapItem>
</Wrap>
);
}
Ключевые моменты:
Wrap — контейнер для элементов.WrapItem — оборачивает каждый дочерний элемент, чтобы
управлять отступами и поведением при переносе.spacing — определяет промежуток между элементами, может
задаваться в пикселях, единицах rem или по шкале Chakra
(spacing="4").spacingОпределяет расстояние между WrapItem. Может задаваться
через:
spacing="20px"spacing={4} (равно
1rem)responsive arrayПример:
<Wrap spacing={[2, 4, 6]}>
<WrapItem><Box w="50px" h="50px" bg="red.400" /></WrapItem>
<WrapItem><Box w="50px" h="50px" bg="blue.400" /></WrapItem>
</Wrap>
Массив [2, 4, 6] задаёт разные значения
spacing для мобильного, планшета и десктопа.
directionУправляет направлением расположения элементов:
row (по умолчанию) — горизонтальный рядcolumn — вертикальное расположение с переносомПример вертикального расположения:
<Wrap direction="column" spacing="20px">
<WrapItem><Box w="80px" h="80px" bg="green.400" /></WrapItem>
<WrapItem><Box w="80px" h="80px" bg="pink.400" /></WrapItem>
</Wrap>
align и
justifyУправляют выравниванием элементов внутри контейнера:
align — выравнивание по вертикали (top, center, bottom,
stretch)justify — выравнивание по горизонтали (start, center,
end, space-between, space-around, space-evenly)Пример:
<Wrap align="center" justify="space-between" spacing="10px">
<WrapItem><Box w="60px" h="60px" bg="yellow.400" /></WrapItem>
<WrapItem><Box w="60px" h="60px" bg="blue.400" /></WrapItem>
<WrapItem><Box w="60px" h="60px" bg="red.400" /></WrapItem>
</Wrap>
shouldWrapChildrenФлаг, который автоматически оборачивает всех прямых детей в
WrapItem.
Пример:
<Wrap spacing="15px" shouldWrapChildren>
<Box w="70px" h="70px" bg="purple.300" />
<Box w="70px" h="70px" bg="teal.300" />
</Wrap>
Преимущество: нет необходимости вручную добавлять
WrapItem для каждого ребенка.
<Wrap spacing="12px">
{['Применить', 'Сбросить', 'Отменить', 'Сохранить'].map((label) => (
<WrapItem key={label}>
<Button colorScheme="blue">{label}</Button>
</WrapItem>
))}
</Wrap>
<Wrap spacing="20px">
{Array.from({ length: 8 }).map((_, idx) => (
<WrapItem key={idx}>
<Box w="150px" h="150px" bg={`gray.${100 + idx * 100}`} borderRadius="md" />
</WrapItem>
))}
</Wrap>
<Wrap spacing="8px">
{['React', 'JavaScript', 'Chakra UI', 'CSS', 'HTML'].map((tag) => (
<WrapItem key={tag}>
<Badge colorScheme="green">{tag}</Badge>
</WrapItem>
))}
</Wrap>
Wrap отлично работает с адаптивными массивами Chakra
UI:
<Wrap spacing={[2, 4, 6]} justify={['center', 'space-between', 'flex-start']}>
{Array.from({ length: 6 }).map((_, i) => (
<WrapItem key={i}>
<Box w={['50px', '70px', '100px']} h={['50px', '70px', '100px']} bg="blue.200" />
</WrapItem>
))}
</Wrap>
В этом примере:
Wrap автоматически перестраивает ряды при переносе на
мобильных устройствах.Wrap наследует поведение flexbox, но добавляет удобный
перенос с равными промежутками.WrapItem, но можно включить
shouldWrapChildren для автоматической обертки.shouldWrapChildren для сокращения кода.Box с одинаковой шириной и высотой, чтобы избежать
визуальных сдвигов.spacing и
justify для корректного отображения на всех
устройствах.Box и Badge для быстрого
создания интерфейсных компонентов без лишней разметки.Компонент Wrap в Chakra UI обеспечивает гибкую и чистую организацию элементов с автоматическим переносом, делая интерфейсы аккуратными и адаптивными без сложной работы с CSS.