Asked 2 months ago by LunarNavigator181
React Three Fiber: Prevent Overlapping 3D Elements from Triggering Duplicate onClick Events
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
Asked 2 months ago by LunarNavigator181
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
I'm using React Three Fiber and Drei to create a rotating 3D carousel of images. Each image acts as a card with an onClick event that triggers a function passed via props. I encounter an issue where clicking overlapping images (where one is behind the other) triggers the onClick event on both cards, even though the back one isn't visible.
Here's a simplified snippet from my code:
TYPESCRIPTfunction Carousel({ cards, handleClick }: CarouselProps) { const count = cards.length; const radius = (count * 2.5) / (Math.PI * 2); return cards.map((card, i) => ( <Card key={i} card={card} onClick={() => handleClick(i)} position={[ Math.sin((i / count) * Math.PI * 2) * radius, 0, Math.cos((i / count) * Math.PI * 2) * radius, ]} rotation={[0, (i / count) * Math.PI * 2, 0]} /> )); }
A live demo is available here, and the complete code is hosted on GitHub: 3D Carousel code along with the Card component.
When two images intersect, clicking the front one inadvertently triggers the onClick handler for the image behind it as well. I tried throttling and debouncing, but the second call still occurs after the delay.
I need a solution that prevents the click event from “falling through” overlapping 3D elements so that only the top visible card handles the click event. Any advice on a native JavaScript method or a React Three Fiber specific solution would be appreciated.
Comments 0
•Answers 2
•Views 47
Answer by TychoAI Agent • 2 months ago
Below is one common solution in React Three Fiber to prevent click events from “falling through” overlapping objects. Since both the front and the back objects are receiving the click, you can call stopPropagation on the event so that only the top object handles the click. For example:
TYPESCRIPT<Card key={i} card={card} onClick={(event) => { event.stopPropagation(); handleClick(i); }} position={[ Math.sin((i / count) * Math.PI * 2) * radius, 0, Math.cos((i / count) * Math.PI * 2) * radius, ]} rotation={[0, (i / count) * Math.PI * 2, 0]} />
By calling event.stopPropagation() inside your onClick handler, you prevent the event from bubbling further, avoiding the case where two overlapping images are both triggering clicks. This native JavaScript solution works well with React Three Fiber’s event system.
Tycho is an AI agent, that grounds responses in various sources like documentation, code bases, live discussions, and relevant posts. Want to chat privately with Tycho?
No comments yet.
Answer by StarEngineer455 • 3 months ago
Turns out throttle()
from lodash was the correct way to go. To solve this problem I ensured that the options for the trailing edge were set to false:
TYPESCRIPTconst handleClick = _.throttle( (index: number) => { if (active === undefined) { setActive(index); return; } setActive(undefined); }, 200, { trailing: false }, );
No comments yet.
No comments yet.