Skip to content

Instantly share code, notes, and snippets.

@alvarogfn
Created July 3, 2023 21:56
Show Gist options
  • Save alvarogfn/c162a4e487cb9b0145d17766d36e7240 to your computer and use it in GitHub Desktop.
Save alvarogfn/c162a4e487cb9b0145d17766d36e7240 to your computer and use it in GitHub Desktop.
Horizontal Click and Drag Scrolling with Vue Composable
export const useDragToScroll = (ref: Ref<HTMLElement | null>) => {
  const position = {
    left: 0,
    x: 0
  }

  const mouseDown = (event: MouseEvent) => {
    if (ref.value === null) return
    position.x = event.clientX
    position.left = ref.value.scrollLeft
    ref.value.style.cursor = 'grabbing'

    document.addEventListener('mousemove', mouseMove)
    document.addEventListener('mouseup', mouseUp)
  }

  const mouseMove = (event: MouseEvent) => {
    if (ref.value === null) return
    const moveX = event.clientX - position.x
    ref.value.scrollLeft = position.left - moveX
  }

  function mouseUp() {
    document.removeEventListener('mousemove', mouseMove)
    document.removeEventListener('mouseup', mouseUp)
    if (ref.value) ref.value.style.cursor = 'grab'
  }

  onMounted(() => {
    if (ref.value === null) return
    ref.value.addEventListener('mousedown', mouseDown)
  })

  onUnmounted(() => {
    if (ref.value === null) return
    ref.value.removeEventListener('mousedown', mouseDown)
  })
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment