React Academy · Урок

Анимации на основе жестов с use-gesture

Объединяйте react-spring с @use-gesture/react для создания анимаций, управляемых перетаскиванием, масштабированием и прокруткой

Урок 4 из 413 шагов

«Анимации на основе жестов с use-gesture» — бесплатный урок React Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Обзор @use-gesture/react

@use-gesture/react — это библиотека распознавания жестов, созданная для бесшовной работы с react-spring. Она распознаёт перетаскивание, масштабирование двумя пальцами, прокрутку, наведение, перемещение и прокрутку колесом, предоставляя нормализованное состояние жеста, которое можно напрямую передавать в функции установки значений пружины для плавного взаимодействия на основе физической модели.

Состояние жеста useDrag

Хук useDrag вызывает функцию обратного вызова при каждом событии перетаскивания. Функция обратного вызова получает объект состояния жеста с основными свойствами: movement (общее смещение от начала перетаскивания), velocity (текущая скорость), direction (1 или -1 по каждой оси), first (имеет значение true в начале перетаскивания), last (имеет значение true в конце перетаскивания) и event (исходное событие DOM).

Функция bind()

Все хуки use-gesture возвращают функцию bind(). Вызов bind() возвращает объект свойств обработчиков событий (onPointerDown, onTouchStart и т. д.), который вы передаёте нужному интерактивному элементу с помощью оператора разворота. Это связующее звено между распознавателем жестов и вашим элементом DOM.

Сочетание useDrag с react-spring

Стандартный подход: создайте пружину с помощью императивного API ([springs, api] = useSpring(...)), а затем используйте useDrag, чтобы при каждом событии перетаскивания вызывать api.start({ x: movement[0], y: movement[1] }). Пружина плавно следует за перемещением, добавляя естественную физику взаимодействию, которое в противном случае сводилось бы к жёсткому отслеживанию курсора.

Возврат после отпускания

Когда перетаскивание заканчивается (last: true в состоянии жеста), обычно возвращают элемент в исходное положение. Вызовите api.start({ x: 0, y: 0 }) внутри проверки if (last). react-spring выполнит возврат с помощью пружинной физики — с мягким отскоком вместо мгновенного сброса, — благодаря чему взаимодействие ощущается естественным и приятным.

Бросок и резкий запуск с учётом скорости

Значение velocity в состоянии жеста позволяет реализовать бросок элемента. Когда пользователь отпускает его с высокой скоростью, можно запустить элемент в направлении перетаскивания вместо возврата назад. Проверьте if (last && velocity[0] > threshold), а затем анимируйте элемент до конечного положения за пределами экрана. Это необходимо для взаимодействий со смахиванием для закрытия.

Границы перетаскивания и ограничение диапазона

Чтобы ограничить перемещение внутри контейнера, ограничьте значения перемещения перед передачей их пружине: x: Math.max(-maxX, Math.min(maxX, movement[0])). Также можно использовать встроенную опцию bounds библиотеки use-gesture: useDrag(handler, { bounds: { left: -100, right: 100 } }), чтобы автоматически ограничивать состояние жеста.

Шаблон смахивания для закрытия

Реализация смахивания для закрытия на мобильном устройстве: используйте useDrag для отслеживания горизонтального перемещения. Если пользователь отпустил элемент со скоростью выше порога OR переместил его больше чем на половину ширины экрана, анимируйте карточку за пределы экрана (api.start({ x: window.innerWidth })), а затем удалите её из списка. В противном случае верните её в центр.

usePinch для масштабирования

usePinch распознаёт жесты масштабирования двумя пальцами на сенсорных экранах и прокрутку колесом с зажатой клавишей Ctrl на компьютере. Состояние жеста включает scale (текущий уровень масштаба относительно начала жеста) и origin (центральную точку жеста). Подключите пружину, отслеживающую масштаб, чтобы создать плавное масштабирование с ограничениями для изображений или карт.

useHover и useMove

useHover срабатывает, когда указатель входит в элемент или покидает его, и предоставляет логическое значение active. useMove отслеживает положение мыши внутри элемента и предоставляет нормализованные координаты. Оба хука полезны для создания эффектов магнитного наведения, при которых элементы слегка смещаются в сторону приближающегося курсора.

Сочетание нескольких жестов

Хуки use-gesture можно сочетать. Вы можете использовать useDrag и usePinch для одного элемента: const bindDrag = useDrag(...); const bindPinch = usePinch(...), а затем передать обе функции bind с помощью оператора разворота: ...bindDrag() ...bindPinch(). use-gesture автоматически различает типы жестов.

Назначение функции bind()

Что делает функция bind(), возвращаемая хуками use-gesture?

Итоги урока: интеграция use-gesture

@use-gesture/react предоставляет useDrag, usePinch, useScroll, useHover и useMove. Каждый хук возвращает функцию bind(), результат разворота которой связывает события жестов с элементами DOM. Состояние жеста предоставляет перемещение, скорость, направление, first и last. Сочетайте эти хуки с императивной функцией api.start() из react-spring для создания интерактивных анимаций на основе физической модели. Используйте скорость для резкого запуска и закрытия, а границы — для ограничения перемещения.

Можно начать бесплатно

Изучай React с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
88
Уроки
324

Часто задаваемые вопросы

Урок «Анимации на основе жестов с use-gesture» бесплатный?

Да — полный текст урока «Анимации на основе жестов с use-gesture» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Анимации на основе жестов с use-gesture»?

Объединяйте react-spring с @use-gesture/react для создания анимаций, управляемых перетаскиванием, масштабированием и прокруткой Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Анимации на основе жестов с use-gesture»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы React Spring: хук useSpring
  2. Анимированные компоненты и интерполяция стилей
  3. useTrail и useChain для последовательностей
  4. Анимации на основе жестов с use-gesture
← Назад к React Academy