RestrictRect — это один из мощных модулей в
библиотеке Interact.js, позволяющий задавать
прямоугольную область, в пределах которой можно перемещать или
масштабировать элементы. Он используется в методах
draggable и resizable для контроля движения
объектов и предотвращения выхода за границы контейнера.
Чтобы применить ограничение, используется опция restrict
при инициализации Interact.js:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: '.container',
endOnly: true
})
],
inertia: true
});
Разбор параметров:
restriction — задает область ограничения. Может
быть:
'.container'),document.getElementById('container')),{ top, left, bottom, right }.endOnly — если true, ограничение
применяется только после завершения перетаскивания. Если
false, элемент будет ограничен на каждом кадре
движения.
elementRect — определяет, какая часть элемента
учитывается при проверке ограничений (по умолчанию
{ top: 0, left: 0, bottom: 1, right: 1 }).
Можно задать ограничение не через селектор, а явно через координаты:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: {
top: 50,
left: 50,
bottom: 300,
right: 500
},
endOnly: false
})
]
});
В этом случае элемент не сможет покинуть область с верхним левым
углом в (50, 50) и нижним правым в
(500, 300).
При перемещении важно учитывать размеры элемента, чтобы не допустить
частичного выхода за границы контейнера. Для этого используется параметр
elementRect:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: '.container',
elementRect: { top: 0, left: 0, bottom: 1, right: 1 },
endOnly: false
})
]
});
{ top: 0, left: 0, bottom: 1, right: 1 } — стандартное
значение, при котором ограничение проверяется по всем границам
элемента.RestrictRect также работает с изменением размеров элемента:
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
modifiers: [
interact.modifiers.restrictRect({
restriction: '.container',
endOnly: true
})
]
});
Interact.js поддерживает комбинирование RestrictRect
с другими модификаторами, например snap или
restrictEdges:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.snap({ targets: [interact.snappers.grid({ x: 50, y: 50 })] }),
interact.modifiers.restrictRect({
restriction: '.container'
})
]
});
endOnly: true, если требуется плавное
перетаскивание без жестких ограничений во время движения.interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: function (target, element) {
return element.parentNode.getBoundingClientRect();
}
})
]
});
resizable учитывать
elementRect, чтобы изменение размеров не выводило элемент
за пределы контейнера.Если элемент находится внутри контейнера с прокруткой, нужно учитывать смещение скролла:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: function (target, element) {
const rect = element.parentNode.getBoundingClientRect();
return {
top: rect.top + element.parentNode.scrollTop,
left: rect.left + element.parentNode.scrollLeft,
bottom: rect.bottom + element.parentNode.scrollTop,
right: rect.right + element.parentNode.scrollLeft
};
}
})
]
});
Это позволяет корректно ограничивать элемент даже при прокрутке контейнера.
Ключевые особенности RestrictRect:
draggable и resizable.elementRect.Эта система обеспечивает точный контроль над перемещением и размером элементов в Interact.js, делая интерфейс предсказуемым и удобным для пользователя.