무ν μ€ν¬λ‘€(Infinite Scroll)μ΄λ? μ¬μ©μκ° νμ΄μ§ νλ¨μ λλ¬νμ λ, μ½ν μΈ κ° κ³μ λ‘λλλ μ¬μ©μ κ²½ν(UX) λ°©μμ΄λ€. ν νμ΄μ§ μλλ‘ μ€ν¬λ‘€ νλ©΄ λμμ΄ μλ‘μ΄ νλ©΄μ 보μ¬μ£Όκ² λκ³ μ΄λ‘ μΈν΄ λ§μ μμ μ½ν μΈ λ₯Ό μ€ν¬λ‘€ ν΄μ λ³Ό μ μλ€.
νμ΄μ§λ€μ΄μ μ΄ μλ 무ν μ€ν¬λ‘€λ‘ ꡬννλ €λ μ΄μ β
μν λͺ©λ‘μμ μνμ 보μ¬μ£Όκ³ μ ν λ νμ΄μ§λ€μ΄μ , 무ν μ€ν¬λ‘€ μ€ λ¬΄μμ΄ μ¬μ©μ κ²½νμ λμ± μ’κ² ν μ μμμ§ κ³ λ―Όν λμ λͺ¨λ°μΌ νκ²½μ κ³ λ €ν΄μ 무ν μ€ν¬λ‘€μ μ¬μ©νκΈ°λ‘ νλ€.(μ°¨νμ νλ‘μ νΈλ₯Ό λ°μνμΌλ‘ 리ν©ν°λ§ ν κ³νππ»)
λν, λ€μ μνμ 보기 μν μ¬μ©μμ ν΄λ¦μ μ΅μννκ³ λ μ½κ² λ€μν μνμ λ³Ό μ μμ κ²μ΄λΌκ³ νλ¨νλ€.
ꡬννλ κ³Όμ
무ν μ€ν¬λ‘€μ ꡬννλ λ°©λ²μ μ€ν¬λ‘€μ ν λλ§λ€ μ΄λ²€νΈλ₯Ό λ°μμν€λ λ°©λ²(addEventListenerκ° μ€λ³΅ν΄μ μμ΄κ³ 볡μ‘ν λ‘μ§μ΄ μμ¬ μμΌλ©΄ μ±λ₯ μ΄μκ° λ°μ) λ± λ€μνλ€. κ·Έμ€μμ λλ Intersection Observer APIμ IntersectionObserver μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄μ ꡬννμλ€.
π§ IntersectionObserver μΈν°νμ΄μ€λ?
κΈ°λ³Έμ μΌλ‘ λΈλΌμ°μ λ·°ν¬νΈ(Viewport)μ μ€μ ν μμ(Element)μ κ΅μ°¨μ μ κ΄μ°°νλ©°, μμκ° λ·°ν¬νΈμ ν¬ν¨λλμ§, ν¬ν¨λμ§ μλμ§, λ μ½κ²λ μ¬μ©μ νλ©΄μ μ§κΈ 보μ΄λ μμμΈμ§ μλμ§λ₯Ό ꡬλ³νλ κΈ°λ₯μ μ 곡νλ€.
μ΄ κΈ°λ₯μ λΉλκΈ°μ μΌλ‘ μ€νλκΈ° λλ¬Έμ, scroll κ°μ μ΄λ²€νΈ κΈ°λ°μ μμ κ΄μ°°μμ λ°μνλ λ λλ§ μ±λ₯μ΄λ μ΄λ²€νΈ μ°μ νΈμΆ κ°μ λ¬Έμ μμ΄ μ¬μ©ν μ μλ€.
1) IntersectionObserver μΈμ€ν΄μ€ μμ±
- new IntersectionObserver()λ₯Ό ν΅ν΄ μμ±ν μΈμ€ν΄μ€(observer)λ‘ κ΄μ°°μλ₯Ό μ΄κΈ°ννκ³ κ΄μ°°ν λμ(element)μ μ§μ νλ€.
- μμ±μλ 2κ°μ μΈμ(callback, options)λ₯Ό κ°μ§λ€.
const observer = new IntersectionObserver(callback, options); // κ΄μ°°μ μ΄κΈ°ν
observer.observe(element); // κ΄μ°°ν λμ(μμ) λ±λ‘
// observer.unobserve(element); // νΉμ λμ(μμ)μ λν κ΄μ°° μ€λ¨
2) callback ν¨μ λ§λ€κΈ°
- κ΄μ°°ν λμ(target)μ΄ λ±λ‘λκ±°λ κ°μμ±(보μ΄λμ§, 보μ΄μ§ μλμ§)μ λ³νκ° μκΈ°λ©΄ κ΄μ°°μλ μ½λ°±(callback)μ μ€ννλ€.
- μ½λ°±μ 2κ°μ μΈμ(entries, observer)λ₯Ό κ°μ§λ€.
const callback = (entries, observer) => {};
entries
- IntersectionObserverEntry μΈμ€ν΄μ€μ λ°°μ΄μ΄λ€.
- IntersectionObserverEntryλ μ½κΈ° μ μ©μ μμ±λ€μ ν¬ν¨νλ€. μ¬λ¬ μμ±λ€μ΄ μ‘΄μ¬νμ§λ§ μ§μ μ¬μ©ν isIntersectingμ κ΄μ°° λμμ κ΅μ°¨ μν(Boolean)λ₯Ό μλ €μ£Όλ μμ±μ΄λ€. λλ¨Έμ§ μμ±λ€μ λ€μ λ§ν¬λ₯Ό μ°Έκ³ ν΄λ³΄μβοΈ
observer
μ½λ°±μ΄ μ€νλλ ν΄λΉ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλ€.
const callback = (entries, observer) => {
console.log(observer);
};
3) options κ°μ²΄ λ§λ€κΈ°
const options = {
root: null,
rootMargin: '0px 0px 0px 0px',
threshold: 0,
};
root
- νμΌμ κ°μμ±μ κ²μ¬νκΈ° μν΄ λ·°ν¬νΈ λμ μ¬μ©ν μμ κ°μ²΄(λ£¨νΈ μμ)λ₯Ό μ§μ νλ€.
- κΈ°λ³Έκ°μ null(λ·°ν¬νΈ) μ΄λ€.
rootMargin
- λ°κΉ₯ μ¬λ°±(margin)μ μ΄μ©ν΄ root λ²μλ₯Ό νμ₯νκ±°λ μΆμν μ μλ€.
- cssμ marginκ³Ό κ°μ΄ 4λ¨κ³λ‘ μ¬λ°±μ μ€μ ν μ μμΌλ©°, px λλ %λ‘ λνλΌ μ μλ€.
- κΈ°λ³Έκ°μ '0px 0px 0px 0px'μ΄λ©° λ¨μλ₯Ό κΌ μ λ ₯ν΄μΌ νλ€.
threshold
- μ΅μ λ²κ° μ€νλκΈ° μν΄ νμΌμ κ°μμ±μ΄ μΌλ§λ νμνμ§ λ°±λΆμ¨λ‘ νμνλ€.
- κΈ°λ³Έκ°μ Array νμ
μ [0]μ΄μ§λ§ Number νμ
μ λ¨μΌ κ°μΌλ‘λ μμ±ν μ μλ€.
- 0: νμΌμ κ°μ₯μ리 ν½μ μ΄ root λ²μλ₯Ό κ΅μ°¨νλ μκ°(νμΌμ κ°μμ±μ΄ 0%μΌ λ) μ΅μ λ²κ° μ€νλλ€.
- 0.3: νμΌμ κ°μμ±μ΄ 30%μΌ λ μ΅μ λ²κ° μ€νλλ€.
- [0, 0.3, 1]: νμΌμ κ°μμ±μ΄ 0%, 30%, 100%μΌ λ λͺ¨λ μ΅μ λ²κ° μ€νλλ€.
π§π»π» ꡬνν μ 체 μ½λ
/*
<div>
<ul></ul>
<div id="listEnd"></div>
</div>
*/
const listEnd = document.querySelector('#listEnd'); // κ΄μ°°ν λμ(μμ)
const options = {
root: null, // λ·°ν¬νΈλ₯Ό κΈ°μ€μΌλ‘ νμΌμ κ°μμ± κ²μ¬
rootMargin: '0px 0px 0px 0px', // νμ₯ λλ μΆμ X
threshold: 0, // νμΌμ κ°μμ± 0%μΌ λ μ΅μ λ² μ€ν
};
let page = 0;
const onIntersect = (entries, observer) => {
entries.forEach(async (entry) => {
if (entry.isIntersecting) {
console.log('무ν μ€ν¬λ‘€ μ€ν');
page++;
console.log('page: ' + page);
const products = await getData( // μνμ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ ν¨μ
page,
urlCategoryId,
urlKeywordId,
urlSortId
);
if (products.length < 1) {
if (page === 1) productList.innerHTML = noSearchResultPage;
observer.unobserve(listEnd); // νΉμ λμ(μμ)μ λν κ΄μ°° μ€λ¨
return;
}
productList.insertAdjacentHTML(
'beforeend',
products.map(createTicket).join('')
);
}
});
};
const observer = new IntersectionObserver(onIntersect, options); // κ΄μ°°μ μ΄κΈ°ν
observer.observe(listEnd); // κ΄μ°°ν λμ(μμ) λ±λ‘
π μ°Έκ³ ν μ¬μ΄νΈ
'Frontend > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Axios] Axios μΈν°μ ν° μ μ©νκΈ° (0) | 2023.05.10 |
---|---|
[JavaScript] μ κ· ννμ μμ λμ μΌλ‘ λ³μλ₯Ό λ£λ λ°©λ² (1) | 2023.04.23 |
[JavaScript] μ°κ²° 리μ€νΈλ‘ ν(Queue) ꡬννλ λ°©λ² (0) | 2023.03.21 |
[JavaScript] νλ²μ νλ λ°°μ΄ μμ± & μ΄κΈ°ν (0) | 2022.09.28 |
[JavaScript] μ€μ½ν(Scope)λ 무μμΈκ°? (0) | 2022.09.05 |