๐ 2022. 10. 25. ํ์์ผ
๐ Tutorial : Learn Intersection Observer In 15 Minutes
Intersection Observer API
const observer = new IntersectionObserver(์ฝ๋ฐฑํจ์, ์ต์
);
๊ด์ฐฐ์ค์ธ ์์๊ฐ ๋ทฐํฌํธ์ ๊ต์ฐจ
ํ๋์ง(ํ๋ฉด ๋ด์ ์๋์ง) ๊ฐ์งํ๋ API
์ฝ๋ฐฑํจ์
: ๊ด์ฐฐ์ด ์์๋๋ฉด ์คํํ ํจ์๋ฅผ ์ง์ ํ๋ค.
entries
๋ ๋ฐฐ์ด ํํ๋ก ๊ด์ฐฐ์ค์ธ ์์๋ฅผ ๋ด๋๋ค.
๊ด์ฐฐ์ค์ธ ์์๋ฅผ ์ธ์๋ก ๋ฐ์์, ๊ทธ ์์๋ค๋ก ๋ฌด์์ ํ ์ง ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ ์์ ์์๋ ๊ด์ฐฐ์ค์ธ ์์๊ฐ ๊ต์ฐจ์ค์ผ๋(isIntersecting
, ์์๊ฐ ๋ทฐํฌํธ ๋ด์ ์์นํ ๋)
show ๋ผ๋ ํด๋์ค๋ฅผ ๋ถ์ฌ์ฃผ๊ณ , ๊ต์ฐจ์ค์ด ์๋ ๋์๋(๋ทฐํฌํธ๋ฅผ ๋ฒ์ด๋ ๋) ํด๋์ค๋ฅผ ์ ๊ฑฐํ๊ณ ์๋ค.
์ต์
: ๊ฐ์ฒด ํ์์ผ๋ก ์ต์
์ ์ง์ ํ๋ค.
threshold
๋ ํ๊ณ์ ์ด๋ผ๋ ๋ป์ผ๋ก, isIntersecting ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๊ธฐ์ค์ด ๋๋ค.
threshold๊ฐ 1์ด๋ฉด, ์์ ์ ์ฒด๊ฐ ๋ทฐํฌํธ ๋ด์ ์์นํ ๋ ๊ต์ฐจ๋์๋ค๊ณ ๊ฐ์ฃผํ๊ณ ,
threshold๊ฐ 0.5์ด๋ฉด, ์์ ์ ๋ฐ์ด ๋ณด์ผ ๋ ๊ต์ฐจ๋์๋ค๊ณ ๊ฐ์ฃผํ๋ค.
root
๋ ํ๋ฉด์ ๊ธฐ์ค์ ๋ฌด์์ผ๋ก ํ ์ง ์ ํ๋ ์ต์
์ด๋ค.
๋ฐ๋ก ์ง์ ํ์ง ์์ผ๋ฉด viewport ๊ธฐ์ค์ผ๋ก ํ๋ฉด์ด ์ค์ ๋๋ค.
rootMargin
์ ํ๋ฉด ์์ญ์ margin์ผ๋ก ์กฐ์ ํ ์ ์๋ ์ต์
์ผ๋ก,
rootMargin์ด -100px์ด๋ผ๋ฉด ํ๋ฉด์ ์์๋ 100px๋งํผ ์ถ์ํ๋ค๋ ์๋ฏธ์ด๊ณ ,
rootMargin์ด 100px์ด๋ผ๋ฉด ํ๋ฉด์ ์์๋ 100px๋งํผ ํ๋ํ๋ค๋ ์๋ฏธ์ด๋ค.
observe
๋ฉ์๋๋ฅผ ํตํด ๋์์ ๊ด์ฐฐํ๋ค.
๊ด์ฐฐ์ ์ค๋จํ ๋๋ unobserver
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
</br>
const cards = document.querySelectorAll(".card");
const cardContainer = document.querySelector(".card-container");
function loadNewCards() {
for (let i = 0; i < 10; i++) {
const card = document.createElement("div");
card.textContent = "์ถ๊ฐ๋ ์นด๋";
card.classList.add("card");
observer.observe(card);
cardContainer.append(card);
}
}
const lastCardObserver = new IntersectionObserver((entries) => {
const lastCard = entries[0];
if (!lastCard.isIntersecting) return;
loadNewCards();
lastCardObserver.unobserve(lastCard.target);
lastCardObserver.observe(document.querySelector(".card:last-child"));
});
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
entry.target.classList.toggle("show", entry.isIntersecting);
});
},
{
rootMargin: "-100px",
}
);
lastCardObserver.observe(document.querySelector(".card:last-child"));
cards.forEach((card) => {
observer.observe(card);
});
.card {
opacity: 0;
transform: translateX(100px);
transition: 150ms;
}
.card.show {
transform: translateX(0);
opacity: 1;
}