Адаптивность интерфейсов — ключевая особенность современных веб-приложений. Компоненты должны корректно выглядеть и вести себя на различных устройствах: смартфонах, планшетах, ноутбуках и широкоформатных мониторах. Библиотека Chakra UI предоставляет встроенную систему адаптивных значений, основанную на breakpoint-ах.
Для управления значениями, зависящими от ширины экрана, используется хук useBreakpointValue. Он позволяет динамически выбирать значение на основе текущего breakpoint-а.
Этот механизм применяется для:
Хук возвращает одно значение, которое соответствует текущему breakpoint-у.
const value = useBreakpointValue(values, options)
values
Объект или массив значений, соответствующих breakpoint-ам.
options
Дополнительные параметры конфигурации.
Значение, соответствующее активному breakpoint-у.
По умолчанию Chakra UI использует следующую шкалу breakpoint-ов:
| Название | Минимальная ширина |
|---|---|
| base | 0px |
| sm | 480px |
| md | 768px |
| lg | 992px |
| xl | 1280px |
| 2xl | 1536px |
Хук автоматически определяет текущий диапазон и возвращает соответствующее значение.
Простейший пример — изменение размера текста.
import { Text } from "@chakra-ui/react"
import { useBreakpointValue } from "@chakra-ui/react"
function ResponsiveText() {
const fontSize = useBreakpointValue({
base: "16px",
md: "20px",
lg: "24px"
})
return <Text fontSize={fontSize}>Responsive text</Text>
}
Логика работы:
Компонент автоматически адаптируется при изменении ширины окна.
Вместо объекта можно использовать массив.
const value = useBreakpointValue(["column", "column", "row"])
Порядок элементов массива соответствует breakpoint-ам:
| Индекс | Breakpoint |
|---|---|
| 0 | base |
| 1 | sm |
| 2 | md |
| 3 | lg |
| 4 | xl |
Пример использования:
const direction = useBreakpointValue(["column", "row"])
<Flex direction={direction}>
...
</Flex>
На мобильных устройствах элементы будут располагаться вертикально, а на больших экранах — горизонтально.
useBreakpointValue часто используется для изменения структуры интерфейса.
const columns = useBreakpointValue({
base: 1,
md: 2,
lg: 4
})
Применение в Grid:
<Grid templateColumns={`repeat(${columns}, 1fr)`} gap={6}>
...
</Grid>
Результат:
| Экран | Количество колонок |
|---|---|
| мобильный | 1 |
| планшет | 2 |
| десктоп | 4 |
Компоненты Chakra UI часто имеют несколько вариантов оформления.
Хук позволяет менять вариант в зависимости от устройства.
const variant = useBreakpointValue({
base: "solid",
md: "outline"
})
<Button variant={variant}>
Button
</Button>
Поведение:
Это удобно для уменьшения визуальной нагрузки на маленьких экранах.
Размеры компонентов также могут изменяться.
const size = useBreakpointValue({
base: "sm",
md: "md",
lg: "lg"
})
<Button size={size}>Action</Button>
Типичное применение:
Отступы сильно влияют на восприятие интерфейса.
const padding = useBreakpointValue({
base: 4,
md: 6,
lg: 10
})
Использование:
<Box p={padding}>
Content
</Box>
Мобильная версия получает меньшие отступы, что экономит пространство.
Иногда требуется отображать элементы только на определённых устройствах.
const display = useBreakpointValue({
base: "none",
md: "block"
})
Пример:
<Box display={display}>
Desktop content
</Box>
Элемент:
Хук можно использовать не только для стилей, но и для логики.
Пример — переключение типа навигации.
const isMobile = useBreakpointValue({
base: true,
md: false
})
Дальнейшая логика:
return isMobile ? <MobileMenu /> : <DesktopMenu />
В зависимости от ширины экрана отображается разный компонент.
Пример адаптивного layout-а:
const direction = useBreakpointValue({
base: "column",
md: "row"
})
const gap = useBreakpointValue({
base: 4,
md: 8
})
<Flex direction={direction} gap={gap}>
<Box>Item 1</Box>
<Box>Item 2</Box>
</Flex>
На мобильных устройствах:
На десктопе:
Во время серверного рендеринга (SSR) ширина окна неизвестна. Поэтому
хук может возвращать undefined.
Для предотвращения этого используется параметр fallback.
const value = useBreakpointValue(
{ base: "mobile", md: "desktop" },
{ fallback: "md" }
)
В этом случае при SSR используется значение breakpoint-а md.
Chakra UI позволяет настраивать breakpoint-ы в теме.
const theme = extendTheme({
breakpoints: {
base: "0px",
tablet: "640px",
laptop: "1024px",
desktop: "1280px"
}
})
После этого useBreakpointValue использует новую систему:
const layout = useBreakpointValue({
base: "stack",
tablet: "grid",
desktop: "flex"
})
Chakra UI поддерживает два основных механизма адаптивности:
<Box fontSize={{ base: "16px", md: "20px" }} />
const fontSize = useBreakpointValue({
base: "16px",
md: "20px"
})
| Подход | Назначение |
|---|---|
| Responsive props | изменение CSS-свойств |
| useBreakpointValue | управление логикой |
useBreakpointValue полезен, когда значение используется внутри JavaScript-логики.
Хук использует matchMedia, поэтому изменения breakpoint-ов отслеживаются через медиа-запросы браузера.
Преимущества:
function Card() {
const direction = useBreakpointValue({
base: "column",
md: "row"
})
const imageSize = useBreakpointValue({
base: "100%",
md: "200px"
})
return (
<Flex direction={direction} borderWidth="1px">
<Box w={imageSize} bg="gray.200" />
<Box p={6}>
Content
</Box>
</Flex>
)
}
На мобильных устройствах:
На десктопе:
column → row
grid → flex
stack → sidebar layout
sm → md → lg
mobile menu
desktop navigation
sidebar visibility
меньше отступов на мобильных
больше пространства на десктопе
useBreakpointValue не должен использоваться для:
Хук предназначен исключительно для адаптации интерфейса.
1. Минимальное количество breakpoint-ов
Чрезмерная детализация ухудшает поддержку кода.
Оптимально:
base → md → lg
2. Использование семантических значений
Лучше:
compact
comfortable
spacious
чем
4px
8px
16px
3. Избегание дублирования
Если значение используется только для стилей, предпочтительнее responsive props.
4. Разделение логики и стилей
useBreakpointValue используется для:
ширина окна
↓
определение breakpoint
↓
выбор значения из объекта
↓
возврат значения в компонент
Таким образом useBreakpointValue становится центральным инструментом адаптивной логики в Chakra UI, позволяя синхронизировать визуальное оформление и поведение интерфейса с текущими условиями отображения.