요즘 사내 스터디에 참여하면서 풀스택 클론 코딩 강의를 듣고 있는데, 무한 스크롤 부분을 구현하면서 만나게 되었다.
Intersection Observer API는 타겟 요소와 상위 요소 또는 최상위 document의 viewport를 관찰하면서 포함되는지를 관찰하는 API로, 쉽게 말해 사용자의 화면에 보이는 요소인지 아닌지를 구별해주는 기능을 제공한다.
const observer = new IntersectionObserver(callback, options)
intersectionObserver 생성자는 callback 과 options 2개의 인수를 가짐
관찰할 대상(target)이 등록되거나 가시성(visibility)에 변화가 생기면 callback을 실행
intersection observer는 모든 영역을 사각형으로 간주함
사각형이 아니더라도 요소의 모든 부분을 감싸는 가장 작은 사각형으로 가정하고 가시성을 계산
무한 스크롤 부분을 구현하면서 사용한 부분은 isIntersecting 부분만 사용하였고, isIntersecting이 true가 되었을 때, 다음 페이지를 가져올 수 있도록 page + 1
을 해주었다.
const observer = new IntersectionObserver(
// entries 는 IntersectionObserverEntry 인스턴스의 배열
(entries) => {
//isIntersecting: 관찰 대상의 교차 상태(Boolean)
if (entries[0].isIntersecting === true) {
console.log("마지막 포스트에 왔습니다.");
setPage(page + 1);
observer.unobserve(element);
}
},
{ threshold: 1 }
);
옵션으로 사용한 threshold는 observer가 실행되기 위해 타겟의 가시성이 얼만큼 필요한지를 백분율로 표시한 것이다.
대상 요소의 관살을 시작함
대상 요소의 관찰을 중지함
관찰을 중지할 요소를 인수로 받음
참고
https://developer.mozilla.org/ko/docs/Web/API/Intersection_Observer_API
https://heropy.blog/2019/10/27/intersection-observer/