portfolio issue

[React] ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐํ•œ ๋ชจ๋‹ฌ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ ํ•ด๊ฒฐ(๋ถ€์ œ : framer motion์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฃผ์—ˆ์„ ๋•Œ ํ•ด๊ฒฐ๋ฐฉ์•ˆ)

YoomD 2023. 3. 23. 16:22

์ž‘์—… ๊ฐ€์ด๋“œ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋‹ˆ ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธ€๋“ค์ด ๋„ˆ๋ฌด ๋ฐ€๋ ค๋ฒ„๋ ค์„œ ์Šฌํ”„๋‹ค

์—๋Ÿฌ ์งฑ ๋งŽ์ด ๋‚ฌ๋Š”๋ฐ,,,ใ…Žใ…Ž ์˜ค๋Š˜๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์จ์•ผ์ง€....

 

ํฌํŠธํด๋ฆฌ์˜ค ์ œ์ž‘์ด ์–ผ์ถ” ๋๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…ํ™•์ธ์„ ํ•˜๋˜ ๋„์ค‘ ์•„๋ฌด๋ฆฌ ๋ด๋„ ๋‚ด๊ฐ€ ๋ณด๊ธฐ์—” ๊ณ ์น  ์ ์ด ์•ˆ๋ณด์ด๋Š” ๊ฒƒ์ด์—ˆ๋‹ค ์ž์‹ ๊ฐ ๋„˜์น˜๋Š” ๋ณ‘์ด ์ƒ๊ฒผ๋‹ค (์ž ๋ชป์ž์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์Œ)

 

๊ทธ๋ž˜์„œ ์ฃผ๋ณ€์ธ๋“ค์„ ์ƒ๋Œ€๋กœ ๊ฐ€๋ณ๊ฒŒ QA๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋„๋ก ํ–ˆ๋‹ค ๊ฑฐ์ฐฝํ•˜๊ฒŒ ๋งํ•˜๋ฉด UI ํ…Œ์ŠคํŠธ!

1. ๋ ˆ์ด์•„์›ƒ ๊นจ์ง ํ™•์ธ

2. ๋””์ž์ธ์—์„œ ๋ˆˆ์— ํŠ€๋Š” ๊ฒƒ์ด ์žˆ๋Š”์ง€

3. ์‚ฌ์ดํŠธ ์ฒ˜์Œ ์ ‘์† ์‹œ ์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์†๋„๊ฐ€ ์–ด๋–ค์ง€

4. ๋ˆŒ๋Ÿฌ๋ณด๊ณ  ์‹ถ์€๊ฑฐ ๋‹ค ๋ˆŒ๋Ÿฌ๋ณด๊ณ  ๊ธฐ๋Šฅ ์ด์ƒ์ด ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋Š”์ง€

 

์ด๋ ‡๊ฒŒ 4๊ฐ€์ง€๋งŒ ํ™•์ธํ•ด๋‹ฌ๋ผ๊ณ  ํ–ˆ๋‹ค

ํฌํŠธํด๋ฆฌ์˜ค ๋””์ž์ธ ์ž‘์—… ํ›„ ์ฃผ๋ณ€ ์‚ฌ๋žŒ๋“คํ•œํ…Œ ํ™•์ธ ๋ฐ›๋Š”๊ฒŒ ์ƒ๊ฐ๋ณด๋‹ค ํ€„๋ฆฌํ‹ฐ ๋†’์ด๋Š” ๋ฐ ๋„์›€์ด ๋งŽ์ด ๋์–ด์„œ ์ด๋ฒˆ์—๋„ ํ•ด๋ดค๋Š”๋ฐ ์—ญ์‹œ๋‚˜ 5๋ถ„๋„ ์•ˆ๋˜์„œ ์ด๊ฑฐ ์™œ์ด๋Ÿฌ๋ƒ๋Š” ๋ฌผ์Œ์„ ๋ฐ›์•˜๋‹ค

 

๋ฐ์ดํ„ฐ๋ฅผ ์ž…ํžŒ ๋ชจ๋‹ฌ์ด ๋“ฑ์žฅํ•  ๋•Œ ๋ฒ„๋ฒ…์ด๋”๋ผ๊ตฌ์š”

 

์ง„์งœ ์™œ์ €๋ž˜....

ํ•œ 2์‹œ๊ฐ„ ์ƒ๊ฐํ•œ ๊ฒฐ๊ณผ ์•„๋ฌด๋ž˜๋„ ๋ชจ๋‹ฌ ์† iframe์•ˆ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ์–ด์„œ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์†๋„๋•Œ๋ฌธ์— ๋กœ๋”ฉ์†๋„๊ฐ€ ์ฐจ์ด๋‚˜์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ ๊ฐ™์•„์„œ ์ปจํ…์ธ  ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋ถ€๋ชจํƒœ๊ทธ์— ์‹œ๊ฐ„์ฐจ๋ฅผ ์ค˜๋ดค๋‹ค

 

์ฐธ๊ณ ๋กœ ๋‚˜๋Š” framer-motion ์จ๋ณด๊ณ  ์‹ถ์–ด์„œ ๋ชจ๋‹ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ ์šฉํ•ด๋ดค๋Š”๋ฐ ํ—‰ ์ด๋ž˜์„œ plugin์“ฐ๋‚˜ ์‹ถ์„ ์ •๋„๋กœ ๋งค์šฐ ๊ฐ„ํŽธ...

<AnimatePresence>
    {Open && (
        <motion.aside
            className='modal'
            initial={{ opacity: 0, scale: 0 }}
            animate={{ opacity: 1, scale: 1, transition: { duration: 0.6 } }}
            exit={{ opacity: 0, transition: { duration: 0.6 } }}
        >
            <div className='con' >{props.children}</div>
            <span className='close' onClick={() => setOpen(false)}>
                Close
            </span>
        </motion.aside>
    )}
</AnimatePresence>

์ด๊ฒŒ ๊ธฐ์กด์˜ ์ฝ”๋“œ๋‹ค ์ „์ฒด๋ฅผ ๊ฐ์‹ธ๋Š” aside ํƒœ๊ทธ์—๋งŒ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉํ•œ ์ƒํƒœ

์ € 'con' ํด๋ž˜์Šค ์ ์šฉ๋œ div ํƒœ๊ทธ์—๋„ ๋ชจ์…˜์„ ์ฃผ์–ด๋ณด๋ คํ•จ!

 

<AnimatePresence>
    {Open && (
        <motion.aside
            className='modal'
            initial={{ opacity: 0, scale: 0 }}
            animate={{ opacity: 1, scale: 1, transition: { duration: 0.6 } }}
            exit={{ opacity: 0, transition: { duration: 0.6 } }}
        >
            <motion.div
                className='con'
                initial={{ opacity: 0 }}
                animate={{ opacity: 1, transition: { delay: 0.6 } }}
                exit={{ opacity: 0 }}
            >
                {props.children}
            </motion.div>
            <motion.span
                className='close'
                onClick={() => setOpen(false)}
                initial={{ x: 100, opacity: 0 }}
                animate={{ x: 0, opacity: 1, transition: { delay: 0.7 } }}
                exit={{ x: 100, opacity: 0 }}
            >
                Close
            </motion.span>
        </motion.aside>
    )}
</AnimatePresence>

์ฃผ๋Š” ๊น€์— close ๋ฒ„ํŠผ์—๋„ ๋ชจ์…˜ ์คŒใ…Žใ…Ž

 

 

์–ด....? ๋œ๋‹ค!

ํ•ด๊ฒฐ!!!!!!!!!!