Skip to content

v-hover

Track hover state with callbacks and CSS classes.

Since: 1.1.0

Usage

Basic

vue
<template>
  <div v-hover="handleHover">Hover me</div>
</template>

<script setup>
function handleHover(isHovering, event) {
  console.log('Hovering:', isHovering)
}
</script>

With Options

vue
<template>
  <div v-hover="{
    onEnter: handleEnter,
    onLeave: handleLeave,
    class: 'is-hovering'
  }">
    Hover me
  </div>
</template>

<script setup>
function handleEnter(event) {
  console.log('Mouse entered')
}

function handleLeave(event) {
  console.log('Mouse left')
}
</script>

API

Types

typescript
type HoverHandler = (isHovering: boolean, event: MouseEvent) => void

interface HoverOptions {
  /** Callback when hover state changes */
  handler?: HoverHandler
  /** Callback when mouse enters */
  onEnter?: (event: MouseEvent) => void
  /** Callback when mouse leaves */
  onLeave?: (event: MouseEvent) => void
  /** CSS class to add when hovering */
  class?: string
  /** Disable the directive */
  disabled?: boolean
  /** Delay before enter callback */
  enterDelay?: number
  /** Delay before leave callback */
  leaveDelay?: number
}

type HoverBinding = HoverHandler | HoverOptions

Options

OptionTypeDefaultDescription
handlerFunction-Callback when hover state changes
onEnterFunction-Callback on mouse enter
onLeaveFunction-Callback on mouse leave
classstring'v-hover'CSS class when hovering
disabledbooleanfalseDisable the directive
enterDelaynumber0Delay before enter callback
leaveDelaynumber0Delay before leave callback

Examples

Card Hover Effect

vue
<template>
  <div v-hover="{ class: 'card-hover' }" class="card">
    Card content
  </div>
</template>

<style>
.card {
  transition: transform 0.3s, box-shadow 0.3s;
}

.card-hover {
  transform: translateY(-4px);
  box-shadow: 0 8px 16px rgba(0,0,0,0.15);
}
</style>

Tooltip

vue
<template>
  <div v-hover="{
    onEnter: showTooltip,
    onLeave: hideTooltip,
    enterDelay: 200
  }">
    Hover for tooltip
    <div v-if="tooltipVisible" class="tooltip">
      Tooltip content
    </div>
  </div>
</template>

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

const tooltipVisible = ref(false)

function showTooltip() {
  tooltipVisible.value = true
}

function hideTooltip() {
  tooltipVisible.value = false
}
</script>
vue
<template>
  <div
    v-for="item in menuItems"
    :key="item.id"
    v-hover="{ handler: (hovering) => activeItem = hovering ? item.id : null }"
    :class="{ active: activeItem === item.id }"
  >
    {{ item.label }}
  </div>
</template>

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

const activeItem = ref(null)
const menuItems = [
  { id: 1, label: 'Home' },
  { id: 2, label: 'About' },
  { id: 3, label: 'Contact' }
]
</script>

Composable API

For programmatic use, you can use the useHover composable:

typescript
import { useHover } from 'directix'

const { isHovering, bind } = useHover({
  onEnter: (event) => console.log('Mouse entered'),
  onLeave: (event) => console.log('Mouse left'),
  class: 'is-hovering',
  enterDelay: 100,
  leaveDelay: 100
})

// Bind to element
onMounted(() => {
  const unbind = bind(buttonRef.value)
  onUnmounted(unbind)
})

UseHoverOptions

OptionTypeDefaultDescription
onEnter(event: MouseEvent) => void-Callback when mouse enters
onLeave(event: MouseEvent) => void-Callback when mouse leaves
classstring-CSS class to add when hovering
enterDelaynumber | Ref<number>0Delay before enter callback
leaveDelaynumber | Ref<number>0Delay before leave callback

UseHoverReturn

PropertyTypeDescription
isHoveringReadonly<Ref<boolean>>Whether the element is being hovered
bind(element: HTMLElement) => () => voidBind hover tracking to an element

Example

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

const buttonRef = ref(null)
const { isHovering, bind } = useHover({
  onEnter: () => console.log('Mouse entered'),
  onLeave: () => console.log('Mouse left'),
  enterDelay: 100
})

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

<template>
  <button ref="buttonRef" :class="{ 'is-hovering': isHovering }">
    Hover Me
  </button>
</template>

Code Generator

Quick Code Generator
<template>
  <div v-hover="{ enterDelay: 0, leaveDelay: 0 }">
    <!-- Track hover state with callbacks and CSS classes. directive -->
  </div>
</template>

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

// Configure your options here
const options = { enterDelay: 0, leaveDelay: 0 }
</script>

Released under the MIT License.