Chakra UI предоставляет удобный способ построения интерфейсов на основе React с поддержкой системной стилизации, а Framer Motion — мощный инструмент для анимаций. Их интеграция позволяет создавать сложные анимационные интерфейсы, сохраняя удобство декларативного синтаксиса и совместимость со стилевыми системами Chakra UI.
Для работы требуется установить @chakra-ui/react и
framer-motion:
npm install @chakra-ui/react @emotion/react @emotion/styled framer-motion
При использовании TypeScript рекомендуется также установить типы для React и Emotion:
npm install --save-dev @types/react @types/react-dom
Chakra UI использует motion компоненты Framer Motion
через обёртку chakra() или компонент motion
напрямую. Для этого применяется метод motion.custom (в
новых версиях motion импортируется напрямую) или создаётся
анимированный компонент на базе существующего Chakra UI:
import { chakra, Box } from "@chakra-ui/react";
import { motion } from "framer-motion";
const MotionBox = motion(chakra.div);
<MotionBox
bg="teal.500"
w="200px"
h="200px"
animate={{ scale: 1.2 }}
transition={{ duration: 0.5 }}
/>
Здесь MotionBox наследует все свойства Chakra UI
(bg, w, h) и одновременно
поддерживает анимации Framer Motion (animate,
initial, exit, whileHover).
Chakra UI предоставляет компоненты с поддержкой псевдоклассов
(_hover, _focus, _active). Framer
Motion позволяет расширить возможности анимаций за пределы стандартных
CSS-трансформаций:
<MotionBox
w="150px"
h="150px"
bg="purple.400"
whileHover={{ scale: 1.1, rotate: 10 }}
whileTap={{ scale: 0.9, rotate: -10 }}
/>
whileHover — анимация при наведении курсораwhileTap — анимация при клике или тапеТакая интеграция позволяет создавать динамичные, отзывчивые интерфейсы без использования дополнительных CSS или классов.
Framer Motion поддерживает анимации layout, которые
автоматически анимируют изменение размеров и положения элементов. Chakra
UI предоставляет гибкую систему layout через Flex,
Stack, Grid. Для анимации layout достаточно
обернуть компонент в motion и использовать prop
layout:
import { VStack, Button } from "@chakra-ui/react";
const MotionVStack = motion(VStack);
<MotionVStack layout spacing={4}>
{items.map(item => (
<MotionBox
key={item.id}
layout
p={4}
bg="orange.300"
borderRadius="md"
>
{item.text}
</MotionBox>
))}
</MotionVStack>
layout автоматически анимирует перемещение и изменение
размеров элементов при добавлении или удалении из списка.
Для анимации компонентов при монтировании и размонтировании
используются props initial, animate и
exit. Chakra UI можно совместить с Framer Motion через
компонент AnimatePresence:
import { AnimatePresence, motion } from "framer-motion";
<AnimatePresence>
{isVisible && (
<MotionBox
key="modal"
initial={{ opacity: 0, y: -20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: 20 }}
transition={{ duration: 0.3 }}
bg="blue.400"
p={6}
borderRadius="lg"
>
Модальное окно
</MotionBox>
)}
</AnimatePresence>
AnimatePresence гарантирует корректное срабатывание
анимации при удалении компонента из DOM.
Chakra UI использует тему и tokens для цветов, отступов, размеров и шрифтов. Анимации Framer Motion можно интегрировать с этими системными значениями:
import { useTheme } from "@chakra-ui/react";
const theme = useTheme();
<MotionBox
w="100px"
h="100px"
bg={theme.colors.green[400]}
whileHover={{ scale: 1.2 }}
transition={{ duration: 0.4 }}
/>
Такой подход сохраняет единообразие дизайна и упрощает масштабирование интерфейсов.
chakra
фабрикойМетод chakra() позволяет создавать кастомные компоненты
с полным набором Chakra UI props. Для анимации с Framer Motion
достаточно обернуть результат chakra в
motion:
const MotionCustomButton = motion(chakra.button);
<MotionCustomButton
bg="pink.400"
color="white"
p={4}
borderRadius="md"
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
>
Анимированная кнопка
</MotionCustomButton>
Это даёт гибкость для сложных интерфейсов, где нужно одновременно использовать дизайн-систему Chakra UI и анимации Framer Motion.
whileHover,
whileTap и animate.layout и
AnimatePresence.chakra() для создания настраиваемых
анимированных компонентов с сохранением всех props Chakra UI.AnimatePresence для корректного
эффекта появления и исчезновения.Интеграция Framer Motion с Chakra UI позволяет создавать интерфейсы с плавными, отзывчивыми и красивыми анимациями, сохраняя при этом преимущества декларативного подхода и системной стилизации.