ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JS ํฌํŠธํด๋ฆฌ์˜ค ๋งŒ๋“ค๊ธฐ] ์Šคํฌ๋กค ์‹œ ์ƒ๋‹จ๋ฐ” ๊ณ ์ • ๋ฐ ์ƒ‰์ƒ๋ฐ”๊พธ๊ธฐ
    Mini Projects/make Portfolio 2022. 3. 18. 06:10

    2022.03.17

     

     


    ๐Ÿค”โ“ ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋กค ์‹œ, ์ƒ๋‹จ๋ฐ”๊ฐ€ ๊ณ ์ •๋˜๋ฉด์„œ ์ƒ‰์ƒ์ด ๋ณ€ํ•˜๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค.

    ์˜ค๋Š˜๋ถ€ํ„ฐ๋Š” JS๋ฅผ ์ž…ํ˜€ ์กฐ๊ธˆ ๋” ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ๋งŒ๋“œ๋ ค ํ•œ๋‹ค.

    ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋กค๋ง ํ•  ๋•Œ, ์ƒ๋‹จ์— ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ”๊ฐ€ ๊ณ ์ •๋˜๋„๋ก ๋งŒ๋“ค๊ณ , ์ƒ๋‹จ๋ฐ”์˜ ์ƒ‰์ƒ์— ๋ณ€ํ™”๋ฅผ ์ฃผ๋ ค ํ•œ๋‹ค.

     


    ๐Ÿ˜ƒโ—ํ˜„์žฌ ์Šคํฌ๋กค๋ง ๋œ Y๊ฐ’์˜ ์ขŒํ‘œ๊ฐ€ ์ƒ๋‹จ๋ฐ”์˜ Y๊ฐ’ ์ขŒํ‘œ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์ƒ๋‹จ๋ฐ”๋ฅผ ๊ณ ์ •์‹œํ‚จ๋‹ค.

    ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜์žˆ๋‹ค.

    ํ•˜์ง€๋งŒ ์ฒ˜์Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค๋ณด๋‹ˆ ์ƒ๋‹จ๋ฐ”๋ฅผ ๊ณ ์ •์‹œํ‚ค๋ ค๋ฉด ์–ด๋–ค ๋ช…๋ น์„ ํ•ด์ค˜์•ผํ• ์ง€ ๊ฐ์ด ์žกํžˆ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๋‹จ์€ ๋ฐฉ๋ฒ•๋ก ์„ ์ฐพ๊ธฐ๋กœ ํ•œ๋‹ค.

     

     

    0) ๋ฐฉ๋ฒ•๋ก ์„ ์ฐพ์•„๋ณด์ž.

    ๋จผ์ €, ๊ตฌ๊ธ€์— ๋“ค์–ด๊ฐ€ ๊ตฌ๊ธ€๋ง์„ ํ•œ๋‹ค.

    ๋‚˜๋Š” 'js fix navbar when scrolling'์ด๋ผ ๊ฒ€์ƒ‰ํ–ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์˜์–ด๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

    ๊ผญ ๋ฌธ์žฅ์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋ณธ์ธ์ด ์›ํ•˜๋Š” ๋‹จ์–ด๋งŒ ๋‚˜์—ดํ•ด๋„ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ('js scroll topbar fix' ์ด๋Ÿฐ ์‹์œผ๋กœ)

     

    ๊ฐ€์žฅ ์ฒ˜์Œ ๊ฒ€์ƒ‰๋œ How to create a sticky nav bar ๋ผ๋Š” ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ํ™•์ธํ•œ๋‹ค.

    ์ƒ๋‹จ๋ฐ”(navbar)์˜ Top์ขŒํ‘œ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ , ํ˜„์žฌ ์Šคํฌ๋กคํ•œ ์œ„์น˜๊ฐ€ ์ƒ๋‹จ๋ฐ” Y์ขŒํ‘œ๊ฐ’์ด ๋” ํฌ๋ฉด 'sticky'๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

    ์ด๋•Œ, 'sticky'๋ผ๋Š” ํด๋ž˜์Šค๋Š” css์— ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋†“๋Š”๋‹ค.

    ์ฐธ๊ณ ๋กœ Y์ขŒํ‘œ๊ฐ’์„ ์ฐพ๋Š” ์ด์œ ๋Š” ์Šคํฌ๋กค์ด '์ˆ˜์ง vertical'์œผ๋กœ ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

     

    ๋ฌผ๋ก  ์ฒ˜์Œ๋ถ€ํ„ฐ '์•„ ๊ทธ๋ ‡๊ตฌ๋‚˜'๋ผ๊ณ  ์•Œ์ง€๋Š” ๋ชปํ•˜๊ธฐ์— ๋‹ค๋ฅธ์‚ฌ๋žŒ๋“ค์ด ์ ์šฉํ•œ ๋ฐฉ๋ฒ•๋ก ๋“ค๋„ ๋‹ค ์ฐพ์•„๋ณธ ํ›„์—, ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ๊ฐ ์‚ฌ์šฉํ•˜๋Š” property๊ฐ€ ๋‹ฌ๋ผ ๊ฐ๊ฐ์˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋ฉด ๋ ์ง€ ์•Œ์•„๋ณด๋ฉฐ ๊ฐ property์— ๋Œ€ํ•ด์„œ๋„ ๋ญ๊ฐ€ ๋‹ค๋ฅธ์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๋ คํ•œ๋‹ค.

     

     

    1) ์–ด๋–ป๊ฒŒ ํ˜„์žฌ ์Šคํฌ๋กค๋ง ๋œ Y๊ฐ’์˜ ์ขŒํ‘œ๋ฅผ ์•Œ์•„๋‚ผ๊นŒ?

    ์—ญ์‹œ ๋จผ์ € ๊ตฌ๊ธ€๋ง์„ ํ•œ๋‹ค. 'how to know current y position mdn'์ด๋ผ ๊ฒ€์ƒ‰ํ•˜๋‹ˆ window.scrollY๋ผ๋Š” ๋ฌธ์„œ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

    scrollY: ์Šคํฌ๋กค๋œ window์˜ ํ˜„์žฌ Y์ขŒํ‘œ๊ฐ’์„ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    scrollX: ์ˆ˜ํ‰๋ฐฉํ–ฅ์˜ ์ขŒํ‘œ๋ฅผ ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด scrollX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

    scrollY์™€ ๋˜‘๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” property๊ฐ€ ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ window.pageYOffset์ด๋‹ค.

    ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” scrollY property๊ฐ€ ์ž‘๋™๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— pageYOffset์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ scrollY๊ฐ€ ๋” ์ตœ์‹ ๋ฌธ๋ฒ•์ธ๊ฐ€๋ณด๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ„์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด ๋‘๊ฐ€์ง€ property๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

     

    ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์„ ๋ณด๋‹ˆ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ์šฉ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์•„ ๊ทธ๋ƒฅ scrollY๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.

     

    // ์Šคํฌ๋กค ์‹œ navbar ๊ณ ์ •์‹œํ‚ค๊ธฐ
    
    document.addEventListener("scroll", () => {
      const scrollY = window.scrollY;
      console.log(scrollY)
    });

    ํฌ๋กฌ ๊ฐœ๋ฐœ์ž๋„๊ตฌ(mac ๋‹จ์ถ•ํ‚ค: option + commnad + i)๋กœ ํ™•์ธํ•ด๋ณด๋‹ˆ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

     

     

    2) ์ƒ๋‹จ๋ฐ”์˜ Y๊ฐ’(๋†’์ด๊ฐ’)์€ ์–ด๋–ป๊ฒŒ ์•Œ์•„๋‚ด์ง€?

    window ์ขŒํ‘œ ๋ฐ ํ•ด๋‹น ์šฉ์–ด

     

    (1) Element.offsetTop

    ์ด์ œ ์ƒ๋‹จ๋ฐ”์˜ Y๊ฐ’ ์ขŒํ‘œ๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. how to know navbar y position mdn ๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•˜์—ฌ Element.offseTop์„ ํ™•์ธํ•œ๋‹ค.

    Element.offsetTop : ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด relative ์†์„ฑ์„ ๊ฐ€์ง„ ๋ถ€๋ชจelement์˜ inner border์˜ top์—์„œ
    ํ˜„์žฌelement์˜ outer border๊นŒ์ง€ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    ์ผ๋‹จ, ๋ถ€๋ชจelement์—์„œ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์•Œ๊ณ ์‹ถ์€๊ฒŒ ์•„๋‹ˆ๋ผ, ์œˆ๋„์šฐ์—์„œ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์•Œ๊ณ ์‹ถ์€๊ฑฐ๋‹ˆ ํ•ด๋‹น property๋Š” ๋‚ด๊ฐ€ ์ฐพ๋Š”๊ฒŒ ์•„๋‹Œ๊ฑฐ ๊ฐ™๋‹ค.

    ๊ฒŒ๋‹ค๊ฐ€ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž๋ชจ๋“œ์—์„œ ํ…Œ์ŠคํŠธํ•ด๋ณด๋‹ˆ ๊ฐ’์ด ๊ณ ์ •๋˜์ง€์•Š๊ณ  ๊ณ„์† ์›€์ง์ธ๋‹ค. (Y๊ฐ’์˜ ๋†’์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด ๊ฐ’์ด ์ผ์ •์ˆ˜์ค€์—์„œ ๊ณ ์ •๋˜์–ด์•ผ ํ•œ๋‹ค.)

     

     

    (2) window.innerHeight

    ์œˆ๋„์šฐ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ์‚ฌ์ด์ฆˆ

     

    window ์•ˆ์ชฝ์˜ ๋†’์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์•Œ๊ณ ์‹ถ์€๊ฑด window ๋†’์ด๊ฐ€ ์•„๋‹ˆ๊ณ  element์˜ ๋†’์ด์ด๋‹ˆ ๋„˜์–ด๊ฐ„๋‹ค.

    ์ฐธ๊ณ ๋กœ clientHeight๋ผ๋Š” property๊ฐ€ ์žˆ๋‹ค. ์ด๋Š” ์Šคํฌ๋กค๋ฐ”๋ž‘ border๊นŒ์ง€ ์ œ์™ธํ•œ ํ›„์˜ ์ˆœ์ˆ˜ ๋ธŒ๋ผ์šฐ์ €ํŽ˜์ด์ง€์˜ ๋†’์ด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

     

    window.innerHeight: window - any borders
    element.clientHeight: window - (horizontal scrollbar + any borders)

     

    (3) Element.getBoundingClientRect() / Element.clientHeight

    clientHeight๊ฐ€ ์ˆœ์ˆ˜ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ์‚ฌ์ด์ฆˆ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณธ๋‹ค.

    Element.clientHeight: CSS height + CSS padding - horizontal scrollbar height

    ์˜ค, padding์„ ํฌํ•จํ•œ element์˜ ๋†’์ด๋ฅผ ์•Œ๋ ค์ค€๋‹ค. ์™ ์ง€ ์ด๊ฑฐ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

     

    ์•„๋ž˜ ๋‚ด๋ ค๋ณด๋‹ˆ element.getBoundingClientRect()๋ผ๋Š” property๊ฐ€ ์žˆ๋‹ค. clinetHeight๋ž‘ ๊ฐ™์€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

    element.clinetHeight: '์ •์ˆ˜ integer'๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜
    element.getBoundingClientRect(): '์†Œ์ˆ˜ float'๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜

    ๋‘˜๋‹ค ๋˜‘๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹คํ•˜๋‹ˆ ๋‘˜๋‹ค ์‚ฌ์šฉํ•ด๋ณด๋„๋ก ํ•œ๋‹ค.

     

    const navbar = document.querySelector("#navbar"); //from HTML
    
    document.addEventListener("scroll", () => {
      const scrollY = window.scrollY;
      const clientHeight = navbar.clientHeight;
      const clientRect = navbar.getBoundingClientRect();
      
      console.log(`scrollY: ${scrollY}`)
      console.log(`clientHeight: ${clientHeight}`);
      console.log(`clientRect: ${clientRect}`);
    });

    ํฌ๋กฌ ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋กœ ํ™•์ธํ•ด๋ณด๋‹ˆ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทผ๋ฐ clientRect๋Š” 'Object DOMRect'๋ผ๊ณ  ๋œฌ๋‹ค.

    ๋ญ”๊ฐ€ ๋ฐฐ์—ด(์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐ’์ด ์กฐํ•ฉ๋˜์–ด์„œ)๋กœ ์ด๋ค„์ ธ์žˆ๋‚˜๋ณด๋‹ค. DOMRect๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ์‚ฌ๊ฐํ˜•์˜ ์‚ฌ์ด์ฆˆ์™€ ํฌ์ง€์…˜์„ ์„ค๋ช…ํ•œ ๊ฒƒ์ด๋ผ ํ•œ๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋ฉด, ๋ญ”๊ฐ€ element์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ค ๋‹ด๊ณ  ์žˆ๋Š” objectํ˜•ํƒœ๋กœ ์ด๋ค„์ ธ์žˆ๊ณ , ๊ทธ ์ค‘์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” height๋งŒ ์™!ํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ!๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

     

    document.addEventListener("scroll", () => {
      ...
      const clientRect = navbar.getBoundingClientRect().height; //.height๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
    });

     

    ๊บ„?! ๋งž๋‹ค?!!!ใ…Žใ…Žใ…Žใ…Ž ์‹ ๋‚œ๋‹ค.ใ…‹ใ…‹ใ…‹ใ…‹ ์•„ ๋ญ”๊ฐ€ ์ด๋ ‡๊ฒŒ ๊ฒ€์ƒ‰ํ•ด์„œ ์ฐพ์•„๋ƒˆ์„ ๋•Œ์˜ ๋ฟŒ๋“ฏํ•จ!!! ์•„ ๋„ˆ๋ฌด ์ข‹๋‹ค.ใ…‹ใ…‹ใ…‹ใ…‹

     

    ์‹ ์ด๋‚˜ ์‹ ์ด๋‚˜ ์—ํ…œ์—ํ…œ ์‹ ์ด๋‚˜!!!

     

     

    3) ์ฝ”๋”ฉ์„ ์‹ค์‹œํ•œ๋‹ค.

    ์›ํ•˜๋Š” ์กฐ๊ฑด์€ ๋ชจ๋‘ ์ฐพ์•˜์œผ๋‹ˆ ์ด์ œ ์ž˜ ์กฐํ•ฉํ•ด๋ณด๋„๋กํ•˜์ž.

     

    (1) ์ƒ๋‹จ๋ฐ” ๊ณ ์ •์‹œํ‚ค๊ธฐ

    [css]
    
    /* navbar */
    #navbar {
      display: flex;
      justify-content: space-between;
      position: fixed; /*navbar ์ƒ๋‹จ๊ณ ์ •*/
      width: 100%; /*navbar๊ฐ€ ๊ฐ€๋กœ์˜์—ญ 100% ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •*/
    
      color: var(--color-dark-gray);
      background-color: transparent; /*๊ธฐ๋ณธ์œผ๋ก  ํˆฌ๋ช…์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค๊ฐ€, ์Šคํฌ๋กค๋งํ•˜๋ฉด ์ƒ‰์ƒ์ด ๋ณ€ํ•˜๋„๋ก*/
      transition: all var(--animation-duration) ease-in; /*์Šคํฌ๋กค๋งํ•  ๋•Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ‰์ด ์ž…ํ˜€์ง€๋„๋ก ์• ๋‹ˆ๋ฉ”์ด์…˜์ถ”๊ฐ€*/
    }
    
    #navbar.fixed {
      background-color: var(--color-pink);
    }

    ์ƒ๋‹จ๋ฐ” ๊ณ ์ •์€ ์ƒ๊ฐ๋ณด๋‹ค ์‰ฌ์› ๋‹ค. position property๋ฅผ ์ด์šฉํ•ด์„œ css์— ์ƒ๋‹จ๋ฐ”(navbar)์˜ position์„ "fixed"๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

     

    (2) ์ƒ๋‹จ๋ฐ” ์ƒ‰์ƒ ๋ฐ”๊พธ๊ธฐ

    ์ƒ‰์ƒ์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ๋Š” css์— "fixed"๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋์„ ๊ฒฝ์šฐ, ์ ์šฉ๋˜๋Š” ์กฐ๊ฑด์„ ์ž…๋ ฅํ•ด์ค€๋‹ค.

    ์Šคํฌ๋กค๋ง ํ•˜๋ฉด ์ƒ‰์ด ์ž…ํ˜€์ง€๋„๋ก ๊ธฐ์กด ์ƒ๋‹จ๋ฐ”์˜ ์กฐ๊ฑด๋„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ฐ”๊ฟ”์คฌ๋‹ค. 

     

    [JS]
    
    // ์Šคํฌ๋กค ์‹œ navbar ์ƒ‰์ƒ ๋ฐ”๊พธ๊ธฐ
    const navbar = document.querySelector("#navbar"); //from HTML
    const navbarHeight = navbar.getBoundingClientRect().height;
    
    document.addEventListener("scroll", () => {
      const scrollY = window.scrollY;
    
      //navbar์˜ ๋†’์ด๊ฐ€ ํ˜„์žฌ๊นŒ์ง€ ์Šคํฌ๋กค ๋œ Y๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด navbar์— fixed๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด๋ผ.
      //1) ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
      navbarHeight < scrollY ? navbar.classList.add("fixed") : navbar.classList.remove("fixed");
      
      //2) if๋ฌธ ์‚ฌ์šฉ
      if (window.scrollY > navbarHeight) {
        navbar.classList.add("fixed");
      } else {
        navbar.classList.remove("fixed");
      }
    });

     

    JS๋กœ ๋„˜์–ด๊ฐ€์„œ, ์Šคํฌ๋กค ์‹œ ์ƒ๋‹จ๋ฐ”์˜ ์ƒํƒœ์— ๋ณ€ํ™”๋ฅผ ์ฃผ๊ธฐ์œ„ํ•ด ์ƒ๋‹จ๋ฐ”์˜ id(์—ฌ๊ธฐ์—์„  "navbar")๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

     

    ๊ทธ๋ฆฌ๊ณ  ์ƒ๋‹จ๋ฐ”์˜ ๋†’์ด๊ฐ€ ํ˜„์žฌ๊นŒ์ง€ ์Šคํฌ๋กค ๋œ Y์ขŒํ‘œ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด "navbar"๋ผ๋Š” id์— class "fixed"๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ œ๊ฑฐํ•ด๋ผ. ๋ผ๋Š” ๋ช…๋ น์„ ์ ์–ด์ค€๋‹ค.

     

    ์กฐ๊ฑด๋ฌธ์ด์–ด์„œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋กœ ์ ์–ด๋ดค๋‹ค.

     

    navbar์— classList์ถ”๊ฐ€๊ฐ€ ์ž˜ ๋ผ์—ˆ๋Š”์ง€ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž๋ชจ๋“œ์—์„œ ํ™•์ธํ•ด๋ณธ๋‹ค.

     

    z-index

    ์—‡ ๊ทธ๋Ÿฐ๋ฐ ์•„๋ž˜๋กœ ๋‚ด๋ฆฌ๋‹ˆ ์ƒ๋‹จ๋ฐ” ์œ„์ชฝ์œผ๋กœ ์˜ฌ๋ผ์˜ค๋Š” ์š”์†Œ๋“ค์ด ์žˆ๋‹ค.

    ์ด๋Ÿด๋•Œ์—๋Š” css์—์„œ ์ƒ๋‹จ๋ฐ”์˜ z-index๊ฐ’์„ 1๋กœ ์ฃผ๋ฉด ๋œ๋‹ค.

     

    #navbar {
      display: flex;
      justify-content: space-between;
      position: fixed; /*navbar ์ƒ๋‹จ๊ณ ์ •*/
      width: 100%;
      z-index: 1; /*๊ฐ€์žฅ ์ตœ์ƒ์œ„๋กœ ์˜ฌ๋ผ์˜ค๋„๋ก*/
    
      color: var(--color-dark-gray);
      background-color: transparent;
      transition: all var(--animation-duration) ease-in;
    }

     

    z-index๊ฐ€ ๋ญ์•ผ? ๋ผ๊ณ  ํ•˜๊ธฐ์—” ์ด๋ฆ„์ด ๋”ฑ ๋ด๋„ ์‚ฌ์šฉ์ž ์ชฝ์œผ๋กœ ์˜ฌ๋ผ์˜ค๋Š” 3์ฐจ์› ์ถ•์„ ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ํ•ด๋‹น ์ถ•์„ ๊ฐ€์žฅ ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ฆฐ๋‹ค๋Š” ์˜๋ฏธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

     

     

    ์™„์„ฑ! ์ƒ๋‹จ๋ฐ” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ž˜ ์ ์šฉ๋œ๋‹ค.

     

     

    ์ด๋ ‡๊ฒŒ 


    ๋ญ”๊ฐ€, ์ƒ๋‹จ๋ฐ” ํ•˜๋‚˜ ๊ณ ์ •์‹œํ‚ค๊ณ  ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๋ฐ๋„ ์ด๋ ‡๊ฒŒ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ค„์ด์•ผ... ์กฐ๊ธˆ ๋ฉ˜๋ถ•์ด์—ˆ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์”ฉ ์•Œ์•„๊ฐ€๋Š”๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

     

    ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ์•„๋ž˜ github์— ์—…๋กœ๋“œํ•ด๋‘์—ˆ๋‹ค.

     

    eunne's github: https://github.com/eunne/Project_Portfolio.git

Designed by Tistory.