window.addEventListener('scroll')을 사용해야 했는데, 이는 스크롤 할 때마다 수천 번의 함수를 실행시켜 심각한 성능 저하(버벅임)를 유발했습니다. Intersection Observer는 브라우저 내부적으로 최적화되어 작동하므로 성능 저하 없이 부드러운 스크롤 감지가 가능합니다.
"화면에 보여? 안 보여? 지금은? 지금은? 지금은?"
스크롤을 1px 움직일 때마다 위치를 계산하며 끊임없이 질문합니다. 브라우저가 매우 피곤해집니다.
"나는 잘 테니까, 저 영역에 누군가 들어오면 알람 울려줘."
스마트 CCTV를 설치한 것처럼, 조건(예: 50% 보임)이 달성될 때만 조용히 알림(콜백 함수)을 보내줍니다.
| 옵션명 | 설명 |
|---|---|
| root | 관찰의 기준이 되는 부모 컨테이너 요소를 지정합니다. 기본값은 null이며, 이는 브라우저의 뷰포트(전체 화면)를 의미합니다. |
| rootMargin | 관찰 영역을 늘리거나 줄일 수 있는 마진 값입니다. (예: "100px 0px"로 설정하면 화면에 진입하기 100px 전부터 감지합니다. 무한 스크롤(Lazy Load) 선행 로딩에 유용합니다.) |
| threshold | 대상 요소가 얼마나 보여졌을 때 알림을 받을지 0.0 ~ 1.0 사이의 값으로 설정합니다. 0이면 1px라도 보이면 실행, 1.0이면 요소 전체가 완벽히 보여야 실행됩니다. (배열로 여러 값을 설정할 수도 있습니다.) |
<div class="observer-app">
<div class="header">
<h2>아래로 스크롤 해보세요</h2>
<p>요소가 화면에 나타나면 애니메이션이 실행됩니다.</p>
</div>
<div class="scroll-container">
<div class="box">박스 1 (항상 보임)</div>
<div class="box fade-target">박스 2 (Fade In)</div>
<div class="box fade-target">박스 3 (Fade In)</div>
<div class="box fade-target">박스 4 (Fade In)</div>
<div class="box fade-target">박스 5 (Fade In)</div>
</div>
<div class="log-panel" id="logPanel">대기 중...</div>
</div>