๐Ÿ‘ป [WHYGRAM] | [JS] | ๐ŸŽฎ๋ฌดํ•œ์Šคํฌ๋กค ๊ธฐ๋Šฅ , js๋กœ ๋ฌดํ•œ์Šคํฌ๋กค ํ•˜๋Š” ๋ฒ•

0

๐Ÿ‘ป WHYGRAMย 

๋ชฉ๋ก ๋ณด๊ธฐ
14/16
post-thumbnail

๐ŸŸฆ INTERSECTION OBSERVER

  1. ๐Ÿ”น Intersection Observer : ์š”์†Œ์˜ ๊ฐ€์‹œ์„ฑ ๊ด€์ฐฐ

  • ๋ธŒ๋ผ์šฐ์ € viewport์™€ ์„ค์ •ํ•œ ์š”์†Œ(Element)์˜ ๊ต์ฐจ์ ์„ ๊ด€์ฐฐํ•˜๋ฉฐ,
    ์š”์†Œ๊ฐ€ ๋ทฐํฌํŠธ์— ํฌํ•จ๋˜๋Š”์ง€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”์ง€,
    (๋” ์‰ฝ๊ฒŒ๋Š”) ์‚ฌ์šฉ์ž ํ™”๋ฉด์— ์ง€๊ธˆ ๋ณด์ด๋Š” ์š”์†Œ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ด ๊ธฐ๋Šฅ์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
  • new IntersectionObserver()๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค(io)๋กœ
    ๊ด€์ฐฐ์ž(Observer)๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๊ด€์ฐฐํ•  ๋Œ€์ƒ(Element)์„ ์ง€์ •ํ•œ๋‹ค.
  • ์ƒ์„ฑ์ž๋Š” 2๊ฐœ์˜ ์ธ์ˆ˜(callback, options)๋ฅผ ๊ฐ€์ง„๋‹ค.
const io = new IntersectionObserver(callback, options);
io.observe(element);
  1. ๐Ÿ”น callback

  • ์ฝœ๋ฐฑํ•จ์ˆ˜ : ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ์ง€๋Š” ํ•จ์ˆ˜
  • ๊ด€์ฐฐํ•  ๋Œ€์ƒ(target)์ด ๋“ฑ๋ก๋˜๊ฑฐ๋‚˜ ๊ฐ€์‹œ์„ฑ(visibility, ๋ณด์ด๋Š”์ง€ ์•ˆ๋ณด์ด๋Š”์ง€)์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด
    ๊ด€์ฐฐ์ž๋Š” ์ฝœ๋ฐฑ(callback)์„ ์‹คํ–‰ํ•œ๋‹ค.
  • ์ฝœ๋ฐฑ์€ 2๊ฐœ์˜ ์ธ์ˆ˜(entries, observer)๋ฅผ ๊ฐ€์ง„๋‹ค.
const io = new IntersectionObserver( (entries, observer) => {} , options );
io.observe(element); 
  1. ๐Ÿ”น entries

  • entries๋Š” IntersectionObserverEntry ์ธ์Šคํ„ด์Šค์˜ ๋ฐฐ์—ด์ด๋‹ค.
  • IntersectionObserverEntry ๋Š” ์ฝ๊ธฐ์ „์šฉ(Read only)์˜ ๋‹ค์Œ ์†์„ฑ๋“ค์„ ํฌํ•จํ•œ๋‹ค.
    • boundingClientRect : ๊ด€์ฐฐ๋Œ€์ƒ์˜ ์‚ฌ๊ฐํ˜• ์ •๋ณด
    • 1
    • intersectionRect : ๊ด€์ฐฐ๋Œ€์ƒ์˜ ๊ต์ฐจํ•œ ์˜์—ญ ์ •๋ณด
    • 2
    • intersectionRatio : ๊ด€์ฐฐ๋Œ€์ƒ์˜ ๊ต์ฐจํ•œ ์˜์—ญ ๋ฐฑ๋ถ„์œจ
      (intersectionRect์˜์—ญ์—์„œ boundingClientRect์˜์—ญ๊นŒ์ง€ ๋น„์œจ, Number)
    • isInterecting : ๊ด€์ฐฐ๋Œ€์ƒ์˜ ๊ต์ฐจ ์ƒํƒœ(Boolean)
    • 3
    • rootBounds : ์ง€์ •ํ•œ ๋ฃจํŠธ ์š”์†Œ์˜ ์‚ฌ๊ฐํ˜• ์ •๋ณด
    • target : ๊ด€์ฐฐ ๋Œ€์ƒ ์š”์†Œ (Element)
    • time : ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ ์‹œ๊ฐ„ ์ •๋ณด
  1. ๐Ÿ”น observer

  • ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
