Миграция между версиями Interact.js часто связана не только с изменением отдельных методов, но и с переработкой внутренней архитектуры. Начиная с поздних веток развития библиотеки, разработчики сместили фокус в сторону модульности, улучшенной системы событий и более строгой типизации API.
Ключевые изменения затрагивают:
Переход на новую версию требует анализа старого кода, так как некоторые методы были удалены или заменены альтернативными механизмами.
В ранних версиях Interact.js библиотека чаще всего подключалась напрямую через глобальный объект.
Пример старого подключения:
<script src="interact.min.js"></script>
После подключения глобальная функция interact
становилась доступной во всём приложении.
Современные версии библиотеки ориентированы на использование модульных систем.
import interact from 'interactjs'
Такой подход позволяет:
Чаще всего библиотека устанавливается через:
npm install interactjs
или
yarn add interactjs
После установки доступна модульная структура пакета.
Одно из наиболее заметных изменений касается настройки действий.
В ранних версиях библиотека использовала компактную конфигурацию:
interact('.item').draggable(true)
Обработчики событий могли добавляться отдельно:
interact('.item').on('dragmove', function (event) {
const target = event.target
target.style.transform =
'translate(' + event.dx + 'px, ' + event.dy + 'px)'
})
Современные версии используют объект конфигурации:
interact('.item').draggable({
listeners: {
move(event) {
const target = event.target
const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx
const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy
target.style.transform = `translate(${x}px, ${y}px)`
target.setAttribute('data-x', x)
target.setAttribute('data-y', y)
}
}
})
Основные преимущества:
В старых версиях основной механизм обработки событий выглядел так:
interact('.box')
.draggable(true)
.on('dragstart', startHandler)
.on('dragmove', moveHandler)
.on('dragend', endHandler)
В современных версиях предпочтительно использовать объект listeners.
interact('.box').draggable({
listeners: {
start(event) {
// начало перетаскивания
},
move(event) {
// перемещение
},
end(event) {
// завершение
}
}
})
Преимущества нового подхода:
В ранних версиях ограничения задавались напрямую через параметры.
interact('.box').draggable({
restrict: {
restriction: 'parent'
}
})
Этот механизм был заменён системой modifiers.
interact('.box').draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent'
})
]
})
Система модификаторов значительно расширяет возможности настройки.
К доступным модификаторам относятся:
restrictrestrictRectsnapsnapSizesnapEdgesaspectRatioКаждый модификатор представляет собой отдельную функцию конфигурации.
interact('.item').draggable({
restrict: {
restriction: '#container',
endOnly: true
}
})
interact('.item').draggable({
modifiers: [
interact.modifiers.restrict({
restriction: '#container',
endOnly: true
})
]
})
Разница заключается в переносе параметров в массив
modifiers.
Привязка к сетке или координатам также была переработана.
interact('.item').draggable({
snap: {
targets: [
interact.createSnapGrid({ x: 20, y: 20 })
]
}
})
interact('.item').draggable({
modifiers: [
interact.modifiers.snap({
targets: [
interact.snappers.grid({ x: 20, y: 20 })
]
})
]
})
Основные изменения:
createSnapGrid заменён на
snappers.gridМеханизм изменения размеров элементов также получил обновлённый синтаксис.
interact('.resizable').resizable(true)
interact('.resizable').on('resizemove', function (event) {
const target = event.target
target.style.width = event.rect.width + 'px'
target.style.height = event.rect.height + 'px'
})
interact('.resizable').resizable({
edges: { left: true, right: true, bottom: true, top: true },
listeners: {
move(event) {
const target = event.target
target.style.width = `${event.rect.width}px`
target.style.height = `${event.rect.height}px`
}
}
})
Изменения:
Поддержка жестов (масштабирование и вращение) в новых версиях более стандартизирована.
interact('.gesture-area').gesturable(true)
interact('.gesture-area').on('gesturemove', function (event) {
console.log(event.scale)
})
interact('.gesture-area').gesturable({
listeners: {
move(event) {
console.log(event.scale)
}
}
})
Таким образом, все действия библиотеки используют единый стиль конфигурации.
Drop-зоны применяются для обработки перетаскивания элементов в определённую область.
interact('.dropzone').dropzone({
accept: '.draggable',
overlap: 0.5
})
interact('.dropzone').on('drop', function (event) {
console.log('Dropped')
})
interact('.dropzone').dropzone({
accept: '.draggable',
overlap: 0.5,
listeners: {
dr op ( event) {
console.log('Dropped')
}
}
})
Преимущества:
Современные версии библиотеки предоставляют более структурированную модель событий.
Типичные события действий:
startmoveendinertiastartstartmoveendstartmoveendКаждое событие передаёт объект InteractEvent,
содержащий:
targetdx, dypageX, pageYrectvelocityX, velocityYdurationВ старых версиях инерция включалась простым параметром.
interact('.box').draggable({
inertia: true
})
Новый синтаксис позволяет гибко настраивать поведение.
interact('.box').draggable({
inertia: {
resistance: 10,
minSpeed: 100,
endSpeed: 10
}
})
Параметры:
| Параметр | Назначение |
|---|---|
| resistance | сопротивление движению |
| minSpeed | минимальная скорость запуска |
| endSpeed | скорость остановки |
Механизм автоматической прокрутки контейнера при перетаскивании также был переработан.
interact('.item').draggable({
autoScroll: true
})
Для более тонкой настройки используется объект:
autoScroll: {
container: document.body,
margin: 50,
speed: 300
}
При миграции следует учитывать список удалённых методов.
| Старый метод | Современная альтернатива |
|---|---|
.draggable(true) |
.draggable({ ... }) |
.on('dragmove') |
listeners.move |
restrict |
modifiers.restrict |
snap |
modifiers.snap |
createSnapGrid |
snappers.grid |
Использование старых методов может привести к ошибкам или предупреждениям в консоли.
В новых версиях многие возможности реализованы как плагины.
Некоторые плагины подключаются автоматически, но могут импортироваться отдельно:
import interact from 'interactjs'
import autoScroll from '@interactjs/auto-scroll'
Регистрация плагина:
interact.use(autoScroll)
Такой подход позволяет:
Смешивание старого и нового API приводит к двойному выполнению событий.
Неправильно:
interact('.box')
.draggable(true)
.on('dragmove', handler)
Правильно:
interact('.box').draggable({
listeners: {
move: handler
}
})
Причина — использование старого параметра restrict.
Решение — перенос в modifiers.
Причина — использование устаревшего createSnapGrid.
Решение:
interact.snappers.grid()
На практике переход на новую версию Interact.js выполняется поэтапно.
npm update interactjs
Современные версии библиотеки выводят предупреждения о deprecated-методах.
Все .on() желательно заменить на
listeners.
Все настройки restrict, snap и
aspectRatio должны быть переписаны через систему
модификаторов.
После миграции необходимо протестировать:
При миграции разумно не просто переписывать API, но и улучшать архитектуру приложения.
Практика показывает эффективность следующих подходов:
Разделение логики действий
const dragMove = (event) => {
// логика перемещения
}
Использование модулей
export function initDrag() {
interact('.item').draggable({ ... })
}
Хранение координат в dataset
target.dataset.x
target.dataset.y
Это упрощает поддержку состояния элемента.
Современные версии Interact.js оптимизированы для:
Для максимальной производительности рекомендуется использовать:
transform: translate()
вместо изменения top и left.
После миграции библиотека лучше интегрируется с современными инструментами:
Главная причина — использование модульной архитектуры и изолированных конфигураций действий.
Новые версии Interact.js ориентированы на:
Минимально поддерживаемые браузеры обычно включают:
Поддержка старых версий Internet Explorer была постепенно прекращена.