Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

305
Views
Detectar intersección entre dos componentes en React cuando un componente tiene posición: fijo

Estoy tratando de implementar un intersectionObserver para ver si un <Header/> isIntersecting , pero específicamente solo con otro <Component/>

MI INTENTO

 import React, { useRef, useEffect } from "react"; import "./styles.css"; import Header from "./components/Header"; import SomeComponent from "./components/SomeComponent"; export default function App() { const header = useRef(null); const component = useRef(null); const handleOverlap = (entries, observer) => { entries.forEach((entry) => { console.log(entry.isIntersecting); }); }; useEffect(() => { const options = { root: component.current, rootMargin: "10px", threshold: 0.1 }; const observer = new IntersectionObserver(handleOverlap, options); observer.observe(header.current); }, []); return ( <div className="App"> <Header ref={header} /> <div style={{ backgroundColor: "pink", height: "100vh" }}></div> <SomeComponent ref={component} /> </div> ); }

Mi resultado deseado es recibir un valor true si en el punto en que el usuario se desplaza y el componente del encabezado se cruza con el componente de destino. Establecí la root en el objeto de options en una ref del componente de destino. Definitivamente me falta algo de lógica clave en alguna parte. Cualquier ayuda sería genial.

SALVADERA

https://codesandbox.io/s/friendly-shirley-u603gt?file=/src/App.js

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Compartiendo mi solución en caso de que alguien alguna vez esté en una situación similar.

Mi solución fue buscar un evento de scroll en lugar de usar la intersectionObserver Creo que porque mi <Header/> es un elemento de posición fixed , se saca del flujo del documento y el observador no puede detectar una intersección válida entre los dos componentes .

En cambio, mi función checkIfHeaderIsOverlapping llama a .getBoundingClientRect() en la ref de cada componente y aplica una lógica simple para detectar una superposición o intersección.

SOLUCIÓN

 import React, { useRef, useEffect, useState } from "react"; import "./styles.css"; import Header from "./components/Header"; import SomeComponent from "./components/SomeComponent"; export default function App() { const [isOverlapping, setIsOverlapping] = useState(false); console.log("is it true? =>", isOverlapping); const header = useRef(null); const component = useRef(null); function checkIfHeaderIsOverlapping() { if (header.current && component.current) { const a = header.current.getBoundingClientRect(); const b = component.current.getBoundingClientRect(); if (a.top <= b.top + b.height && a.top + a.height > b.top) { setIsOverlapping(true); } else { setIsOverlapping(false); } } } useEffect(() => { function watchScroll() { window.addEventListener("scroll", checkIfHeaderIsOverlapping); } watchScroll(); return () => { window.removeEventListener("scroll", checkIfHeaderIsOverlapping); }; }); return ( <div className="App"> <Header ref={header} /> <div style={{ backgroundColor: "pink", height: "100vh" }}></div> <SomeComponent ref={component} /> <div style={{ backgroundColor: "green", height: "100vh" }}></div> </div> ); }

SALVADERA

https://codesandbox.io/s/friendly-shirley-u603gt?file=/src/App.js

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!