Skip to content

useMouseInElement

Category
Export Size
1.87 kB
Last Changed
3 weeks ago

Reactive mouse position related to an element

Demo

Hover me
x: 0
y: 0
sourceType: null
elementX: -416
elementY: -424
elementPositionX: 416
elementPositionY: 424
elementHeight: 160
elementWidth: 160
isOutside: true

Usage

vue
<script setup lang="ts">
import { 
useMouseInElement
} from '@vueuse/core'
import {
useTemplateRef
} from 'vue'
const
target
=
useTemplateRef
<HTMLDivElement>('target')
const {
x
,
y
,
isOutside
} =
useMouseInElement
(
target
)
</script> <template> <
div
ref
="
target
">
<
h1
>Hello world</
h1
>
</
div
>
</template>

Component Usage

This function also provides a renderless component version via the @vueuse/components package. Learn more about the usage.

vue
<template>
  <UseMouseInElement v-slot="{ 
elementX
,
elementY
,
isOutside
}">
x: {{
elementX
}}
y: {{
elementY
}}
Is Outside: {{
isOutside
}}
</UseMouseInElement> </template>

Directive Usage

This function also provides a directive version via the @vueuse/components package. Learn more about the usage.

vue
<script setup lang="ts">
import { 
vMouseInElement
} from '@vueuse/components'
import {
UseMouseSourceType
} from '@vueuse/core'
interface MouseInElementType {
x
: number
y
: number
sourceType
:
UseMouseSourceType
elementX
: number
elementY
: number
elementPositionX
: number
elementPositionY
: number
elementHeight
: number
elementWidth
: number
isOutside
: boolean
} const
options
= {
handleOutside
: true
} function
onMouseInElement
({
x
,
y
,
sourceType
,
elementX
,
elementY
,
elementPositionX
,
elementPositionY
,
elementHeight
,
elementWidth
,
isOutside
}: MouseInElementType) {
console
.
log
(
x
,
y
,
sourceType
,
elementX
,
elementY
,
elementPositionX
,
elementPositionY
,
elementHeight
,
elementWidth
,
isOutside
)
} </script> <template> <
textarea
v-mouse-in-elem
ent="
onMouseInElement
" />
<!-- with options --> <
textarea
v-mouse-in-elem
ent="
[
onMouseInElement
,
options
]
" />
</template>

Type Declarations

Show Type Declarations
ts
export interface MouseInElementOptions extends UseMouseOptions {
  /**
   * Whether to handle mouse events when the cursor is outside the target element.
   * When enabled, mouse position will continue to be tracked even when outside the element bounds.
   *
   * @default true
   */
  
handleOutside
?: boolean
/** * Listen to window resize event * * @default true */
windowScroll
?: boolean
/** * Listen to window scroll event * * @default true */
windowResize
?: boolean
} /** * Reactive mouse position related to an element. * * @see https://vueuse.org/useMouseInElement * @param target * @param options */ export declare function
useMouseInElement
(
target
?:
MaybeElementRef
,
options
?: MouseInElementOptions,
): {
x
:
ShallowRef
<number, number>
y
:
ShallowRef
<number, number>
sourceType
:
ShallowRef
<
UseMouseSourceType
,
UseMouseSourceType
>
elementX
:
ShallowRef
<number, number>
elementY
:
ShallowRef
<number, number>
elementPositionX
:
ShallowRef
<number, number>
elementPositionY
:
ShallowRef
<number, number>
elementHeight
:
ShallowRef
<number, number>
elementWidth
:
ShallowRef
<number, number>
isOutside
:
ShallowRef
<boolean, boolean>
stop
: () => void
} export type
UseMouseInElementReturn
=
ReturnType
<typeof
useMouseInElement
>

Source

SourceDemoDocs

Contributors

Anthony Fu
Anthony Fu
wheat
IlyaL
Zhong
codlin
IlyaL
Robin
Fernando Fernández
青椒肉丝
Jakub Freisler
Coder Poet
Aymoc
Mikhailov Nikita
vaakian X
Jelf
Ivan Agafonov
Shinigami
Alex Kozack
ctholho
Nurettin Kaya
Antério Vieira

Changelog

v13.6.0 on
cf02b - fix: correctly update elementX and elementY (#4846)
v13.4.0 on
04af9 - fix: fixing the issue where target element updates were not considered. (#4782)
v12.4.0 on
dd316 - feat: use passive event handlers everywhere is possible (#4477)
v12.3.0 on
34be5 - feat: added directive for vMouseInElement (#4438)
v12.0.0-beta.1 on
0a9ed - feat!: drop Vue 2 support, optimize bundles and clean up (#4349)
v11.1.0 on
4dcc2 - fix: allow el to be instanceof Element (#4189)
v11.0.0-beta.2 on
efe4d - fix: el.getBoundingClientRect is not a function (#4056)
v10.7.0 on
fccf2 - feat: upgrade deps (#3614)
v10.6.0 on
7c88d - fix: optimize outside computation (#3380)

Released under the MIT License.

Build faster with AI
New Masterclass to help you leverage AI in your Vue workflow
Get Early Access