В библиотеке Interact.js большинство параметров конфигурации можно задавать не только как статические значения, но и через функции. Это даёт возможность динамически вычислять поведение элементов в зависимости от состояния страницы, свойств объекта или других условий.
Ограничение перемещения (restrict) часто задается
объектом с фиксированными координатами:
interact('.draggable').draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: { top: 0, left: 0, bottom: 500, right: 500 },
endOnly: true
})
]
});
Однако можно использовать функцию, чтобы область перемещения менялась динамически:
interact('.draggable').draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: function (target, interactable, elementRect) {
const parent = target.parentElement.getBoundingClientRect();
return {
top: parent.top,
left: parent.left,
bottom: parent.bottom,
right: parent.right
};
},
endOnly: true
})
]
});
Преимущества:
snapСнап (привязка) элементов к сетке или линиям также поддерживает функции для вычисления координат:
interact('.draggable').draggable({
modifiers: [
interact.modifiers.snap({
targets: [
function (x, y) {
return { x: Math.round(x / 50) * 50, y: Math.round(y / 50) * 50 };
}
],
range: 30,
relativePoints: [{ x: 0.5, y: 0.5 }]
})
]
});
Особенности использования функций в snap:
В Interact.js трансформации (масштабирование, вращение) могут зависеть от функций:
interact('.resizable').resizable({
edges: { left: true, right: true, bottom: true, top: true },
modifiers: [
interact.modifiers.restrictSize({
min: function (target, element) {
return { width: 50, height: 50 };
},
max: function (target, element) {
const parent = element.parentElement.getBoundingClientRect();
return { width: parent.width, height: parent.height };
}
})
],
inertia: true
});
Выводы:
min и max можно вычислять на лету для
каждого элемента.Некоторые свойства событий, например, listeners, можно
настраивать через функции, возвращающие обработчики:
interact('.draggable').on('dragmove', function (event) {
const speed = calculateSpeed(event);
event.target.style.transform = `translate(${event.dx * speed}px, ${event.dy * speed}px)`;
});
event содержит текущие координаты, скорость и
смещение.Использовать функции для всех параметров, которые зависят от состояния DOM или размеров окна. Это делает код гибким и адаптивным.
Избегать тяжелых вычислений в функции, вызываемой на каждом движении. Лучше кешировать результаты или использовать упрощенные расчеты.
Совмещать функции с модификаторами. Функции
отлично интегрируются с snap, restrict,
restrictSize и другими модификаторами.
Тестировать разные сценарии. Поскольку функции вызываются часто, важно проверять, что они всегда возвращают корректные значения, иначе элементы могут “зависнуть” или выйти за границы.
Использование функций вместо статических значений в Interact.js существенно расширяет возможности управления элементами. Оно позволяет создавать динамичные, адаптивные и интерактивные интерфейсы, которые реагируют на любые изменения окружения и состояния элементов.