const io = new IntersectionObserver((entries, observer) => {
  console.log(observer); ๐Ÿ‘‰ ๐ŸŸข๐Ÿ‘†IntersectionObserver์˜ ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.๐ŸŸข
}, options);
io.observe(element);
  • intersection-observer-observer
  1. ๐Ÿ”น options

  • root

    • target์˜ ๊ฐ€์‹œ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ทฐํฌํŠธ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์š”์†Œ ๊ฐ์ฒด(๋ฃจํŠธ์š”์†Œ)๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    • target์˜ ์กฐ์ƒ์š”์†Œ์ด์–ด์•ผ ํ•˜๋ฉฐ ์ง€์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ null์ผ ๊ฒฝ์šฐ
      ๋ธŒ๋ผ์šฐ์ €์˜ ๋ทฐํฌํŠธ๊ฐ€ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋œ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’์€ null
const io = new IntersectionObserver(callback, {
  root : document.getElementId('my-viewport'); 
})
  • threshold

    • ์˜ต์ €๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด target์˜ ๊ฐ€์‹œ์„ฑ์ด ์–ผ๋งˆ๋‚˜ ํ•„์š”ํ•œ์ง€ ๋ฐฑ๋ถ„์œจ๋กœ ํ‘œ์‹œํ•œ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’์€ Arrayํƒ€์ž…์˜ [0]์ด์ง€๋งŒ Number ํƒ€์ž…์˜ ๋‹จ์ผ ๊ฐ’์œผ๋กœ๋„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • 0 : target์˜ ๊ฐ€์žฅ์ž๋ฆฌ ํ”ฝ์…€์ด Root๋ฒ”์œ„๋ฅผ ๊ต์ฐจํ•˜๋Š” ์ˆœ๊ฐ„
      (target์˜ ๊ฐ€์‹œ์„ฑ์ด 0%์ผ ๋•Œ) ์˜ต์ €๋ฒ„๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
    • 4
    • 0.3 : target์˜ ๊ฐ€์‹œ์„ฑ 30%์ผ ๋•Œ ์˜ต์ €๋ฒ„๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
    • 5
    • [0, 0.3, 1] : target์˜ ๊ฐ€์‹œ์„ฑ์ด 0% , 30% , 100%์ผ ๋•Œ ๋ชจ๋‘ ์˜ต์ €๋ฒ„๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
    • 6
const io = new IntersectionObserver(callback, {
   threhold : 0.3 //threhold : [0.3] 
})
  1. ๐Ÿ”น Method

  • observe() : ๋Œ€์ƒ ์š”์†Œ์˜ ๊ด€์ฐฐ์„ ์‹œ์ž‘ํ•œ๋‹ค.
  • unobserve() : ๋Œ€์ƒ ์š”์†Œ์˜ ๊ด€์ฐฐ์„ ์ค‘์ง€ํ•œ๋‹ค.
  • disconnect() : IntersectionObserver ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ด€์ฐฐํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ์˜ ๊ด€์ฐฐ์„ ์ค‘์ง€ํ•œ๋‹ค.




๐ŸŸฆ children

  • ์ž์‹ ์š”์†Œ์— ์ ‘๊ทผ
  • ํ˜„์žฌ ์š”์†Œ์˜ ์ž์‹ ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ HTMLCollection์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    document.querySelector("div").children

