Chakra UI предоставляет удобные инструменты для создания анимаций без
необходимости подключения сторонних библиотек. Основным механизмом
работы с анимациями является компонент
motion из интеграции с библиотекой Framer
Motion, который позволяет легко добавлять эффекты появления,
трансформации, перемещения и изменения прозрачности.
motionДля начала нужно импортировать motion:
import { chakra, shouldForwardProp } from "@chakra-ui/react";
import { motion, isValidMotionProp } from "framer-motion";
const MotionBox = chakra(motion.div, {
shouldForwardProp: (prop) => isValidMotionProp(prop) || shouldForwardProp(prop),
});
Здесь создаётся MotionBox — обёртка над обычным
Box, которая поддерживает все свойства Chakra UI и
одновременно свойства анимаций Framer Motion, такие как
initial, animate, exit и
whileHover.
Для анимации появления элементов используется сочетание свойств
initial и animate:
<MotionBox
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5 }}
bg="teal.500"
w="200px"
h="100px"
/>
Разбор кода:
initial задаёт исходное состояние компонента перед
анимацией.animate определяет конечное состояние.transition управляет временем и типом перехода.bg, w, h)
работают одновременно с анимацией.Chakra UI позволяет легко комбинировать стандартные стили с
анимациями при событиях, таких как hover:
<MotionBox
whileHover={{ scale: 1.05, rotate: 2 }}
transition={{ type: "spring", stiffness: 300 }}
bg="purple.400"
p={6}
borderRadius="md"
>
Hover Me
</MotionBox>
Особенности:
whileHover автоматически активируется при наведении
курсора.spring создаёт более живую анимацию с
эффектом упругости.animateДля сложных интерфейсов важно плавно менять состояния компонентов:
<MotionBox
initial={{ x: -100, opacity: 0 }}
animate={{ x: isOpen ? 0 : -100, opacity: isOpen ? 1 : 0 }}
transition={{ duration: 0.3 }}
bg="blue.300"
w="300px"
h="150px"
/>
Ключевые моменты:
animate может быть динамическим, управляться
состояниями React.variants для повторного использования анимацийДля больших проектов полезно вынести анимации в объект
variants:
const boxVariants = {
hidden: { opacity: 0, y: 20 },
visible: { opacity: 1, y: 0, transition: { duration: 0.5 } },
};
<MotionBox
variants={boxVariants}
initial="hidden"
animate="visible"
bg="green.400"
w="250px"
h="120px"
/>
Преимущества:
Chakra UI интегрируется с AnimatePresence для управления
входом и выходом элементов:
import { AnimatePresence } from "framer-motion";
<AnimatePresence>
{items.map((item) => (
<MotionBox
key={item.id}
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -10 }}
transition={{ duration: 0.3 }}
bg="orange.300"
m={2}
p={4}
borderRadius="md"
>
{item.text}
</MotionBox>
))}
</AnimatePresence>
Особенности:
AnimatePresence обеспечивает плавное исчезновение
элементов при удалении из массива.Chakra UI также предлагает хуки для упрощённых анимаций, например
useDisclosure в сочетании с MotionBox:
import { useDisclosure, Button } from "@chakra-ui/react";
const { isOpen, onToggle } = useDisclosure();
<Button onCl ick={onToggle}>Toggle Box</Button>
<MotionBox
initial={{ height: 0, opacity: 0 }}
animate={{ height: isOpen ? "100px" : 0, opacity: isOpen ? 1 : 0 }}
overflow="hidden"
bg="cyan.300"
w="200px"
/>
Преимущества:
Framer Motion поддерживает различные кривые ускорения через
transition:
<MotionBox
initial={{ x: -50 }}
animate={{ x: 0 }}
transition={{ duration: 0.7, ease: [0.42, 0, 0.58, 1] }}
bg="pink.400"
w="220px"
h="100px"
/>
[0.42, 0, 0.58, 1] задаёт кастомную
кривую Безье.linear,
easeIn, easeOut, easeInOut.Chakra UI позволяет одновременно использовать анимации и адаптивные стили:
<MotionBox
initial={{ scale: 0.8 }}
animate={{ scale: 1 }}
transition={{ duration: 0.4 }}
w={["100px", "150px", "200px"]}
h={["100px", "150px", "200px"]}
bg="yellow.300"
/>
Chakra UI предоставляет мощный и простой способ анимировать элементы, объединяя:
transition, ease,
spring).animate, initial,
exit).variants).Такой подход позволяет создавать динамичные интерфейсы с минимальным количеством кода и высокой читаемостью.