[ReactJS_MasterClass] #8 ANIMATIONS (2)

์œ ์€์„ ยท2023๋…„ 2์›” 27์ผ
0

ReactJS_MasterClass

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

โœ8.10 SVG Animation

๐Ÿ“Žhttps://fontawesome.com/

โœ…fill="currentColor" ์ผ ๋•Œ path๋Š” svg์˜ color๋ฅผ ์“ฐ๊ฒŒ ๋œ๋‹ค.

โœ…pathLength๋Š” ํ˜„์žฌ ์šฐ๋ฆฌ ์œ„์น˜๊นŒ์ง€์˜ path์˜ ๊ธธ์ด

๋งˆ์ง€๋ง‰์œผ๋กœ ํŠน์ • property์˜ animation duration์„ ๋‹จ๋…์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.
pathLength๊ฐ€ 0์—์„œ 1๋กœ ๊ฐ€๋Š”๊ฒƒ, fill์˜ opacity๊ฐ€ 0์—์„œ 1๋กœ ๊ฐ€๋Š” ๊ฒƒ ๋ชจ๋‘ 5์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.

const svg = {
  start: { pathLength: 0, fill: "rgba(255,255,255,0)" },
  end: {
    pathLength: 1,
    fill: "rgba(255,255,255,1)",
    transition: { duration: 5 },
  },
};

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด transition: {duration:5} ๋กœ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋˜‘๊ฐ™์ด 5์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๋Š”๊ฒƒ์ธ๋ฐ, ์ด๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์ž.

 <motion.path transition={{
            default: { duration: 5 },
            fill: { duration: 2, delay: 5 }, }} />

์ง์ ‘์ ์œผ๋กœ ์–ด๋–ค property๋ฅผ ์–ด๋–ป๊ฒŒ, ์–ผ๋งˆ๋‚˜ animation ํ•  ์ง€ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. default๋Š” ๋ชจ๋“  propery์— ์ ์šฉ๋˜๋Š” ๊ฐ’์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค๐Ÿคฃ

โœ8.11 AnimatePresence

AnimatePresence๋Š” React js App์—์„œ ์‚ฌ๋ผ์ง€๋Š” component๋ฅผ animateํ•˜๋Š” component ์ด๋‹ค.
AnimatePresence๋Š” visible ์ƒํƒœ์—ฌ์•ผ ํ•˜๊ณ , ๋‚ด๋ถ€์—๋Š” condition(์กฐ๊ฑด๋ฌธ)์ด ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

โœ8.12 Slider part One

๋‚˜ํƒ€๋‚˜๋Š” Box์™€ ์‚ฌ๋ผ์ง€๋Š” Box๋ฅผ ํŠน์ •ํ•ด์„œ ์Šฌ๋ผ์ด๋”๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.

๊ฐ„๋‹จํ•˜๊ฒŒ prev์™€ next ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, prev๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ž˜ ์ž‘๋™ํ•˜๊ธด ํ•˜์ง€๋งŒ next๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ๋ž‘ ๊ฐ™์€ ๋ฐฉํ–ฅ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋Š”๋ฐ ๋‹ค์Œ ์ฑ•ํ„ฐ์—์„œ ๋ฐฐ์›Œ๋ณด์ž.

โœ8.13 Slider part Two

โœ… ๋ฐฐ์—ด์„ ์—†์• ๊ณ  ๋” ๊น”๋”ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. element์˜ key๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ๋„ React js๋Š” element๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ewit animation์„ ์‹คํ–‰ํ•  ๊ฒƒ์ด๋‹ค.

โœ… prev ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ์ˆ˜์žˆ๋„๋ก ํ•ด๋ณผ๊ฑด๋ฐ, custom์ด๋ž€ property์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.
custom์€ variants์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” property์ด๋‹ค.

