Skip to content

v-swipe

Detect swipe gestures on elements. Supports directional swipes with configurable thresholds.

Since: 1.3.0

Usage

Basic

vue
<template>
  <div v-swipe="handleSwipe">
    Swipe me in any direction
  </div>
</template>

<script setup>
function handleSwipe(direction) {
  console.log('Swiped:', direction) // 'left' | 'right' | 'up' | 'down'
}
</script>

With Directional Callbacks

vue
<template>
  <div v-swipe="{
    onLeft: () => prevSlide(),
    onRight: () => nextSlide(),
    onUp: () => console.log('Swiped up'),
    onDown: () => console.log('Swiped down')
  }">
    Swipe left or right to navigate
  </div>
</template>

API

Types

typescript
interface SwipeOptions {
  onLeft?: () => void
  onRight?: () => void
  onUp?: () => void
  onDown?: () => void
  onSwipe?: (direction: 'left' | 'right' | 'up' | 'down') => void
  threshold?: number // default: 50
  preventDefault?: boolean // default: true
  touchOnly?: boolean // default: false
}

type SwipeBinding = SwipeOptions | ((direction: 'left' | 'right' | 'up' | 'down') => void)

Options

OptionTypeDefaultDescription
onLeft() => void-Callback for left swipe
onRight() => void-Callback for right swipe
onUp() => void-Callback for up swipe
onDown() => void-Callback for down swipe
onSwipe(direction) => void-Callback with direction parameter
thresholdnumber50Minimum distance for swipe detection
preventDefaultbooleantruePrevent default scroll behavior
touchOnlybooleanfalseOnly detect touch events

Examples

vue
<template>
  <div
    v-swipe="{
      onLeft: nextImage,
      onRight: prevImage,
      threshold: 30
    }"
    class="carousel"
  >
    <img :src="images[currentIndex]" />
  </div>
</template>

Tab Navigation

vue
<template>
  <div v-swipe="handleSwipe" class="tabs-container">
    <div v-for="tab in tabs" :key="tab.id" v-show="tab.id === activeTab">
      {{ tab.content }}
    </div>
  </div>
</template>

<script setup>
function handleSwipe(direction) {
  if (direction === 'left') activeTab.value = nextTab()
  if (direction === 'right') activeTab.value = prevTab()
}
</script>

Composable API

For programmatic use, you can use the useSwipe composable:

typescript
import { useSwipe } from 'directix'

const { direction, lengthX, lengthY, isSwiping, bind } = useSwipe({
  handler: (direction, event) => console.log('Swiped:', direction),
  threshold: 30,
  maxTime: 500,
  directions: ['left', 'right', 'up', 'down'],
  preventScrollOnSwipe: true,
  mouse: true,
  onLeft: () => console.log('Swiped left'),
  onRight: () => console.log('Swiped right'),
  onUp: () => console.log('Swiped up'),
  onDown: () => console.log('Swiped down')
})

// Bind to element
onMounted(() => bind(container.value))

UseSwipeOptions

OptionTypeDefaultDescription
handlerSwipeHandler-Swipe handler callback
thresholdnumber | Ref<number>30Minimum distance to trigger
maxTimenumber | Ref<number>500Maximum time for swipe
directionsSwipeDirection[]['left', 'right', 'up', 'down']Allowed directions
preventScrollOnSwipebooleantruePrevent scroll on swipe
mousebooleantrueEnable mouse events
onLeft() => void-Left swipe callback
onRight() => void-Right swipe callback
onUp() => void-Up swipe callback
onDown() => void-Down swipe callback

UseSwipeReturn

PropertyTypeDescription
directionReadonly<Ref<SwipeDirection | null>>Current swipe direction
lengthXReadonly<Ref<number>>Horizontal swipe length
lengthYReadonly<Ref<number>>Vertical swipe length
isSwipingReadonly<Ref<boolean>>Whether a swipe is in progress
bind(element: HTMLElement) => () => voidBind swipe detection to an element

Example

vue
<script setup>
import { ref } from 'vue'
import { useSwipe } from 'directix'

const container = ref(null)
const { direction, bind } = useSwipe({
  onLeft: () => nextSlide(),
  onRight: () => prevSlide()
})

onMounted(() => bind(container.value))
</script>

<template>
  <div ref="container">
    Swipe me!
  </div>
</template>

Code Generator

Quick Code Generator
<template>
  <div v-swipe>
    <!-- Detect swipe gestures on elements. Supports directional swipes with configurable thresholds. directive -->
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

// Configure your options here
const options = {}
</script>

Released under the MIT License.