ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๊ธฐ์กด 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
๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2025/06   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
๊ธ€ ๋ณด๊ด€ํ•จ