img

๐ŸŸฆ element.offsetHeight

  • margin์„ ์ œ์™ธํ•œ, padding๊ฐ’, border๊ฐ’๊นŒ์ง€ ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค

๐ŸŸฆ element.clientHeight

  • margin๊ฐ’๊ณผ border๊ฐ’์ด ์ œ์™ธ๋œ, padding๊ฐ’๊นŒ์ง€๋งŒ ์ ์šฉ๋œ ๋‚ด๋ถ€์˜ ์‹ค์ œํฌ๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค

๐ŸŸฆ scroll์ด๋ฒคํŠธ์˜ passive์˜ต์…ฅ

  • ์š”์ฆ˜์—” scroll์ด๋‚˜ touchstart ๊ฐ™์€ ์ด๋ฒคํŠธ์— passive ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝ˜์†”์— ๊ฒฝ๊ณ ๊นŒ์ง€ ๋œฌ๋‹ค.
  • passive๊ฐ€ true์ธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” preventDefault()๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.
  • preventDefault()๋ฅผ ํ˜ธ์ถœํ•  ์ผ์ด ์—†์œผ๋‹ˆ, ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ์—๊นŒ์ง€ ์•…์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ์ผ ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

๐ŸŸฆ ์ด๋ฒคํŠธ์˜ ์˜ต์…˜

  • addEventListener() ํ•จ์ˆ˜๋Š” ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค
  • capture: ๊ธฐ๋ณธ๊ฐ’ false. ์ด๋ฒคํŠธ๋ฅผ ์บก์ณ๋ง(Capturing) ๋ฐฉ์‹์œผ๋กœ ์ „ํŒŒ(Propagation) ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ์ด๋ฒคํŠธ ์บก์ณ๋ง๊ณผ ๋ฒ„๋ธ”๋ง์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • once: ์ด๋ฒคํŠธ๊ฐ€ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๊ณ  ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‚ญ์ œ. ํ•œ๋ฒˆ ์‚ฌ์šฉํ›„ ํ๊ธฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ.
  • passive: ๊ธฐ๋ณธ๊ฐ’ false.
  • true ์ธ ๊ฒฝ์šฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ preventDefault()(์ด๋ฒคํŠธ ์ทจ์†Œ ๋ฐ ํƒ€๊ฒŸ์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์ฐจ๋‹จ) ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋ฒคํŠธ์— ์˜ํ•ด ์Šคํฌ๋กค์ด ๋ธ”๋Ÿญ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ๋ฉฐ, ์ฃผ๋กœ ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €์˜ ์Šคํฌ๋กค ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ถ”๊ฐ€๋œ ์˜ต์…˜์ด๋‹ค.

๐Ÿ”น ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ฌดํ•œ์Šคํฌ๋กค ์†Œ์Šค

setTableScrollInfinity : function () {
        tableDivElem.addEventListener('scroll', () => {
            let $tr = cmtListElem.lastElementChild;
            const io = new IntersectionObserver((entries, observer) => {
                const entry = entries[0];
                const ioTarget = entry.target;
                if (entry.isIntersecting && this.tableItemLength === this.tableLimit) {
                    console.log('ํ˜„์žฌ ๋ณด์ด๋Š” ํƒ€๊ฒŸ : ', ioTarget);
                    io.unobserve($tr);

                    this.tableItemLength = 0;
                    this.getCmtList(++this.currentTablePage);
                    $tr = cmtListElem.lastElementChild;
                    io.observe($tr);
                }
            }, {
                root : tableDivElem,
                threshold : 0.3
            });
            io.observe($tr);
        }, {passive : true});
    },
profile
๋ช‡ ๋ฒˆ์„ ๋„˜์–ด์ ธ๋„ ์•ž์œผ๋กœ ๊ณ„์† ๋‚˜์•„๊ฐ€์ž

0๊ฐœ์˜ ๋Œ“๊ธ€