При наведении курсора мыши необходимо сохранить дельту между позицией мыши и позицией div.Затем, при перемещении мыши, вы должны вычесть предыдущую дельту в положение мыши по событию
element.addEventListener('mousedown', event => {
const rel = (() => {
const x = event.clientX - parseInt(this.style.left)
const y = event.clientY - parseInt(this.style.top)
return { x: x, y: y }
})()
const moveHandler = event => {
this.style.left = event.clientX - rel.x + 'px'
this.style.top = event.clientY - rel.y + 'px'
}
const endHandler = () => {
window.removeEventListener('mousemove', moveHandler, false)
window.removeEventListener('mouseup', endHandler, false)
}
window.addEventListener('mousemove', moveHandler, false)
window.addEventListener('mouseup', endHandler, false)
}
РЕДАКТИРОВАТЬ: для плавного перемещения вы должны использовать перевод css вместо элемента left / top