IntersectionObserver
IntersectionObserver는 브라우저의 뷰포트(Viewport)와 대상 요소(Element)의 교차 여부를 관찰하고 이를 감지하는 JavaScript API다. 이를 통해 뷰포트 안에 요소가 보이거나 보이지 않는지를 감지하거나, 뷰포트와 요소의 교차 정도를 관찰할 수 있다.
활용
Lazy Loading Images
: 뷰포트 내에 이미지가 진입하는 시점에 이미지를 로드하는 등의 성능 최적화를 할 수 있다.Infinite Scrolling
: 스크롤이 특정 요소와 교차하는 순간에 새로운 콘텐츠를 로드할 수 있다.Tracking Analytics
: 사용자가 특정 섹션에 스크롤하거나 요소와 교차할 때 애널리틱스 이벤트를 기록하는 등의 사용도 가능
구성 및 예시
<!DOCTYPE html>
<html>
<head>
<style>
.box {
width: 100px;
height: 100px;
background-color: lightblue;
margin: 20px;
}
</style>
</head>
<body>
<div class="box">Box 1</div>
<div class="box">Box 2</div>
<div class="box">Box 3</div>
<div class="box">Box 4</div>
<script>
const boxes = document.querySelectorAll('.box')
const options = {
root: null, // 뷰포트를 기준으로 교차 여부를 감지
rootMargin: '0px',
threshold: 0.5 // 대상 요소의 50% 이상이 교차하는 순간을 감지
}
function handleIntersection(entries, observer) {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.style.backgroundColor = 'orange'
} else {
entry.target.style.backgroundColor = 'lightblue'
}
})
}
const observer = new IntersectionObserver(handleIntersection, options)
boxes.forEach((box) => {
observer.observe(box)
})
</script>
</body>
</html>
위 예제에서는 각 div 요소(.box)가 뷰포트와 교차하는 순간에 배경색을 변경한다. IntersectionObserver를 사용하여 스크롤 이벤트를 감지하지 않고도 요소의 교차 여부를 효율적으로 관찰하게 된다.