Interact.js предоставляет мощные инструменты для создания интерактивных элементов пользовательского интерфейса, включая модальные окна и диалоговые панели. Основные возможности библиотеки включают перетаскивание (drag), изменение размера (resize) и инерцию движения, что позволяет создавать гибкие и отзывчивые интерфейсы.
Для модальных окон особенно полезны функции drag и resize, позволяющие пользователю перемещать окно по экрану и изменять его размеры в реальном времени.
Для того чтобы модальное окно можно было перетаскивать, используется
метод interact(target).draggable(options). Основные
параметры:
inertia — включает инерцию движения при отпускании
элемента.modifiers — позволяет ограничивать перемещение в
пределах контейнера или определённой области.listeners — набор событий для отслеживания движения
(start, move, end).Пример кода:
interact('.modal')
.draggable({
inertia: true,
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent',
endOnly: true
})
],
listeners: {
start (event) {
console.log('Начало перемещения', event.target);
},
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);
},
end (event) {
console.log('Перемещение завершено', event.target);
}
}
});
Ключевой момент: использование атрибутов
data-x и data-y позволяет сохранять текущую
позицию окна между перемещениями и корректно применять
трансформации.
Для создания динамически масштабируемых окон применяется метод
interact(target).resizable(options). Важные параметры:
edges — указывает, какие стороны окна будут активными
для изменения размера (top, left,
bottom, right).modifiers — ограничивает минимальные и максимальные
размеры, предотвращая «схлопывание» окна.listeners — отслеживает события изменения размера
(start, move, end).Пример:
interact('.modal')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
modifiers: [
interact.modifiers.restrictSize({
min: { width: 200, height: 150 },
max: { width: 800, height: 600 }
})
],
listeners: {
move (event) {
const target = event.target;
let x = (parseFloat(target.getAttribute('data-x')) || 0);
let y = (parseFloat(target.getAttribute('data-y')) || 0);
target.style.width = `${event.rect.width}px`;
target.style.height = `${event.rect.height}px`;
x += event.deltaRect.left;
y += event.deltaRect.top;
target.style.transform = `translate(${x}px, ${y}px)`;
target.setAttribute('data-x', x);
target.setAttribute('data-y', y);
}
}
});
Выделение ключевого момента: сочетание
deltaRect и transform обеспечивает корректное
масштабирование даже при перемещении окна одновременно с изменением
размера.
Interact.js позволяет одновременно использовать перетаскивание и изменение размера для одного элемента. Для модальных окон это создаёт полноценный интерактивный интерфейс, где окно можно перемещать и масштабировать свободно.
interact('.modal')
.draggable({ /* параметры drag */ })
.resizable({ /* параметры resize */ });
При этом важно учитывать правильное управление координатами через
data-x и data-y, чтобы оба действия не
конфликтовали друг с другом.
Для модальных окон часто требуется, чтобы окно не выходило за пределы родительского контейнера. Interact.js предоставляет модификаторы:
restrictRect — ограничивает перемещение в заданной
области.restrictSize — задаёт минимальные и максимальные
размеры окна.Пример комбинирования:
modifiers: [
interact.modifiers.restrictRect({ restriction: 'parent', endOnly: true }),
interact.modifiers.restrictSize({ min: { width: 200, height: 150 } })
]
Это позволяет создавать окна с предсказуемым поведением, предотвращая перекрытие других элементов интерфейса или выход за пределы видимой области.
Interact.js поддерживает несколько событий жизненного цикла:
dragstart / resizestart — начало
взаимодействия.dragmove / resizemove — движение или
изменение размера.dragend / resizeend — завершение
действия.Для модальных окон часто применяются следующие сценарии:
Interact.js легко интегрируется с существующими библиотеками для
модальных окон (например, Bootstrap Modal или кастомными
диалогами). Используется для добавления интерактивности поверх
стандартного функционала:
Пример совместного использования:
const modal = document.querySelector('#customModal');
interact(modal)
.draggable({ /* drag options */ })
.resizable({ /* resize options */ });
Такой подход позволяет создавать динамичные, интерактивные диалоги без необходимости полностью переписывать модальные библиотеки.
Пример snap:
interact('.modal')
.draggable({
modifiers: [
interact.modifiers.snap({
targets: [interact.createSnapGrid({ x: 50, y: 50 })],
range: Infinity,
relativePoints: [{ x: 0, y: 0 }]
})
]
});
Это обеспечивает точное позиционирование окна и улучшает UX при перетаскивании и выравнивании диалогов.
Эти инструменты Interact.js создают основу для создания гибких, адаптивных и интерактивных модальных окон и диалогов в веб-приложениях, позволяя управлять положением, размером и поведением элементов с высокой точностью.