Развитие библиотеки Interact.js сопровождалось значительными изменениями в архитектуре API. Эти изменения направлены на повышение гибкости, улучшение читаемости кода, расширение возможностей кастомизации и повышение производительности при работе с интерактивными элементами интерфейса.
API библиотеки постепенно переходило от простых конфигурационных методов к более модульной системе, основанной на действиях (actions), событиях (events) и модификаторах (modifiers). Такой подход позволяет гибко настраивать поведение элементов без необходимости писать сложную логику обработки.
Основные изменения API можно разделить на несколько направлений:
Ранние версии библиотеки использовали относительно простую конфигурацию действий. Основной интерфейс представлял собой методы:
draggable()resizable()gesturable()dropzone()Каждый из этих методов принимал объект конфигурации с параметрами поведения.
interact('.box').draggable({
onmove: dragMoveListener,
onstart: dragStartListener,
onend: dragEndListener
});
В таком API обработчики событий передавались напрямую через параметры.
Со временем структура была изменена. Обработчики событий стали
выноситься в отдельный механизм подписки через метод
on().
interact('.box')
.draggable(true)
.on('dragmove', dragMoveListener)
.on('dragstart', dragStartListener)
.on('dragend', dragEndListener);
Преимущества такого подхода:
Одним из ключевых изменений API стала унификация событий.
Ранее события были привязаны к конкретным конфигурационным свойствам
(onmove, onstart). В новой архитектуре события
становятся полноценной системой подписки.
Drag
dragstartdragmovedragendResize
resizestartresizemoveresizeendGesture
gesturestartgesturemovegestureendinteract('.item')
.on('dragmove', function (event) {
console.log(event.dx, event.dy);
});
interact('.item').off('dragmove', handler);
interact('.item').on({
dragstart(event) {},
dragmove(event) {},
dragend(event) {}
});
Такой механизм делает API более похожим на систему событий DOM.
С развитием API был переработан объект события, передаваемый обработчикам.
Современный объект события содержит большое количество полезных свойств.
| Свойство | Описание |
|---|---|
target |
DOM-элемент взаимодействия |
currentTarget |
текущий элемент слушателя |
dx |
изменение позиции по X |
dy |
изменение позиции по Y |
rect |
текущий прямоугольник элемента |
deltaRect |
изменение размеров |
velocityX |
скорость по X |
velocityY |
скорость по Y |
pageX |
координата указателя |
pageY |
координата указателя |
interact('.card').on('dragmove', function (event) {
const x = (parseFloat(event.target.dataset.x) || 0) + event.dx;
const y = (parseFloat(event.target.dataset.y) || 0) + event.dy;
event.target.style.transform = `translate(${x}px, ${y}px)`;
event.target.dataset.x = x;
event.target.dataset.y = y;
});
Такой объект события значительно расширяет возможности управления элементами.
Одним из самых значимых изменений API стало появление модификаторов (modifiers).
Модификаторы позволяют изменять поведение действий без написания дополнительной логики.
Модификаторы представляют собой функции, которые перехватывают процесс взаимодействия и изменяют его параметры.
Примеры задач модификаторов:
interact('.box').draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent'
})
]
});
Ранее ограничения реализовывались через параметр
restrict.
Новая версия API перенесла эту функциональность в систему модификаторов.
interact('.item').draggable({
restrict: {
restriction: 'parent'
}
});
interact('.item').draggable({
modifiers: [
interact.modifiers.restrict({
restriction: 'parent'
})
]
});
Это изменение позволило:
Механизм snap также был перенесён в систему модификаторов.
interact('.box').draggable({
modifiers: [
interact.modifiers.snap({
targets: [
interact.snappers.grid({ x: 50, y: 50 })
],
range: 20
})
]
});
Параметры:
| Параметр | Назначение |
|---|---|
targets |
точки привязки |
range |
радиус срабатывания |
offset |
смещение привязки |
В старых версиях изменение размеров задавалось минимальным набором параметров.
Новая версия API вводит более детальную конфигурацию.
interact('.panel').resizable({
edges: {
top: true,
left: true,
bottom: true,
right: true
}
});
Свойство edges определяет стороны, с которых можно
изменять размер.
API обновило систему работы с размерами через объект
rect.
event.rect = {
width: Number,
height: Number,
left: Number,
right: Number,
top: Number,
bottom: Number
}
Также добавлен объект deltaRect.
event.deltaRect = {
left: Number,
right: Number,
top: Number,
bottom: Number
}
Это позволяет вычислять изменения размеров без ручных расчетов.
API для зон перетаскивания также было обновлено.
interact('.dropzone').dropzone({
accept: '.draggable',
overlap: 0.5
});
| Параметр | Назначение |
|---|---|
accept |
селектор допустимых элементов |
overlap |
уровень пересечения |
checker |
пользовательская функция проверки |
Dropzone имеет собственную систему событий.
Основные события:
dropactivatedropdeactivatedragenterdragleavedropinteract('.dropzone')
.on('dragenter', function (event) {
event.target.classList.add('active');
})
.on('dragleave', function (event) {
event.target.classList.remove('active');
})
.on('drop', function (event) {
console.log('Dropped!');
});
API жестов используется для обработки мультитач-взаимодействий.
Поддерживаются:
interact('.image').gesturable({
listeners: {
move(event) {
console.log(event.scale);
console.log(event.angle);
}
}
});
Основные свойства события:
| Свойство | Назначение |
|---|---|
scale |
коэффициент масштабирования |
angle |
угол поворота |
ds |
изменение масштаба |
da |
изменение угла |
Одним из новых элементов API стала возможность группировать
обработчики событий через listeners.
interact('.box').draggable({
listeners: {
start(event) {},
move(event) {},
end(event) {}
}
});
Преимущества:
on()API добавило поддержку инерции движения.
Это позволяет элементам продолжать движение после отпускания указателя.
interact('.box').draggable({
inertia: true
});
Дополнительные параметры:
inertia: {
resistance: 10,
minSpeed: 100,
endSpeed: 10
}
| Параметр | Описание |
|---|---|
resistance |
сопротивление |
minSpeed |
минимальная скорость |
endSpeed |
скорость остановки |
AutoScroll позволяет автоматически прокручивать контейнер при перетаскивании.
interact('.item').draggable({
autoScroll: true
});
Расширенная конфигурация:
autoScroll: {
container: document.body,
margin: 50,
speed: 300
}
Современные версии библиотеки поддерживают модульную систему.
import interact from 'interactjs';
Это позволяет:
API предоставляет методы для управления интерактивными объектами.
const interactable = interact('.box');
interactable.unset();
interactable.draggable();
API добавило модификатор restrictSize.
interact('.panel').resizable({
modifiers: [
interact.modifiers.restrictSize({
min: { width: 200, height: 100 },
max: { width: 800, height: 600 }
})
]
});
Это позволяет контролировать диапазон размеров элемента.
Для изменения размеров был добавлен модификатор
aspectRatio.
interact('.image').resizable({
modifiers: [
interact.modifiers.aspectRatio({
ratio: 16 / 9
})
]
});
Элемент сохраняет заданное соотношение сторон во время изменения размеров.
API расширило систему целей привязки.
interact.modifiers.snap({
targets: [
{ x: 100, y: 100 },
{ x: 300, y: 300 }
]
});
Также появилась поддержка динамических целей через функции.
targets: [
function (x, y) {
return { x: Math.round(x / 50) * 50, y: Math.round(y / 50) * 50 };
}
]
Новые версии библиотеки перешли на использование Pointer Events вместо отдельных систем:
Это обеспечивает:
API добавило поддержку нескольких систем координат:
pageclientscreenЭто улучшило совместимость с различными контейнерами и прокруткой страницы.
Современный API позволяет создавать собственные действия взаимодействия.
Основная архитектура библиотеки стала расширяемой, что позволяет внедрять пользовательские плагины.
Плагин может:
Это делает библиотеку не только инструментом для drag-and-drop, но и полноценной платформой для построения сложных интерактивных интерфейсов.