[WebAPI] 리액트에서 Intersection Observer API 사용하기

Ujeon 🍵
6 min readNov 5, 2021

--

Photo by José Ramos on Unsplash

Intersection Observer API

intersectionObserver는 상위 요소 혹은 최상위 document의 viewport와 대상 요소와의 교차점에서 변경 사항을 비동기적으로 관찰하는 방법을 제공하는 API 입니다.

탄생 배경

IntersectionObserver가 생기게 된 대표적인 이유는 다음과 같습니다 :

  • 웹페이지가 스크롤 될 때 마다 이미지와 같은 컨텐츠의 지연 로딩
  • 사용자가 스크롤 할 때 마다 더 많은 정보를 로드 하기위한 ‘무한 스크롤’ 구현을 위해서
  • 광고 수익 계산을 위한 광고 가시성 보고
  • 사용자에게 결과가 표시되는지 여부에 따라 작업 혹은 애니메이션을 실행할지 여부를 결정하기 위해서

위 이유들을 살펴보면, 사용자가 현재 어떤 화면을 어떻게 보고있는지 고민하고 있다는 생각이 듭니다. 🤔

Intersection Observer API에 대해서 더 알고 싶으시다면 MDN 문서에 자세히 나와있습니다.

리액트에서 Intersection Observer API 사용하기

그럼 리액트에서 Intersection Observer API를 사용하는 방법에 대해서 살펴보겠습니다.

아래 움짤은 사용자가 보고 있는 색상이 변경될 때 마다 해당하는 Hex 값으로 변경해주고 있습니다.

어떤 방법으로 사용자가 현재 보고있는 색상 값을 알 수 있을까요?!

저는 onscroll 이벤트를 활용하여 사용자가 스크롤 하고 있는 위치와 각 색상의 상대적인 위치 값을 비교하여 특정 위치에 도달하면 Hex 값을 알맞게 변경해주는 방법이 가장 먼저 떠오릅니다. 😃

하지만.. 사용자가 브라우저의 크기를 조정하게 되면 어떻게 될까요?

브라우저 크기가 조정되기 전의 상대적 위치 값을 가지고 비교하게 되어 원하는 동작을 구현할 수 없게 됩니다. (물론 이런 경우 resize 이벤트를 활용할 수 있습니다!)

Intersection Observer API를 활용하면 이러한 문제를 조금 더 쉽게 해결할 수 있습니다. 👍

1. Intersection Observer API 정의하기

먼저 IntersectionObserver 인스턴스를 생성합니다. IntersectionObserver 의 첫번째 파라미터는 콜백 함수, 두번째 파라미터는 인스턴스를 초기화 할 때의 옵션입니다.

두번째 파라미터를 먼저 살펴보면, root 는 해당 요소의 가시성을 확인하기 위한 뷰포트가 되는 요소입니다. 대상 요소 보다 상위 요소이어야 하며, null 인 경우는 브라우저가 기본 뷰포트입니다.

rootMargin 은 교차점을 계산하기 전에 root 요소의 경계 값을 줄이거나 늘이는데 사용됩니다.

마지막으로 threshold 는 설정된 값(비율)만큼 콜백 함수를 호출하는 역할을 합니다. 0 ~ 1 사이의 값을 가집니다.

위 코드에서는 threshold 값이 0.5로 설정되어 있기 때문에 사용자가 해당 요소를 50% 보게되면 콜백함수가 실행되게 됩니다.

2. IntersectionObserver가 요소를 관찰하도록 하기

IntersectionObserver 인스턴스를 생성했다면 인스턴스가 원하는 요소들을 관찰하도록 해야합니다.

저는 빨주노초파남보 7개의 요소가 있으므로 useRef 를 활용하여 IntersectionObserver 가 각 요소를 관찰하도록 설정해주었습니다. ( useRef 사용법은 생략하겠습니다.)

컴포넌트의 생명주기가 끝날 때 관찰을 그만하도록 하기위해 unobserver를 사용합니다.

이제 관찰할 준비가 끝났습니다!

3. 동작확인하기

이제 잘 동작하는지 확인하면됩니다. 😚

먼저 화면을 스크롤 할 때 마다 사용자가 특정 색상을 절반 정도 본 경우 콜백함수가 잘 호출되는지 살펴보겠습니다.

사용자가 특정 색상 요소를 절반 정도 보았을 때 로그가 콘솔에 출력되는 것을 확인할 수 있습니다.

그럼 브라우저 크기가 조정되었을 때도 로그가 출력될까요? 🤔

페이지를 스크롤 할 때와 마찬가지로 콜백이 호출됩니다. 빨간색 요소가 절반 이상 보여질 때 한 번, 다시 주황색 요소가 절반 이상 보여질 때 한 번 총 두번이 호출되었군요!

마지막으로 로그를 조금 더 살펴보고 마무리하겠습니다. 🙌

4. isIntersecting

로그를 살펴보면 두개의 요소( IntersectionObserverEntry)를 가진 배열이 있습니다. 이전 요소의 정보와 현재 요소의 정보입니다.

두 요소 모두 isIntersecting 값이 존재합니다. 위 사진에서는 각각 falsetrue 입니다. 이 값을 활용하여 현재 사용자가 보고 있는 색상을 알 수 있죠.

isIntersecting 값이 true이면 현재 사용자가 보고 있는 요소입니다.

지금까지 Intersection Observer API에 대해서 살펴보았습니다. Intersection Observer API를 활용하여 사용자가 현재 보고있는 요소에 따라 다양한 응용 작업을 할 수 있을 것 같습니다! 😉

위 예시코드는 이곳에서 확인하실 수 있습니다.

감사합니다.

--

--

Ujeon 🍵

Hi there, this is Ujeon. I want to be a developer who passes on value through development :)