В Interact.js изменение размера элементов
реализуется через метод resizable, который позволяет
задавать направления изменения (edges) и ограничения по
минимальным и максимальным размерам (restrictSize). Одной
из важных особенностей является обработка инверсий — ситуации, когда
элемент «переворачивается» при перетягивании за противоположные
края.
Инверсия возникает, когда координата курсора пересекает исходную
позицию элемента по оси, на которой происходит изменение размера.
Например, при изменении ширины справа налево координата
clientX становится меньше начальной координаты элемента,
что потенциально может привести к отрицательным значениям ширины.
Interact.js предлагает встроенные механизмы для корректной работы с
такими ситуациями:
Для активации поддержки инверсий используется конфигурация при
инициализации resizable:
interact('.resizable-element')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
modifiers: [
interact.modifiers.restrictEdges({
outer: 'parent',
endOnly: true
}),
interact.modifiers.restrictSize({
min: { width: 50, height: 50 },
max: { width: 500, height: 500 }
})
],
invert: true
})
.on('resizemove', event => {
const { x, y } = event.deltaRect;
event.target.style.width = `${event.rect.width}px`;
event.target.style.height = `${event.rect.height}px`;
event.target.style.transform = `translate(${x}px, ${y}px)`;
});
Ключевые моменты конфигурации:
edges — задает стороны элемента, за которые можно
тянуть. Включение всех сторон важно для полной поддержки инверсий.modifiers.restrictEdges — предотвращает выход элемента
за пределы родителя при инверсии.modifiers.restrictSize — фиксирует минимальные и
максимальные размеры, предотвращая некорректные отрицательные
значения.invert: true — активирует внутреннюю обработку случаев,
когда элемент «пересекает» исходные координаты.Событие resizemove при инверсии генерируется аналогично
стандартному изменению размера, но с дополнительными особенностями:
Инверсии особенно чувствительны к ограничениям размеров. Если минимальные и максимальные значения заданы некорректно, элемент может:
restrictEdges.Для корректной работы рекомендуется использовать комбинацию модификаторов:
modifiers: [
interact.modifiers.restrictSize({ min: { width: 80, height: 80 } }),
interact.modifiers.restrictEdges({ outer: 'parent' })
]
Типичный сценарий с полной поддержкой инверсий выглядит так:
resizable и включением всех
сторон (edges).restrictSize и
restrictEdges.invert: true.width, height и
transform в событии resizemove.Такой подход обеспечивает:
deltaRect для
трансформации вместо прямого сложения координат. Это уменьшает
вероятность «скачков» элемента при быстром изменении размеров.Эта стратегия позволяет создавать интерактивные интерфейсы с гибким управлением размерами элементов, которые ведут себя предсказуемо даже при экстремальных действиях пользователя.