В Chakra UI Grid используется для построения сложных
макетов с использованием строк и колонок, аналогично CSS Grid, но с
интеграцией в систему компонентов React. Основной компонент —
<Grid> — служит контейнером для элементов
<GridItem> или любых дочерних компонентов, которым
можно задавать позиционирование и размеры через пропсы.
import { Grid, GridItem, Box } from "@chakra-ui/react";
<Grid templateColumns="repeat(3, 1fr)" gap={4}>
<GridItem w="100%" h="100px" bg="red.500" />
<GridItem w="100%" h="100px" bg="green.500" />
<GridItem w="100%" h="100px" bg="blue.500" />
</Grid>
Здесь templateColumns="repeat(3, 1fr)" создает три
колонки одинаковой ширины. Проп gap={4} задает отступы
между элементами сетки.
templateColumns — определяет количество колонок и их ширину. Можно использовать:
repeat(n, 1fr) — n равных колонокauto — ширина по содержимому100px, 200px)templateRows — аналогично, задает строки
autoFlow — определяет порядок заполнения сетки:
row (по строкам) или column (по
колонкам)
Пример с разной шириной колонок:
<Grid templateColumns="200px 1fr 2fr" gap={6}>
<GridItem bg="yellow.300" h="100px" />
<GridItem bg="teal.300" h="100px" />
<GridItem bg="pink.300" h="100px" />
</Grid>
Каждый <GridItem> может задавать позицию и
размеры через строковые и колонковые свойства:
colSpan — количество колонок, которое занимает
элементrowSpan — количество строкcolStart, colEnd, rowStart,
rowEnd — позиция начала и конца элемента в сетке<Grid templateColumns="repeat(4, 1fr)" gap={4}>
<GridItem colSpan={2} bg="red.400" h="80px" />
<GridItem colSpan={1} bg="blue.400" h="80px" />
<GridItem colSpan={1} bg="green.400" h="80px" />
<GridItem colSpan={4} bg="purple.400" h="50px" />
</Grid>
Элемент с colSpan={2} занимает две колонки, а элемент с
colSpan={4} растягивается на всю ширину.
Chakra UI полностью поддерживает адаптивные сетки через массивы или объекты для пропсов. Это позволяет задавать разные значения для разных точек останова.
<Grid
templateColumns={{ base: "1fr", md: "repeat(2, 1fr)", lg: "repeat(4, 1fr)" }}
gap={6}
>
<GridItem bg="red.200" h="100px" />
<GridItem bg="green.200" h="100px" />
<GridItem bg="blue.200" h="100px" />
<GridItem bg="yellow.200" h="100px" />
</Grid>
base — для мобильных устройствmd — для средних экрановlg — для больших экрановЭто позволяет создавать гибкие макеты без медиа-запросов в CSS.
Grid в Chakra UI наследует все возможности CSS Grid для выравнивания:
justifyItems — выравнивание элементов по горизонтали
внутри ячеек (start, center, end,
stretch)alignItems — по вертикали (start,
center, end, stretch)justifyContent — выравнивание всей сетки по
горизонталиalignContent — выравнивание всей сетки по
вертикали<Grid
templateColumns="repeat(3, 1fr)"
justifyItems="center"
alignItems="center"
gap={4}
>
<GridItem w="50px" h="50px" bg="red.300" />
<GridItem w="50px" h="50px" bg="blue.300" />
<GridItem w="50px" h="50px" bg="green.300" />
</Grid>
Элементы будут выровнены по центру ячеек, а сетка — по центру контейнера.
Для сложных макетов удобно использовать именованные
области через templateAreas:
<Grid
templateAreas={`"header header"
"sidebar main"
"footer footer"`}
gridTemplateRows="50px 1fr 30px"
gridTemplateColumns="150px 1fr"
gap={4}
>
<GridItem area="header" bg="red.200" />
<GridItem area="sidebar" bg="blue.200" />
<GridItem area="main" bg="green.200" />
<GridItem area="footer" bg="yellow.200" />
</Grid>
area — связывает GridItem с областьюtemplateAreas задает визуальную схему сетки, упрощая
чтение макетаgap — общий отступ между элементамиrowGap — вертикальный отступcolumnGap — горизонтальный отступ<Grid templateColumns="repeat(3, 1fr)" gap={6} rowGap={8} columnGap={4}>
<GridItem bg="red.300" h="100px" />
<GridItem bg="blue.300" h="100px" />
<GridItem bg="green.300" h="100px" />
</Grid>
Grid отлично комбинируется с <Box> и
<Flex> для более сложных компонентов. Например,
внутри ячейки Grid можно создать Flex-контейнер с вертикальным или
горизонтальным расположением элементов.
<Grid templateColumns="repeat(2, 1fr)" gap={6}>
<GridItem bg="purple.200" h="150px">
<Flex direction="column" justify="center" align="center" h="100%">
<Box bg="white" w="50px" h="50px" />
<Box bg="gray.300" w="30px" h="30px" mt={2} />
</Flex>
</GridItem>
<GridItem bg="orange.200" h="150px" />
</Grid>
Это позволяет создавать вложенные структуры и управлять выравниванием на нескольких уровнях одновременно.
Grid в Chakra UI сочетает гибкость CSS Grid с простотой и читаемостью React-компонентов, обеспечивая мощный инструмент для построения адаптивных и сложных макетов.