В библиотеке Interact.js для управления интерактивными элементами широко используется возможность ограничивать область перемещения (drag constraints). Это позволяет задавать границы, в которых элемент может перемещаться, предотвращая выход за пределы контейнера или заданной области. Ограничения могут применяться как к конкретным координатам, так и к прямоугольной или произвольной области.
restrictМетод draggable поддерживает модификатор
restrict, который позволяет определять правила ограничения.
Синтаксис:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrict({
restriction: 'parent',
endOnly: true,
elementRect: { top: 0, left: 0, bottom: 1, right: 1 }
})
],
listeners: {
move (event) {
event.target.style.transform =
`translate(${event.pageX}px, ${event.pageY}px)`;
}
}
});
Пояснения к ключевым параметрам:
restriction – область, в пределах которой элемент
может перемещаться. Может быть:
'parent' — ограничение рамками родительского
элемента.{ top, left, bottom, right } —
точные числовые границы.endOnly – если true, ограничение
применяется только в момент завершения перемещения, иначе — на
протяжении всего drag-события.
elementRect – объект, определяющий, какая часть
элемента учитывается при ограничении. Поля принимают значения от
0 до 1 и соответствуют доле ширины и высоты
элемента.
Для точного контроля можно задавать ограничения в виде объекта с координатами:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrict({
restriction: { top: 50, left: 100, bottom: 400, right: 600 },
endOnly: false
})
]
});
В этом примере элемент не сможет выйти за прямоугольник с верхней
границей 50px, левой — 100px, нижней —
400px, правой — 600px.
Наиболее часто используемый вариант — ограничение перемещения рамками
родительского контейнера. Для этого достаточно указать
restriction: 'parent'. При этом elementRect
позволяет контролировать, какая часть элемента не должна пересекать
границы родителя:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrict({
restriction: 'parent',
elementRect: { top: 0, left: 0, bottom: 1, right: 1 }
})
]
});
elementRect: { top: 0, left: 0, bottom: 1, right: 1 }
означает, что учитывается весь элемент при ограничении.bottom: 0.5, нижняя граница элемента может
выйти за пределы родителя на половину своей высоты.Interact.js позволяет задавать пользовательскую функцию для ограничения области. Это удобно, если область перемещения не является прямоугольной или зависит от динамических условий.
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrict({
restriction: function (x, y, element) {
const maxX = window.innerWidth - element.offsetWidth;
const maxY = window.innerHeight - element.offsetHeight;
return {
x: Math.min(Math.max(x, 0), maxX),
y: Math.min(Math.max(y, 0), maxY)
};
},
endOnly: false
})
]
});
В этой реализации координаты x и y
корректируются динамически с учетом размеров окна и самого элемента, что
предотвращает выход за видимую область.
Можно комбинировать restrict с модификатором
snap, чтобы элемент не только оставался в границах, но и
перемещался по дискретной сетке:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.snap({
targets: [interact.createSnapGrid({ x: 50, y: 50 })],
range: Infinity,
relativePoints: [{ x: 0, y: 0 }]
}),
interact.modifiers.restrict({
restriction: 'parent',
endOnly: false
})
]
});
Такой подход обеспечивает точное позиционирование и одновременное соблюдение границ контейнера.
endOnly: true уменьшает нагрузку на браузер, так как
ограничение проверяется только при завершении drag.{ x, y }, либо
DOM-элементом/координатами.snap, затем
restrict, чтобы позиция сначала скорректировалась по сетке,
а потом проверялась на ограничения.Использование ограничений Interact.js обеспечивает контроль над перемещением элементов, повышает UX и предотвращает неожиданные ситуации при drag-and-drop интерфейсах.