Skip to content
Sensors

useMousePressed

Tracks mouse/touch press state reactively. Returns an observable boolean for the pressed state and the source type that triggered it.

useMousePressed

Track mouse/touch press state reactively.

Released
Source: none
press or touch here
import {
const useMousePressed: (options?: DeepMaybeObservable<UseMousePressedOptions>) => UseMousePressedReturn
useMousePressed
} from "@usels/web";
function
function Component(): JSX.Element
Component
() {
const {
const pressed$: ReadonlyObservable<boolean>

Current pressed state

pressed$
,
const sourceType$: ReadonlyObservable<UseMousePressedSourceType>

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

sourceType$
} =
function useMousePressed(options?: DeepMaybeObservable<UseMousePressedOptions>): UseMousePressedReturn

Framework-agnostic mouse/touch press state tracker.

Monitors pointerdown/pointerup and optionally touchstart/touchend/touchcancel events on a target (default: window) and exposes reactive pressed state.

useMousePressed
();
return (
<
JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div
>
{
const pressed$: ReadonlyObservable<boolean>

Current pressed state

pressed$
.
ImmutableObservableBase<boolean>.get(trackingType?: TrackingType | GetOptions): {}
get
() ? "Pressed" : "Released"} — {
const sourceType$: ReadonlyObservable<UseMousePressedSourceType>

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

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

By default events are listened on window. Pass any element via target to scope tracking to that element.

// @noErrors
import { useRef$ } from "@usels/core";
import { useMousePressed } from "@usels/web";
function Component() {
const el$ = useRef$<HTMLDivElement>();
const { pressed$ } = useMousePressed({ target: el$ });
return (
<div ref={el$} style={{ background: pressed$.get() ? "blue" : "gray" }}>
Press me
</div>
);
}

Touch tracking is enabled by default. Use touch: false to disable it.

// @noErrors
import { useMousePressed } from "@usels/web";
// ---cut---
// Disable touch tracking
const { pressed$ } = useMousePressed({ touch: false });

Use onPressed and onReleased callbacks to react to press events without subscribing to observables.

// @noErrors
import { useMousePressed } from "@usels/web";
// ---cut---
const { pressed$ } = useMousePressed({
onPressed: (e) => console.log("pressed", e),
onReleased: (e) => console.log("released", e),
});

Set preventDragEvent: true to prevent the default drag behavior while pressing.

// @noErrors
import { useMousePressed } from "@usels/web";
// ---cut---
const { pressed$ } = useMousePressed({ preventDragEvent: true });

Use useMousePressed alongside useMouse to track both cursor position and press state simultaneously.

// @noErrors
import { useRef$ } from "@usels/core";
import { useMouse, useMousePressed } from "@usels/web";
function Component() {
const el$ = useRef$<HTMLDivElement>();
const { x$, y$ } = useMouse({ target: el$ });
const { pressed$, sourceType$ } = useMousePressed({ target: el$ });
return (
<div ref={el$}>
Position: {x$.get()}, {y$.get()}
<br />
Pressed: {String(pressed$.get())} ({sourceType$.get() ?? "none"})
</div>
);
}
ParameterTypeDescription
optionsUseMousePressedOptions (optional)-
OptionTypeDefaultDescription
touchboolean-Track touch events. Default: true
targetMaybeEventTarget-Event target for press detection. Default: window
preventDragEventboolean-Prevent drag — calls preventDefault on pointerdown. Default: false
onPressed((e: PointerEvent | TouchEvent) => void)-Callback fired on press
onReleased((e: PointerEvent | TouchEvent) => void)-Callback fired on release
windowWindowSource--

UseMousePressedReturn

NameTypeDescription
pressed$ReadonlyObservable<boolean>Current pressed state
sourceType$ReadonlyObservable<UseMousePressedSourceType>Event source type: “mouse” | “touch” | null

View on GitHub