Skip to content

Instantly share code, notes, and snippets.

@reecelucas
Last active April 18, 2019 12:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reecelucas/453d8755fe7176708c5b7684e73a7236 to your computer and use it in GitHub Desktop.
Save reecelucas/453d8755fe7176708c5b7684e73a7236 to your computer and use it in GitHub Desktop.
React hook to detect proximity to an element. https://codesandbox.io/embed/0qwjq74w0p.
import { useEffect, useState } from "react";
const useProximity = (elemRef, perimeter = 100) => {
const [withinPerimeter, setWithinPerimeter] = useState(false);
useEffect(() => {
if (!elemRef || !elemRef.current) return;
let ticking = false;
const { current } = elemRef;
const { top, right, bottom, left } = current.getBoundingClientRect();
const perimeterBounds = {
top: top - perimeter,
right: right + perimeter,
bottom: bottom + perimeter,
left: left - perimeter
};
const update = ({ clientX, clientY }) => {
if (
clientX > perimeterBounds.left &&
clientX < perimeterBounds.right &&
clientY > perimeterBounds.top &&
clientY < perimeterBounds.bottom
) {
setWithinPerimeter(true);
} else {
setWithinPerimeter(false);
}
ticking = false;
};
const onMousemove = event => {
if (!ticking) {
window.requestAnimationFrame(() => {
update(event);
});
ticking = true;
}
};
document.addEventListener("mousemove", onMousemove);
return () => document.removeEventListener("mousemove", onMousemove);
}, [elemRef, perimeter]);
return withinPerimeter;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment