Skip to content

Swipe ​

Detect directional touch swipes on an element with configurable threshold and optional mouse-wheel guards.

Swipe attaches touch listeners to a DOM element and fires callbacks for left, right, up and down swipes once a configurable distance threshold is crossed.

Usage ​

ts
import { Swipe } from '@maz-ui/utils'

const swipe = new Swipe({
  element: '#carousel',
  immediate: true,
  onLeft: () => carousel.next(),
  onRight: () => carousel.prev(),
})

// later
swipe.stop()

API ​

ts
class Swipe {
  constructor(options: SwipeOptions)

  start(element?: HTMLElement | string | null): void
  stop(): void

  xStart?: number
  yStart?: number
  xEnd?: number
  yEnd?: number
  xDiff?: number
  yDiff?: number
}

Options ​

OptionTypeDefaultDescription
elementHTMLElement | string | nullnullTarget element or CSS selector.
thresholdnumber50Minimum distance in px before a swipe is recognised.
onLeft / onRight / onUp / onDown(event: TouchEvent) => void—Direction callbacks.
onValuesChanged(values: SwipeValues) => void—Fires whenever start/end/diff values are updated — useful for live tracking.
preventDefaultOnTouchMovebooleanfalseCalls event.preventDefault() on touchmove.
preventDefaultOnMouseWheelbooleanfalseCalls event.preventDefault() on mousewheel.
immediatebooleanfalseAttach listeners immediately from the constructor.
triggerOnEndbooleanfalseFire direction callbacks on touchend instead of on every touchmove.

Methods ​

  • start(element?) — Begin listening. Optionally re-target a new element.
  • stop() — Detach all listeners. Live values reset.

Examples ​

Slide-based gallery:

ts
new Swipe({
  element: '.gallery',
  immediate: true,
  threshold: 80,
  triggerOnEnd: true,
  onLeft: () => gallery.next(),
  onRight: () => gallery.previous(),
})

Live progress while dragging:

ts
new Swipe({
  element: '.draggable',
  immediate: true,
  onValuesChanged: ({ xDiff }) => {
    if (typeof xDiff === 'number') {
      drawer.style.transform = `translateX(${-xDiff}px)`
    }
  },
})