Библиотека Interact.js предоставляет мощные
возможности для работы с интерактивными элементами, включая поддержку
изменения размеров элементов (resize). События изменения
размера позволяют отслеживать и управлять поведением элементов при
масштабировании, обеспечивая динамическое обновление интерфейса и
гибкость пользовательских взаимодействий.
Для начала нужно инициализировать элемент как интерактивный с возможностью изменения размера:
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
modifiers: [
interact.modifiers.restrictSize({
min: { width: 100, height: 50 },
max: { width: 500, height: 300 }
})
],
inertia: true
});
Пояснения ключевых опций:
edges — указывает, с каких сторон элемента разрешено
изменять размер.modifiers.restrictSize — ограничивает минимальные и
максимальные размеры элемента.inertia — включает эффект инерции при отпускании мыши,
делая анимацию более плавной.Interact.js предоставляет несколько событий, связанных с изменением размера:
resizestart — срабатывает в момент
начала изменения размера. Используется для подготовки интерфейса,
сохранения исходных размеров или положения элемента.resizemove — основной обработчик,
вызываемый на каждом шаге изменения размера. Здесь можно динамически
изменять размеры элемента, обновлять данные или отображение.resizeend — срабатывает после
завершения изменения размера. Часто используется для сохранения
финальных значений или запуска анимаций.Пример привязки обработчиков:
interact('.resizable')
.on('resizestart', function (event) {
console.log('Начало изменения размера', event.rect);
})
.on('resizemove', function (event) {
let target = event.target;
target.style.width = event.rect.width + 'px';
target.style.height = event.rect.height + 'px';
target.textContent = `${Math.round(event.rect.width)} x ${Math.round(event.rect.height)}`;
})
.on('resizeend', function (event) {
console.log('Изменение размера завершено', event.rect);
});
При изменении размера может изменяться положение элемента, особенно
при растяжении с левой или верхней стороны. Для корректного отображения
важно учитывать deltaRect и смещения:
.on('resizemove', function (event) {
let target = event.target;
let x = (parseFloat(target.getAttribute('data-x')) || 0) + event.deltaRect.left;
let y = (parseFloat(target.getAttribute('data-y')) || 0) + event.deltaRect.top;
target.style.width = event.rect.width + 'px';
target.style.height = event.rect.height + 'px';
target.style.transform = `translate(${x}px, ${y}px)`;
target.setAttribute('data-x', x);
target.setAttribute('data-y', y);
});
Особенности:
event.rect — текущий размер и позиция элемента
относительно его исходного состояния.event.deltaRect — изменение размеров и позиции с
предыдущего шага.data-x и data-y — атрибуты для хранения
текущей позиции, чтобы трансформации были корректными.Interact.js позволяет гибко настраивать ограничения и поведение изменения размера через модификаторы:
restrictEdges — ограничивает движение
краёв элемента в пределах контейнера.restrictSize — задаёт минимальные и
максимальные размеры.snap — обеспечивает привязку к сетке
или определённым размерам.aspectRatio — фиксирует соотношение
ширины и высоты при изменении размера.Пример использования нескольких модификаторов одновременно:
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
modifiers: [
interact.modifiers.restrictSize({
min: { width: 50, height: 50 },
max: { width: 400, height: 400 }
}),
interact.modifiers.aspectRatio({
ratio: 'preserve'
}),
interact.modifiers.snap({
targets: [interact.createSnapGrid({ x: 20, y: 20 })],
range: Infinity,
relativePoints: [{ x: 0, y: 0 }]
})
]
});
resizemove для снижения нагрузки на рендеринг.data-*
атрибутах или в состоянии приложения для корректной работы при повторном
рендеринге.inertia с modifiers для
плавного и ограниченного изменения размеров.Благодаря продуманной системе событий, модификаторов и координатного управления, Interact.js обеспечивает точное и гибкое управление изменением размеров элементов в интерфейсе, позволяя создавать сложные интерактивные приложения без необходимости писать низкоуровневый код для обработки drag & resize.