โœ… next๋ฅผ ๋ˆ„๋ฅด๋ฉด 1๋ฒˆ Box์˜ exit animation์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ 2๋ฒˆ Box์˜ entry๊ฐ€ ๊ฑฐ์˜ ๋™์‹œ์— ์‹คํ–‰๋œ๋‹ค. ํ•˜๋‚˜๊ฐ€ ์‹คํ–‰๋œ ๋’ค์— ๋‹ค์Œ ๊ฒƒ์ด ์‹คํ–‰๋˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ animation์ด ๊ฑฐ์˜ ํ•จ๊ป˜ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ.
exitBeforeEnter์„ ์ด์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. exit์„ ์‹คํ–‰์‹œํ‚ค๊ณ  exit์ด ๋๋‚˜๋ฉด ๋‹ค์Œ element๋ฅผ ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ 1๋ฒˆ Box์˜ exit์ด ์™„์ „ํ•˜๊ฒŒ ์‹คํ–‰๋์„ ๋•Œ๋งŒ 2๋ฒˆ Box๊ฐ€ ์˜ค๊ฒŒ ๋œ๋‹ค!

โ— exitBeforeEnter๋Š” ๋” ์ด์ƒ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ mode="wait"๋ฅผ ์ž‘์„ฑํ•ด์„œ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

โœ8.14 You Need to Watch This

layout์ด๋ผ๋Š” prop์„ ๋ฐฐ์›Œ๋ณด์ž. ์ด prop์„ element์—๊ฒŒ ์ฃผ๋ฉด ๊ทธ element์˜ layout์ด ๋ฐ”๋€” ๋•Œ ์•Œ์•„์„œ animate๊ฐ€ ๋œ๋‹ค. css์˜ ๋ณ€ํ™”๊ฐ€ ์ž๋™์œผ๋กœ animate ๋œ๋‹ค๋Š” ๊ฒƒ!
์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์— layout๋งŒ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ๐Ÿคฃ

const Box = styled(motion.div)`
  width: 400px;
  height: 400px;
  background-color: rgba(255, 255, 255, 1);
  border-radius: 40px;
  display: flex;
  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.06);
`;

function App() {
  const [clicked, setClicked] = useState(false);
  const toggleClicked = () => setClicked((prev) => !prev);
  return (
    <Wrapper onClick={toggleClicked}>
      <Box
        style={{
          justifyContent: clicked ? "center" : "flex-start",
          alignItems: clicked ? "center" : "flex-start",
        }}
      >
        <Circle layout />
      </Box>
    </Wrapper>
  );
}

๋‘๋ฒˆ์งธ๋กœ shared layout animation์„ ๋ฐฐ์›Œ๋ณด์ž.
๋‘๊ฐœ ๊ฐ๊ฐ์˜ ์„œ๋กœ ๋‹ค๋ฅธ component์ธ Circle์ด ๊ฐ™์€ component๋ผ๊ณ  Framer์—๊ฒŒ ํ•จ๊ป˜ ์—ฐ๊ฒฐ๋œ๋‹ค๊ณ  ๋งํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, layoutId๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๐Ÿคฃ

โœ8.15 Final Project part One

8.14์— ์ด์–ด layoutId๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅธ component์ด์ง€๋งŒ ํ•จ๊ป˜ ๋ฌถ๊ณ  ๊ฐ๊ฐ ๋‹ค๋ฅธ state๋ฅผ animate ํ•ด๋ณด์ž.

โœ8.16 Final Project part Two

๋‹ค๋ฅธ Box๋„ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ , ํด๋ฆญํ•œ ๊ฐ Box๋ฅผ ์ค‘์•™์œผ๋กœ ๊ฐ€๊ฒŒ ํ•ด๋ณด์ž. (์–ด๋Š element๋ฅผ ํด๋ฆญํ•ด๋„ ์ž‘๋™๋˜๋„๋ก)

profile
๋ญ๋“ ์ง€ ๋‚œ ์—ด์‹ฌํžˆ ํ•˜์ง€

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