В Chakra UI система адаптивного дизайна построена на breakpoints, которые позволяют изменять стили компонентов в зависимости от ширины экрана. Одним из самых мощных инструментов является объектная нотация, обеспечивающая ясное и гибкое управление стилями для разных размеров экранов.
Breakpoints в Chakra UI задаются в объекте темы (theme)
в разделе breakpoints:
const theme = extendTheme({
breakpoints: {
sm: "30em", // 480px
md: "48em", // 768px
lg: "62em", // 992px
xl: "80em", // 1280px
"2xl": "96em" // 1536px
}
});
Каждое значение задаёт минимальную ширину экрана, начиная с которой будут применяться стили для соответствующего брейкпоинта. Важно, что Chakra UI использует mobile-first подход, то есть стили применяются сначала к маленьким экранам, а затем расширяются для больших.
Объектная нотация позволяет задавать стили сразу для нескольких
брейкпоинтов, используя ключи с именами breakpoints. Пример для
компонента Box:
<Box
w={{ base: "100%", md: "50%", lg: "25%" }}
p={{ base: 2, md: 4, lg: 6 }}
bg={{ base: "gray.100", md: "gray.200", lg: "gray.300" }}
>
Контент
</Box>
Разбор примера:
base — значение для всех экранов по умолчанию.md — применяется при ширине >= 768px.lg — применяется при ширине >= 992px.Объектная нотация работает со всеми стилевыми свойствами Chakra UI, включая:
w, h,
minW, maxW, minH,
maxH.m, mt,
mr, mb, ml, mx,
my, p, pt, pr,
pb, pl, px, py.color, bg,
bgGradient, borderColor.fontSize,
lineHeight, letterSpacing,
fontWeight.borderRadius,
borderWidth, borderStyle,
boxShadow.Например:
<Text
fontSize={{ base: "sm", md: "md", lg: "lg" }}
color={{ base: "red.500", md: "blue.500", lg: "green.500" }}
lineHeight={{ base: "short", md: "shorter", lg: "shortest" }}
>
Адаптивный текст
</Text>
Объектная нотация может использоваться внутри псевдоклассов
(_hover, _focus, _active) и
вложенных объектов:
<Button
bg={{ base: "gray.200", md: "gray.400", lg: "gray.600" }}
_hover={{
bg: { base: "gray.300", md: "gray.500", lg: "gray.700" }
}}
_active={{
transform: { base: "scale(0.95)", md: "scale(0.98)" }
}}
>
Кнопка
</Button>
Это позволяет полностью контролировать поведение компонента на разных экранах без дублирования кода.
Сетка карточек:
<SimpleGrid
columns={{ base: 1, sm: 2, md: 3, lg: 4 }}
spacing={{ base: 2, md: 4, lg: 6 }}
>
{cards.map(card => (
<Box key={card.id} bg="white" p={{ base: 4, md: 6 }}>
{card.content}
</Box>
))}
</SimpleGrid>
Адаптивная панель навигации:
<Flex
direction={{ base: "column", md: "row" }}
align={{ base: "stretch", md: "center" }}
justify={{ base: "flex-start", md: "space-between" }}
p={{ base: 2, md: 4 }}
>
<Logo />
<MenuLinks />
</Flex>
base
и одного брейкпоинта (md или lg).<Box
w={["100%", "50%", "33.33%", "25%"]} // массивная нотация
p={{ base: 2, md: 4, lg: 6 }} // объектная нотация
>
Контент
</Box>
theme.breakpoints позволяет создавать
динамические стили, привязанные к единым значениям
ширины экрана, облегчая поддержку проекта.Объектная нотация в Chakra UI обеспечивает гибкую и структурированную работу с адаптивным дизайном, позволяя создавать сложные интерфейсы без громоздких медиазапросов и дублирования кода. Она идеально интегрируется с системой темы, псевдоклассами и любыми CSS-свойствами компонентов.