ํฐ์คํ ๋ฆฌ ๋ทฐ
๊ธฐ์กด Scroll ์ด๋ฒคํธ ๋ฌธ์
๊ธฐ์กด Scroll ์ด๋ฒคํธ๋ ๋จ์๊ฐ์ ๋ง์ ์์ด ํธ์ถ๋ ์ ์๊ณ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ ์ค๋ ๋(Main Thread)์ ์ํฅ์ ์ค๋ค.
๋ํ ํ ํ์ด์ง ๋ด์ ์ฌ๋ฌ scroll ์ด๋ฒคํธ(๋ฌดํ ์คํฌ๋กค, ๊ด๊ณ ๋ฐฐ๋, ์ ๋๋ฉ์ด์ ๋ฑ)๊ฐ ๋ฑ๋ก๋์ด ์์ ๊ฒฝ์ฐ, ๊ฐ ์๋ฆฌ๋จผํธ๋ง๋ค ์ด๋ฒคํธ๊ฐ๋ฑ๋ก๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋๋ง๋ค ์ด๋ฅผ ๊ฐ์งํ๋ ์ด๋ฒคํธ๊ฐ ๋์ ์์ด ํธ์ถ์ด ๋๋ค.(์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ด์ ํฌ์คํ ์์ ๋๋ฐ์ด์ฑ_Debouncing์ ํตํด ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ์๋ค)
๊ทธ๋ฆฌ๊ณ ํน์ ์ง์ ์ ๊ด์ฐฐํ๊ธฐ ์ํด์๋ getBoundingClientRect() ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์ด ํจ์๋ ๋ฆฌํ๋ก์ฐ(reflow) ํ์์๋ฐ์์ํจ๋ค๋ ๋จ์ ์ด ์๋ค.
- ๋ฆฌํ๋ก์ฐ(reflow): ๋ธ๋ผ์ฐ์ ๊ฐ ์น ํ์ด์ง์ ์ผ๋ถ ๋๋ ์ ์ฒด๋ฅผ ๋ค์ ๊ทธ๋ ค์ผ ํ๋ ๊ฒฝ์ฐ ๋ฐ์
Intersection Observer API
Intersection Oberver API(๊ต์ฐจ ๊ด์ฐฐ API)๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ ์ค๋ ๋์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด์ฐฐํ ์ ์๋ค.
๋ํ IntersectionObserveEntry์ ์์ฑ์ ํ์ฉํ๋ฉด getBoundingRect()๋ฅผ ํธ์ถํ ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฆฌํ๋ก์ฐ ํ์์ ๋ฐฉ์งํ ์ ์๋ค.
const fetchMoreObserver = new IntersectionObserver(entries => {
entries.forEach(entry => {
if(!entry.isIntersecting) {
return;
}
fetchMore();
})
});
fetchMoreObserver.observe(fetchMoreTrigger);
์ด์ ํฌ์คํ ์ ๋ฌดํ ์คํฌ๋กค ์์ ์ฝ๋๋ฅผ Intersection Observer API๋ฅผ ์ด์ฉํ์ฌ ๋ฆฌํฉํ ๋งํ์๋ค.
์คํฌ๋กค์ ๋ ๋ถ๋ถ์ ๊ฐ์๋ฅผ ํ ์๋ฆฌ๋จผํธ(fetchMoreTrigger)๋ฅผ ๋๊ณ ํด๋น ์๋ฆฌ๋จผํธ๊ฐ ๋ ธ์ถ์ด ๋ ๋๋ง๋ค ์ฝํ ์ธ ๋ฅผ ์ถ๊ฐ๋ก ๋ถ๋ฌ์ค๋๋ก ์์ฑํ์๋ค.
const fetchMoreObserver = new IntersectionObserver(([{isIntersecting}]) => {
if(isIntersecting) fetchMore();
});
fetchMoreObserver.observe(fetchMoreTrigger);
์์ ๊ฐ์ด isIntersecting ํ๋กํผํฐ๋ฅผ ๋์คํธ๋ญ์ณ๋ง ํ ๋นํ๋ฉด forEach()๋ฌธ์ ์๋ตํ ์ ์๋ค.
์ด๋ ์ด์ค์ผ๋ก ๋์คํธ๋ญ์ณ๋ง ํ ๋น์ ํ๊ฒ ๋๋๋ฐ, ์ด๋ ๊ฐ์ํด์ผ ๋ ์๋ฆฌ๋จผํธ๋ค์ด ๋ฐฐ์ด์ ์ ์ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๋น ์์ ์์๋ ๊ฐ์ํด์ผ ๋ ๋์ ์๋ฆฌ๋จผํธ๋ ํ๋์ด๊ณ ๊ทธ ์ค ํ์ํ ํ๋กํผํฐ๋ isIntersecting์ด๊ธฐ ๋๋ฌธ์ ํด๋น ์ฌํญ์ ์ ์ฉํ ์ ์๋ค.
'JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
window.matchMedia ๋ฉ์๋ (0) | 2021.07.02 |
---|---|
Dark-mode (0) | 2021.07.02 |
Debounce ํจ์๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌ ์ต์ ํ (0) | 2021.07.01 |
Infinite Scroll (0) | 2021.07.01 |
ScrollSpy_offsetTop, scrollTop, clientHeight (0) | 2021.06.03 |