Skip to content
Sensors

useMouse

Tracks the mouse/pointer cursor position reactively. Supports multiple coordinate systems (page, client, screen, movement) and optional touch event tracking.

useMouse

Track mouse cursor position in real-time.

Coordinate Type
X
0px
Y
0px
Source: none
move your mouse here
import {
const useMouse: (options?: DeepMaybeObservable<UseMouseOptions>) => UseMouseReturn
useMouse
} from "@usels/web";
function
function Component(): JSX.Element
Component
() {
const {
const x$: ReadonlyObservable<number>

X coordinate

x$
,
const y$: ReadonlyObservable<number>

Y coordinate

y$
,
const sourceType$: ReadonlyObservable<UseMouseSourceType>

Event source type: "mouse" | "touch" | null

sourceType$
} =
function useMouse(options?: DeepMaybeObservable<UseMouseOptions>): UseMouseReturn

Framework-agnostic mouse/touch position tracker.

Monitors mousemove and optionally touchstart/touchmove/touchend events on a target (default: window) and exposes reactive coordinates.

useMouse
();
return (
<
JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div
>
{
const x$: ReadonlyObservable<number>

X coordinate

x$
.
ImmutableObservableBase<number>.get(trackingType?: TrackingType | GetOptions): {}
get
()}, {
const y$: ReadonlyObservable<number>

Y coordinate

y$
.
ImmutableObservableBase<number>.get(trackingType?: TrackingType | GetOptions): {}
get
()} — {
const sourceType$: ReadonlyObservable<UseMouseSourceType>

Event source type: "mouse" | "touch" | null

sourceType$
.
ImmutableObservableBase<UseMouseSourceType>.get(trackingType?: TrackingType | GetOptions): any
get
()}
</
JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div
>
);
}

The type option selects which coordinate system to use. It is read only at mount time.

// @noErrors
import { useMouse } from "@usels/web";
// ---cut---
// "page" (default) — relative to the document
const { x$, y$ } = useMouse({ type: "page" });
// "client" — relative to the viewport
const { x$: cx$, y$: cy$ } = useMouse({ type: "client" });
// "screen" — relative to the screen
const { x$: sx$, y$: sy$ } = useMouse({ type: "screen" });
// "movement" — delta movement since last event (MouseEvent.movementX/Y)
const { x$: mx$, y$: my$ } = useMouse({ type: "movement" });

Touch tracking is enabled by default. Use touch: false to disable it, or resetOnTouchEnds: true to reset coordinates back to the initial value when the finger lifts.

// @noErrors
import { useMouse } from "@usels/web";
// ---cut---
// Disable touch tracking
const { x$, y$ } = useMouse({ touch: false });
// Reset to origin on touchend
const { x$: rx$, y$: ry$ } = useMouse({ resetOnTouchEnds: true });

By default events are listened on window. Pass any element (or an Observable wrapping one) via target to scope tracking to that element.

// @noErrors
import { useRef$ } from "@usels/core";
import { useMouse } from "@usels/web";
function Component() {
const el$ = useRef$<HTMLDivElement>();
const { x$, y$ } = useMouse({ target: el$ });
return (
<div ref={el$}>
{x$.get()}, {y$.get()}
</div>
);
}

Use useMouse for global coordinates while useMouseInElement provides element-relative coordinates at the same time.

// @noErrors
import { useRef$ } from "@usels/core";
import { useMouse, useMouseInElement } from "@usels/web";
function Component() {
const el$ = useRef$<HTMLDivElement>();
const { x$, y$ } = useMouse();
const { elementX$, elementY$, isOutside$ } = useMouseInElement(el$);
return (
<div ref={el$}>
Global: {x$.get()}, {y$.get()}
<br />
Local: {elementX$.get()}, {elementY$.get()} (outside: {String(isOutside$.get())})
</div>
);
}
ParameterTypeDescription
optionsUseMouseOptions (optional)-
OptionTypeDefaultDescription
typeUseMouseCoordType-Coordinate type. Default: “page”
touchboolean-Track touch events. Default: true
resetOnTouchEndsboolean-Reset coordinates on touchend. Default: false
targetMaybeEventTarget-Event target. Default: window
initialValue{ x: number; y: number; }-Initial coordinate values. Default: { x: 0, y: 0 }
eventFilterEventFilter<any[], any, void>--
windowWindowSource--

UseMouseReturn

NameTypeDescription
x$ReadonlyObservable<number>X coordinate
y$ReadonlyObservable<number>Y coordinate
sourceType$ReadonlyObservable<UseMouseSourceType>Event source type: “mouse” | “touch” | null

View on GitHub