Виртуализация элементов в контексте Interact.js позволяет создавать интерфейсы с динамически изменяемыми элементами, которые могут быть перетаскиваемыми, масштабируемыми или реагирующими на жесты пользователя без необходимости прямого изменения DOM на каждом шаге. Это повышает производительность и удобство работы с большими коллекциями элементов.
Для начала необходимо подключить библиотеку:
<script src="https://cdn.jsdelivr.net/npm/@interactjs/interactjs/dist/interact.min.js"></script>
После подключения доступна глобальная функция interact,
через которую производится настройка взаимодействий с элементами.
interact('.draggable')
.draggable({
listeners: {
start(event) { console.log('Начало перетаскивания', event.target); },
move(event) { dragMoveListener(event); },
end(event) { console.log('Конец перетаскивания', event.target); }
}
});
Функция dragMoveListener обрабатывает смещение элементов
и может быть настроена для работы с виртуальными координатами.
В отличие от обычного DOM-манипулирования, виртуализация подразумевает работу с абстрактной позицией элемента, которая хранится в JavaScript-объекте:
const virtualElements = [];
function createVirtualElement(id, x, y) {
const element = { id, x, y };
virtualElements.push(element);
return element;
}
function dragMoveListener(event) {
const element = virtualElements.find(e => e.id === event.target.dataset.id);
element.x += event.dx;
element.y += event.dy;
updateElementPosition(event.target, element);
}
function updateElementPosition(domElement, virtualElement) {
domElement.style.transform = `translate(${virtualElement.x}px, ${virtualElement.y}px)`;
}
В этом примере DOM-элемент реагирует на изменения виртуальных координат, что позволяет минимизировать дорогостоящие операции с реальным DOM при работе с большим числом элементов.
Interact.js поддерживает масштабирование
(gesturable) и вращение. Для виртуализированных
объектов можно хранить дополнительные свойства:
function createVirtualElement(id, x, y, scale = 1, rotation = 0) {
return { id, x, y, scale, rotation };
}
interact('.resizable')
.gesturable({
listeners: {
move(event) {
const element = virtualElements.find(e => e.id === event.target.dataset.id);
element.scale *= (1 + event.ds);
element.rotation += event.da;
updateElementTransform(event.target, element);
}
}
});
function updateElementTransform(domElement, virtualElement) {
domElement.style.transform =
`translate(${virtualElement.x}px, ${virtualElement.y}px) ` +
`scale(${virtualElement.scale}) rotate(${virtualElement.rotation}deg)`;
}
Использование виртуальной модели позволяет применять сложные трансформации без постоянного пересоздания DOM или тяжелой переработки стилей.
requestAnimationFrame.let pendingUpdates = [];
function dragMoveListener(event) {
const element = virtualElements.find(e => e.id === event.target.dataset.id);
element.x += event.dx;
element.y += event.dy;
pendingUpdates.push({ dom: event.target, virtual: element });
if (pendingUpdates.length === 1) {
requestAnimationFrame(applyUpdates);
}
}
function applyUpdates() {
pendingUpdates.forEach(update => {
updateElementTransform(update.dom, update.virtual);
});
pendingUpdates = [];
}
Виртуальный viewport: при большом количестве элементов отображается только часть элементов, находящихся в видимой области, а остальные остаются в виртуальной модели.
Делегирование событий: вместо привязки
обработчиков к каждому DOM-элементу, обработчики навешиваются на
контейнер, а идентификация элемента производится через
event.target.dataset.id.
Interact.js предоставляет несколько ключевых событий:
dragstart – начало перетаскивания.dragmove – движение элемента.dragend – завершение перетаскивания.resizestart, resizemove,
resizeend – аналогично для изменения размеров.gesturestart, gesturemove,
gestureend – масштабирование и вращение.Для виртуализированных объектов важно, что все эти события могут работать с абстрактными координатами и свойствами, которые хранятся отдельно от DOM.
При изменении размера окна или контейнера необходимо пересчитывать позиции виртуальных элементов:
window.addEventListener('resize', () => {
virtualElements.forEach(el => {
updateElementTransform(document.querySelector(`[data-id="${el.id}"]`), el);
});
});
Это обеспечивает корректное отображение элементов без нарушения виртуальной модели.
Эти методы формируют основу эффективного управления интерактивными интерфейсами с использованием Interact.js и позволяют создавать сложные, отзывчивые и высокопроизводительные веб-приложения.