Skip to content

Instantly share code, notes, and snippets.

@joshnuss
Created September 6, 2024 19:26
Show Gist options
  • Save joshnuss/06e577ed197ad872618f89ce4fe57294 to your computer and use it in GitHub Desktop.
Save joshnuss/06e577ed197ad872618f89ce4fe57294 to your computer and use it in GitHub Desktop.
Draggable action for Svelte
/*
* Usage:
*
* <element use:draggable/>
*/
export function draggable(node) {
const bounds = node.getBoundingClientRect()
node.draggable = true
node.style.position = 'absolute'
node.style.left = `${bounds.left}px`
node.style.top = `${bounds.top}px`
let offset = null
function dragstart(event) {
const bounds = node.getBoundingClientRect()
offset = {
x: event.x - bounds.left,
y: event.y - bounds.top
}
}
function dragend(event) {
event.preventDefault()
node.style.left = `${event.x - offset.x}px`
node.style.top = `${event.y - offset.y}px`
offset = null
}
function dragover(event) {
event.preventDefault()
}
node.addEventListener('dragstart', dragstart)
node.addEventListener('dragend', dragend)
node.addEventListener('dragover', dragover)
return {
destroy() {
node.removeEventListener('dragstart', dragstart)
node.removeEventListener('dragend', dragend)
node.removeEventListener('dragover', dragover)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment