Подход Mobile First предполагает проектирование интерфейса с приоритетом мобильных устройств и последующим расширением для планшетов и десктопов. В Chakra UI этот принцип реализуется через адаптивные стили, позволяя создавать гибкие и отзывчивые интерфейсы без дублирования кода.
Chakra UI предоставляет возможность задавать стили, которые автоматически меняются в зависимости от ширины экрана, с помощью массивов и объектов брейкпоинтов.
Массивы для адаптивности:
<Box
fontSize={['sm', 'md', 'lg', 'xl']} // смартфон, планшет, десктоп, большой экран
p={['2', '4', '6', '8']}
>
Контент
</Box>
Здесь первый элемент массива соответствует самой маленькой ширине экрана, а последующие – увеличивающимся брейкпоинтам. Такой подход упрощает проектирование интерфейсов, начиная с мобильной версии.
Объекты брейкпоинтов:
<Box
fontSize={{ base: 'sm', md: 'lg', lg: 'xl' }}
p={{ base: '2', md: '4', lg: '6' }}
>
Контент
</Box>
Использование объектов делает код более читаемым и позволяет явно задавать стили для конкретных брейкпоинтов.
Chakra UI поставляется с набором стандартных брейкпоинтов, которые соответствуют современным устройствам:
| Брекпоинт | Размер |
|---|---|
| base | 0px |
| sm | 30em |
| md | 48em |
| lg | 62em |
| xl | 80em |
| 2xl | 96em |
Примечание: 1em = 16px. Использование этих брейкпоинтов обеспечивает консистентность интерфейсов на всех устройствах.
Практически все компоненты Chakra UI поддерживают адаптивные пропсы.
Например, компонент Flex позволяет менять направление
расположения элементов:
<Flex
direction={{ base: 'column', md: 'row' }}
spacing={{ base: '4', md: '8' }}
>
<Box bg="red.200" w="100%" h="50px" />
<Box bg="green.200" w="100%" h="50px" />
</Flex>
На мобильных устройствах элементы будут располагаться в колонку, а на планшетах и десктопах – в строку. Такой подход обеспечивает удобство чтения и взаимодействия с интерфейсом.
Grid в Chakra UI также поддерживает адаптивность через
пропсы templateColumns и gap:
<Grid
templateColumns={{ base: '1fr', md: 'repeat(2, 1fr)', lg: 'repeat(4, 1fr)' }}
gap={{ base: 2, md: 4, lg: 6 }}
>
<Box bg="blue.100" h="100px" />
<Box bg="blue.200" h="100px" />
<Box bg="blue.300" h="100px" />
<Box bg="blue.400" h="100px" />
</Grid>
Такой подход позволяет плавно масштабировать сетку в зависимости от ширины экрана.
Chakra UI предоставляет проп display для управления
видимостью на разных устройствах:
<Box display={{ base: 'block', md: 'none' }}>
Мобильное меню
</Box>
<Box display={{ base: 'none', md: 'block' }}>
Десктопное меню
</Box>
Это удобно для реализации различных компонентов интерфейса для мобильной и десктопной версии без дублирования логики.
Адаптивные пропсы можно комбинировать с псевдоклассами
(_hover, _focus, _active) и
псевдоэлементами (_before, _after):
<Button
bg="teal.400"
_hover={{ bg: { base: 'teal.300', md: 'teal.500' } }}
>
Кнопка
</Button>
На мобильных устройствах при наведении цвет будет
teal.300, а на планшетах и десктопах –
teal.500.
useBreakpointValueДля более сложной логики адаптивности Chakra UI предоставляет хук
useBreakpointValue:
import { useBreakpointValue, Box } from '@chakra-ui/react';
const ResponsiveText = () => {
const fontSize = useBreakpointValue({ base: 'sm', md: 'lg', lg: 'xl' });
return <Box fontSize={fontSize}>Адаптивный текст</Box>;
};
Этот хук позволяет динамически изменять значения пропсов и выполнять условную логику в зависимости от текущего брейкпоинта.
В файле темы можно настраивать значения по умолчанию для брейкпоинтов и адаптивные размеры шрифтов, отступов и цветов:
import { extendTheme } from '@chakra-ui/react';
const theme = extendTheme({
breakpoints: {
sm: '30em',
md: '48em',
lg: '62em',
xl: '80em',
'2xl': '96em',
},
fontSizes: {
sm: '0.875rem',
md: '1rem',
lg: '1.125rem',
xl: '1.25rem',
},
});
export default theme;
Настройка темы обеспечивает единообразие интерфейса и упрощает поддержание Mobile First подхода на всех страницах приложения.
Flex, Grid и
адаптивные пропсы для построения сложных макетов.display облегчает управление разными версиями интерфейса
без дублирования компонентов.Mobile First в Chakra UI — это не только удобство создания интерфейсов под разные устройства, но и способ сохранять код компактным, логичным и масштабируемым, используя встроенные адаптивные механизмы библиотеки.