С помощью библиотеки Framer Motion мы можем легко визуализировать анимацию в нашем приложении React.
В этой статье мы рассмотрим, как начать работу с Framer Motion.
Перетащить события
Мы можем отслеживать события перетаскивания с помощью событий onDrag
, onDragStart
, onDragEnd
, onDirectionLock
.
Например, мы можем написать:
import { motion } from "framer-motion"; import React from "react"; export default function App() { return ( <> <motion.div style={{ backgroundColor: "red", width: 100, height: 100 }} drag="x" onDrag={(event, info) => console.log(info.point.x, info.point.y)} onDragStart={(event, info) => console.log(info.point.x, info.point.y)} onDragEnd={(event, info) => console.log(info.point.x, info.point.y)} /> </> ); }
чтобы мы могли слушать события перетаскивания.
info.point.x
и info.point.y
имеют координаты x и y положения перетаскивания.
Мы также можем добавить событие onDirectionLock
для прослушивания блокировок направления перетаскивания.
Например, мы можем написать:
import { motion } from "framer-motion"; import React from "react"; export default function App() { return ( <> <motion.div style={{ backgroundColor: "red", width: 100, height: 100 }} drag="x" dragDirectionLock onDirectionLock={(axis) => console.log(axis)} onDrag={(event, info) => console.log(info.point.x, info.point.y)} onDragStart={(event, info) => console.log(info.point.x, info.point.y)} onDragEnd={(event, info) => console.log(info.point.x, info.point.y)} /> </> ); }
Мы устанавливаем опору dragDirectionLock
на true
и опору drag
на 'x'
, поэтому параметр axis
будет установлен на 'x'
.
MotionValue
MotionValues отслеживает состояние и скорость анимации значений.
Мы можем создать MotionValues вручную, чтобы установить и получить их состояние, передать несколько компонентов для синхронизации движения между компонентами, связать MotionValues с помощью ловушки useTransform
и обновить визуальные свойства без повторного рендеринга.
Например, мы можем использовать их для изменения непрозрачности div при перетаскивании, написав:
import { motion, useMotionValue, useTransform } from "framer-motion"; import React from "react"; const input = [-200, 0, 200]; const output = [0, 1, 0]; export default function App() { const x = useMotionValue(0); const opacity = useTransform(x, input, output); return ( <motion.div drag="x" style={{ x, opacity, backgroundColor: "red", width: 100, height: 100 }} /> ); }
Хук useMotionValue
используется для создания MotionValue.
Затем мы используем значение useTransform
для сопоставления значения x
с input
и output
.
Массив input
имеет диапазон позиций в массиве.
Массив output
имеет диапазон непрозрачности.
Таким образом, позиция изменяется при перетаскивании, и это возвращает непрозрачность div.
Мы можем получить и установить MotionValues.
Метод set
устанавливает MotionValue.
А методы get
и getVelocity
получают позицию и скорость соответственно.
Например, мы можем написать:
import { motion, useMotionValue, useTransform } from "framer-motion"; import React, { useEffect } from "react"; const input = [-200, 0, 200]; const output = [0, 1, 0]; export default function App() { const x = useMotionValue(0); const opacity = useTransform(x, input, output); useEffect(() => { x.set(100); }, []); useEffect(() => { console.log(x.get()); console.log(x.getVelocity()); }, [x]); return ( <motion.div drag="x" style={{ x, opacity, backgroundColor: "red", width: 100, height: 100 }} /> ); }
для установки положения с помощью set
и получения положения и скорости с помощью get
и getVelocity
.
Заключение
Мы можем получать и устанавливать значения MotionValue и обрабатывать события перетаскивания с помощью Framer Motion.