В сфере фронтенд‑разработки каждый день приходится решать однотипные задачи: создавать и настраивать внешний вид компонентов, обеспечивать адаптивность и доступность UI без вреда для производительности. Чтобы избавить нас от этой рутины, были созданы библиотеки стилизации.
В данной статье мы рассмотрим одну из таких библиотек — Charka UI V3 в связке с React, так как она не особо большая и проста в изучении. В разных библиотеках синтаксис может немного отличаться, но в основном они все решают одни и те же проблемы. Давайте разберёмся, как она способна помочь нам в разработке.
Какие задачи решают библиотеки стилизации?
Когда пишешь CSS с нуля, часто сталкиваешься с такими проблемами:
Медленно: стили для компонентов можно клеить часами и днями.
Непоследовательность: в больших проектах сложно поддерживать визуальное единообразие. Легко забыть, что надо стилизовать аналогично другому компоненту, а что сделать чуть по-другому.
Доступность: нужно, чтобы люди, у которых что-то с глазами/ушами/руками, могли пользоваться вашим приложением.
Производительность: со временем CSS-файлы разрастаются, накапливая неиспользуемые или дублирующиеся стили, что увеличивает время загрузки страницы.
Решение главных проблем
Chakra UI — простая, модульная и доступная библиотека компонентов для React, которая устраняет все эти проблемы. Вот как она это делает:
1. Избавляемся от стилей
Chakra UI использует подход, при котором стили определяются непосредственно в компоненте через специализированные атрибуты (props). Вместо написания CSS с нуля вы используете готовые компоненты:
import { Button } from "@chakra-ui/react"
function App() {
return (
<Button>
Отправить
</Button>
)
}
Импортируем «кнопку» — и получаем сразу стилизованный и легко настраиваемый компонент. Эта кнопка уже будет выглядеть не как в стандартном HTML и придерживаться единого стиля библиотеки. Её стили можно легко изменить, просто добавив необходимые пропсы напрямую в HTML:
<Button
colorScheme="teal" // Цветовая схема (фон, границы, hover-эффекты)
size="lg" // Размер (lg = large)
borderRadius="md" // Радиус скругления углов
boxShadow="lg" // Тень (lg = large)
_hover={{
transform: "translateY(-2px)", // Эффект поднятия при наведении
boxShadow: "xl" // Увеличение тени при наведении
}}
>
Отправить
</Button>
Как видно на примере, все наши стили встроены в виде атрибутов напрямую в тэг. В Chakra UI есть атрибуты под все возможные css-свойства. Каждый атрибут отвечает за конкретное свойство.
Также есть возможность использования псевдоклассов, таких как :hover, просто они прописываются через символ _ вместо : и через двойные фигурные скобки в них записываются css-свойства.
Для сравнения, как бы это примерно выглядело в CSS:
.button {
background-color: #319795;
color: white;
padding: 0.75rem 1.5rem;
border-radius: 0.375rem;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
transition: all 0.2s;
}
.button:hover {
transform: translateY(-2px);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
}
Наш код с использованием Chakra UI вышел более читаемым и компактным. Также состояния focus и active прописаны изначально в компоненте, что при использовании CSS необходимо делать вручную.
2. Соблюдаем единую стилизацию
В первом пункте я показывал прописывание пропсов напрямую в компонент, но библиотеки также позволяют создать единую тему, которая изменит стили у всех компонентов сразу. Как пример, тему можно настроить, чтобы создать переменную цвета:
import {
ChakraProvider,
createSystem,
defaultConfig,
defineConfig,
Button
} from "@chakra-ui/react"
const config = defineConfig({ // создание конфига
theme: {
tokens: {
colors: {
'accent': { value: '#6ED209' }, // сама переменная со значением
},
},
},
})
const system = createSystem(defaultConfig, config)
export default function App() {
return (
<ChakraProvider value={system }> {/* прописываем наш конфиг в корень */}
<Button bg="accent"> {/* применение на практике */}
Кнопка акцентного цвета
</Button>
</ChakraProvider>
)
}
Это один из вариантов, который использует токены для хранения цвета. Вы можете создавать токены для разных задач, подробнее можно прочитать в документации. Самое главное, что этот акцентный цвет мы теперь можем использовать во всех внутренних компонентах без необ��одимости его заново определять.
Если вынести config в отдельный файл, то мы получим единое место со всеми нашими стилями. Как пример, файл может выглядеть подобным образом:
import { defineConfig, createSystem, defaultConfig } from '@chakra-ui/react'
const config = defineConfig({
globalCss: { // Прописывание глобальных стилей
body: {
margin: '0',
},
html: {
scrollBehavior: 'smooth',
},
},
theme: {
tokens: { // Определение переменных
colors: {
'token-black': { value: '#151613' },
'token-white': { value: '#F5FFF7' },
},
},
semanticTokens: { // Токены цветов при смене темы
colors: {
back: {
value: {
base: '{colors.token-white}',
_dark: '{colors.token-black}',
},
},
text: {
value: {
base: '{colors.token-black}',
_dark: '{colors.token-white}',
},
},
},
},
},
})
export const system = createSystem(defaultConfig, config)
Любые изменения, внесённые в этот файл, будут автоматически применены ко всему приложению. Данный пример показывает лишь малую часть возможностей кастомной темы, но основная идея понятна.
3. Встроенная поддержка доступности
Chakra UI разработана с учётом стандартов WAI-ARIA (Web Accessibility Initiative – Accessible Rich Internet Applications). Каждый компонент семантически правильный и имеет нужные атрибуты ARIA:
import {
Alert,
AlertIcon,
Button,
Menu,
MenuButton,
MenuList,
MenuItem
} from "@chakra-ui/react"
import { ChevronDownIcon } from "@chakra-ui/icons"
// пример компонента уведомления
function Notification() {
return (
<Alert status="success" aria-live="polite">
<AlertIcon />
Ваши данные успешно сохранены!
</Alert>
)
}
// пример выпадающего меню
function AccessibleDropdown() {
return (
<Menu>
<MenuButton as={Button} rightIcon={<ChevronDownIcon />}>
Действия
</MenuButton>
<MenuList>
<MenuItem>Редактировать</MenuItem>
<MenuItem>Удалить</MenuItem>
<MenuItem>Скопировать</MenuItem>
</MenuList>
</Menu>
)
}
В примере с Alert компонент автоматически получает правильную роль и атрибут aria-live="polite", который сообщает скринридерам о необходимости озвучить изменение содержимого. В выпадающем меню Chakra UI автоматически управляет фокусом — при открытии меню фокус перемещается на первый элемент, а при закрытии возвращается на кнопку. Так же, что немаловажно, все интерактивные компоненты, такие как меню, поддерживают навигацию с клавиатуры (стрелки, Tab, Escape).
То есть мы не только избавились от необходимости стилизовать и прописывать через «костыли» тот же компонент выпадающего меню, так как это невозможно в обычном HTML, но и получили правильно прописанное поведение. Немаловажно, что все наши компоненты получились с правильными HTML-тегами, что позволяет не нарушать семантику и не прописывать её вручную.
4. Создаём адаптивный интерфейс
Создание адаптивного интерфейса в Chakra UI — простая задача. В библиотеке встроено удобное прописывание адаптивных стилей без необходимости использованияmedia-запросов. Для этого значения CSS-свойств передаются в виде массива, где каждый элемент соответствует определённой точке остановки (брейкпоинту):
<Box
width={["100%", "80%", "60%", "40%"]}
fontSize={["sm", "md", "lg", "xl"]}
p={[2, 4, 6, 8]}
display={["block", "block", "flex"]}
>
<Text mb={[4, 4, 0]} mr={[0, 0, 4]}>
Адаптивный текст
</Text>
<Button size={["sm", "md"]}>
Кнопка
</Button>
</Box>
Массив ["100%", "80%", "60%", "40%"] соответствует четырём брейкпоинтам по умолчанию: [base, sm, md, lg]:
На мобильных устройствах (базовый размер) ширина будет
100%На планшетах
(sm)—80%На маленьких десктопах
(md)—60%На больших экранах
(lg)—40%
Сравнение с CSS:
/* Вместо этого в CSS */
.container {
width: 100%;
padding: 0.5rem;
font-size: 0.875rem;
display: block;
}
@media (min-width: 30em) {
.container {
width: 80%;
padding: 1rem;
font-size: 1rem;
}
}
@media (min-width: 48em) {
.container {
width: 60%;
padding: 1.5rem;
font-size: 1.125rem;
display: flex;
}
}
@media (min-width: 62em) {
.container {
width: 40%;
padding: 2rem;
font-size: 1.25rem;
}
}
Здесь мы можем увидеть колоссальное сокращение кода, что сделало его более чистым и понятным.
5. Оптимизируем производительность
Chakra UI применяет комплексный подход к оптимизации, чтобы минимизировать влияние на скорость работы приложения. Некоторые могут быть вам знакомы, но главное, что большинство улучшений происходят без вашего участия. Вот два основных:
Tree Shaking и импорт только нужных компонентов
// ПРАВИЛЬНО - импортируем только нужные компоненты
import { Button, Box, Text } from "@chakra-ui/react"
// НЕПРАВИЛЬНО - такой импорт увеличит размер бандла
import ChakraUI from "@chakra-ui/react"
Ленивая загрузка стилей
Компоненты загружают только те стили, которые действительно используются:
// Chakra UI сгенерирует CSS только для этих компонентов
function App() {
return (
<Box p={4}>
<Text fontSize="xl">Заголовок</Text>
<Button colorScheme="blue">Действие</Button>
</Box>)
}
Преимущество перед традиционными подходами:
/* В обычном CSS часто приходится импортировать весь файл */
@import "bootstrap.css"; /* ~200KB неиспользуемых стилей */
/* Или в CSS-in-JS без оптимизации */
const styles = css`
/* Все стили компонента, даже если они не используются */
`
В результате этих оптимизаций достигается отсутствие неиспользуемых CSS-файлов, уменьшение размера бандла, ускорение начальной загрузки страницы и повышение общей производительности приложения.
Итоги
Библиотеки стилизации позволяют сильно упростить фронтенд-разработку, комплексно решая ключевые проблемы. На примере Chakra UI мы увидели, как простое добавление библиотеки позволило создавать интерфейсы при помощи готовых компонентов, которые сразу будут адаптивны и иметь единую стилизацию.
Данный подход не только ускорит вашу разработку, но и повысит качество и читаемость кода, улучшит его производительность и позволит сосредоточиться на написании логики приложения, а не переписывании стандартных компонентов.
© 2025 ООО «МТ ФИНАНС»
Комментарии (2)

Xtray
19.11.2025 13:58Но сравнить можно и с SCSS:
$breakpoints: ( 30em: (80%, 1rem, 1rem, block), 48em: (60%, 1.5rem, 1.125rem, flex), 62em: (40%, 2rem, 1.25rem, flex), ); .container { width: 100%; padding: 0.5rem; font-size: 0.875rem; display: block; @each $bp, $vals in $breakpoints { @media (min-width: $bp) { width: nth($vals, 1); padding: nth($vals, 2); font-size: nth($vals, 3); display: nth($vals, 4); } } }Или, если допускается плавное изменение, то можно вспомнить про clamp:
.container { display: block; width: clamp(40%, 70vw, 100%); padding: clamp(0.5rem, 2vw, 2rem); font-size: clamp(0.875rem, 1.5vw, 1.25rem); } @media (min-width: 48em) { .container { display: flex; } }Ну, то есть, готовый конструктор это, конечно, круто, но надо понимать, что за рамки конструктора выйти или не получится или будет стоить очень дорого. Если делаем что-то типа админок, то ок, а если что-то кастомное, то, кажется, собственная система будет сподручнее.
slavcopost
Хватит придумать всякую ерунду. Мы хотим писать CSS.