С помощью библиотеки 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.