Skip to content

Instantly share code, notes, and snippets.

@GalindoSVQ
Created January 7, 2024 07:04
Show Gist options
  • Select an option

  • Save GalindoSVQ/d323be5cbc432d426e511f7cd40d58b8 to your computer and use it in GitHub Desktop.

Select an option

Save GalindoSVQ/d323be5cbc432d426e511f7cd40d58b8 to your computer and use it in GitHub Desktop.
import * as React from 'react';
export function useMouse() {
const [state, setState] = React.useState({
x: 0,
y: 0,
elementX: 0,
elementY: 0,
elementPositionX: 0,
elementPositionY: 0,
});
const ref = React.useRef(null);
React.useLayoutEffect(() => {
const handleMouseMove = (event) => {
let newState: Record<string, number> = {
x: event.pageX,
y: event.pageY,
};
if (ref.current && ref.current.nodeType === Node.ELEMENT_NODE) {
const { left, top } = ref.current.getBoundingClientRect();
const elementPositionX = left + window.scrollX;
const elementPositionY = top + window.scrollY;
const elementX = event.pageX - elementPositionX;
const elementY = event.pageY - elementPositionY;
newState.elementX = elementX;
newState.elementY = elementY;
newState.elementPositionX = elementPositionX;
newState.elementPositionY = elementPositionY;
}
setState((s) => {
return {
...s,
...newState,
};
});
};
document.addEventListener('mousemove', handleMouseMove);
return () => {
document.removeEventListener('mousemove', handleMouseMove);
};
}, []);
return [state, ref];
}
@GalindoSVQ

Copy link
Copy Markdown
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment