Существует библиотека перетаскивания с возможностью ограничивать перемещения перетаскиваемых объектов
https://github.com/dragee/dragee
По умолчанию она ограничивает перемещения элемента внутри родительского элемента. Он учитывает размер элемента.
import { Dragable } from 'dragee'
new Draggable(element, { parent: document.body })
В то же время можно использовать пользовательскую связанную функцию
import { Dragable, BoundToRectangle, Rectangle } from 'dragee'
new Draggable(element, {
bound: BoundToRectangle.bounding(Rectangle.fromElement(document.body, document.body))
})
, где BoundToElement
описывает необходимые ограничения
class BoundToRectangle {
constructor(rectangle) {
this.rectangle = rectangle
}
bound(point, size) {
const calcPoint = point.clone()
const rectP2 = this.rectangle.getP3()
if (this.rectangle.position.x > calcPoint.x) {
(calcPoint.x = this.rectangle.position.x)
}
if (this.rectangle.position.y > calcPoint.y) {
calcPoint.y = this.rectangle.position.y
}
if (rectP2.x < calcPoint.x + size.x) {
calcPoint.x = rectP2.x - size.x
}
if (rectP2.y < calcPoint.y + size.y) {
calcPoint.y = rectP2.y - size.y
}
return calcPoint
}
}
Размер элемента вы можете рассчитать следующим образом:
let width = parseInt(window.getComputedStyle(element)['width'])
let height = parseInt(window.getComputedStyle(element)['height'])
Я также могу предложить использовать свойство translate3d
для движений вместо позиций слева и сверху, потому что это более эффективно