๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Development/React.js

[React]Modal ํŒ์—…์‹œ ๋’ท๋ฐฐ๊ฒฝ ์Šคํฌ๋กค ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ

by DevIseo 2022. 8. 13.

[react]Modal ํŒ์—…์‹œ ๋’ท๋ฐฐ๊ฒฝ ์Šคํฌ๋กค ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ

Modal components๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ๋ชจ๋‹ฌ css position ์†์„ฑ์ธ `fixed`๋ฅผ ์ ์šฉํ•ด๋„ ๋’ท ๋ฐฐ๊ฒฝ์ด ์Šคํฌ๋กค์ด ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ๊ธ€๋ง์„ ํ–ˆ๋‹ค.

 

  // ๋ชจ๋‹ฌ ์˜ค๋ฒ„๋ ˆ์ด์—์„œ ์Šคํฌ๋กค ๋ฐฉ์ง€
  useEffect(() => {
    document.body.style.cssText = `
      position: fixed; 
      top: -${window.scrollY}px;
      overflow-y: scroll;
      width: 100%;`;
    return () => {
      const scrollY = document.body.style.top;
      document.body.style.cssText = '';
      window.scrollTo(0, parseInt(scrollY || '0', 10) * -1);
    };
  }, []);

์ด๋•Œ react hook ์ค‘ ํ•˜๋‚˜์ธ useEffect๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

`body`ํƒœ๊ทธ์˜ css๋ฅผ ๋ณ€๊ฒฝํ•ด position์„ fixed๋กœ ํ•˜๊ณ , top์˜ ์œ„์น˜๋ฅผ ํ˜„์žฌ ์Šคํฌ๋กค ์œ„์น˜๋กœ ์„ค์ •ํ•ด `overflow-y:scroll,width:100%`๋ฅผ ํ†ตํ•ด ์Šคํฌ๋กค ๋ฐฉ์ง€๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด ์ฝ”๋“œ์—์„œ๋Š” modal์ฐฝ์ด ๋œจ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋„ fixed๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ํ˜„์ƒ์„ ๊ฒช์—ˆ๋‹ค.

//๋‹ฌ์„ฑ๋ฅ ๊ณผ ๋‚˜์˜ ์ธ์ฆ์ƒท ๋ณด์—ฌ์ฃผ๋Š” ํƒญ
function Achievement() {
  const [Modal, setModal] = useState(false)
  useEffect(() => {
    if (Modal === false) {
      console.log('bye', Modal)
    } else {
      document.body.style.cssText = `
      position: fixed; 
      top: -${window.scrollY}px;
      overflow-y: scroll;
      width: 100%;`;
      return () => {
        const scrollY = document.body.style.top;
        document.body.style.cssText = '';
        window.scrollTo(0, parseInt(scrollY || '0', 10) * -1);
        console.log('hi', Modal)
      };
    }
  }, [Modal]);

  return (
    <>
        <CertifyGoBtn hColor={'#65ACE2'} dColor={'#98C064'} onClick={() => setModal(true)}>์ธ์ฆํ•˜๊ธฐ</CertifyGoBtn>
        <MissionModal show={Modal} setShow={setModal} />

    </>
  )
}

๋‚˜๋Š” `์ธ์ฆํ•˜๊ธฐ` ๋ฒ„ํŠผ์„ ํด๋ฆญ ์‹œ useState๋ฅผ ํ†ตํ•ด Modal์ด๋ผ๋Š” ๊ฐ’์„ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ๋‹ค. useEffect๊ฐ€ Modal์ด๋ผ๋Š” ๊ฐ’์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ` [Modal]`์„ ์ ์šฉํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ useEffectModal์˜ ๊ฐ’์ด true์ผ ๋•Œ๋งŒ ์Šคํฌ๋กค์ด ๋ฉˆ์ถ”๊ฒŒ ํ–ˆ๋‹ค.

์ฐธ๊ณ ํ•œ site

http://yoonbumtae.com/?p=3776

https://cocoon1787.tistory.com/796

https://velog.io/@do_dadu/React%EC%97%90%EC%84%9C-Modal-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0feat.-createPortal-%EC%8A%A4%ED%81%AC%EB%A1%A4-%EB%A7%89%EA%B8%B0

๋Œ“๊ธ€