Chakra UI предоставляет мощные возможности для создания анимаций и переходов, опираясь на систему style props и интеграцию с библиотекой Framer Motion. Для начала важно понимать, что все визуальные компоненты Chakra UI поддерживают transition свойства, позволяя плавно изменять стили при взаимодействии с элементами.
Базовое свойство для анимации — это transition. Оно
может быть применено к любому компоненту Chakra UI, поддерживающему
стилевые пропсы:
<Box
bg="teal.500"
w="200px"
h="200px"
transition="all 0.3s ease-in-out"
_hover={{ bg: "teal.300", transform: "scale(1.05)" }}
/>
В этом примере transition="all 0.3s ease-in-out" задаёт
плавный переход для всех изменяемых стилей (bg,
transform) с продолжительностью 0.3 секунды и функцией
сглаживания ease-in-out.
Ключевые моменты работы с transition:
transitionProperty — определяет, какие CSS-свойства
будут анимированы ("all", "background",
"transform" и т.д.).transitionDuration — задаёт длительность анимации
("0.2s", "500ms").transitionTimingFunction — функция сглаживания
("ease", "linear",
"ease-in-out").transitionDelay — задержка перед запуском анимации
("0.1s").Пример с раздельным указанием свойств:
<Button
bg="blue.500"
color="white"
transitionProperty="background, transform"
transitionDuration="0.4s"
_hover={{ bg: "blue.300", transform: "translateY(-5px)" }}
>
Нажми меня
</Button>
motion компонентовДля более сложных анимаций Chakra UI интегрируется с Framer
Motion, позволяя использовать анимированные версии компонентов
через motion API.
import { motion } from "framer-motion";
import { Box } from "@chakra-ui/react";
const MotionBox = motion(Box);
<MotionBox
bg="purple.500"
w="150px"
h="150px"
whileHover={{ scale: 1.2, rotate: 10 }}
transition={{ type: "spring", stiffness: 200 }}
/>
Здесь whileHover задаёт анимацию при наведении, а
transition позволяет детально настроить тип анимации, её
жёсткость (stiffness) и демпфирование.
Основные типы анимаций в Framer Motion для Chakra UI:
whileHover — при наведении курсора.whileTap — при клике или тапе.animate — для анимации при монтировании или изменении
состояния.initial — начальное состояние анимации перед её
запуском.exit — анимация при удалении элемента из DOM (совместно
с AnimatePresence).AnimatePresence для плавного появления и исчезновенияДля элементов, которые должны плавно исчезать или появляться,
применяется компонент AnimatePresence из Framer Motion:
import { AnimatePresence, motion } from "framer-motion";
import { Box, Button } from "@chakra-ui/react";
import { useState } from "react";
const MotionBox = motion(Box);
function Example() {
const [isVisible, setIsVisible] = useState(true);
return (
<>
<Button onCl ick={() => setIsVisible(!isVisible)}>Toggle</Button>
<AnimatePresence>
{isVisible && (
<MotionBox
bg="orange.400"
w="100px"
h="100px"
initial={{ opacity: 0, y: -20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: 20 }}
transition={{ duration: 0.5 }}
/>
)}
</AnimatePresence>
</>
);
}
В этом примере элемент плавно появляется сверху вниз и исчезает вниз,
используя initial, animate и
exit.
Chakra UI поддерживает удобное задание кривых переходов и времени анимации через shorthand-пропсы:
<Box
transition="transform 0.3s cubic-bezier(0.68, -0.55, 0.27, 1.55)"
_hover={{ transform: "scale(1.1)" }}
/>
ease-in, ease-out,
ease-in-out для стандартных эффектов.Chakra UI интегрирует анимации с темами, позволяя использовать значения из темы для плавных переходов:
<Box
bg="brand.500"
transition="background 0.4s ease-in-out"
_hover={{ bg: "brand.300" }}
/>
Таким образом, анимации остаются консистентными с глобальной цветовой схемой и системой дизайна приложения.
will-change для компонентов с интенсивной
анимацией:<Box
_hover={{ transform: "scale(1.1)" }}
willChange="transform"
/>
Это указывает браузеру оптимизировать рендер заранее.
Chakra UI сочетает простоту CSS-переходов с мощью
Framer Motion, позволяя создавать плавные,
выразительные и настраиваемые анимации. Понимание ключевых пропсов
(transition, whileHover, animate,
initial, exit) и правильная настройка времени
и кривых переходов обеспечивает высокое качество UX при минимальных
усилиях.