๐ Framer Motion?
Framer Motion ์ React ๋ก ๊ฐ๋ฐ๋ Animation Library ์ ๋๋ค.
๊ด๋ จ๋ ํจํค์ง์ค์ ์ง์์ ์ผ๋ก ์ฌ์ฉ๋ ๋ฐ ๊ด์ฌ๋๊ฐ ์ฆ๊ฐํ๊ณ ์๋ ์ถ์ธ์ ๋๋ค. ๐
์น์ฑ์์ ์ ๋๋ฉ์ด์ ์ ๋ค๋ฃจ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ง๋ง,
๋ค์ํ ํ๊ฒฝ์์ ์ถฉ๋ถํ ์ฑ๋ฅ์ ๊ณ ๋ คํ์ฌ ๊ตฌํํ๊ธฐ์๋ ์๊ฐ๋ณด๋ค ๊ณ ๋ คํ ์ฌํญ์ด ๋ง๊ณ ๊น๋ค๋ก์ด ๊ฒ์ด ์ฌ์ค์ ๋๋ค.
์ด๋ฒ ์ํด๋ฆฌ์์๋ ์ด๋ฌํ ๋ถ๋ถ์ ๋์์ด ๋ ์๋ ์๋ ํจํค์ง๋ฅผ ์๊ฐํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋ คํฉ๋๋ค.
๐ TL;DR
Framer Motion ์ ํน์ง
- TypeScript ์ง์
- ์ต์ ํ๋ ์ฑ๋ฅ ๋ฐ ํ๋ถํ API
- physics ๊ธฐ๋ฐ์ ์ฌ์ค์ ์ธ transitionํจ๊ณผ ์ ๊ณต (spring, tween, inertia)
- ๋ชจ๋ ์น์ฑ์์ ๋ฐ๋ณต์ ์ผ๋ก ํ์๋ก ํ๋ ์ฌ๋ฌ ๋ชจ์ ๋ค์ ๊ฐ๊ฒฐํ API ๋ก ์ ๊ณต
- ์ ์ธ์ ์ธ ์ ๋๋ฉ์ด์ ์ฝ๋ ๊ตฌํ (with Component Props, React Hook, Utilities)
- ๋ฌ๋์ปค๋ธ๊ฐ ๋์ผ ์นดํ ๊ณ ๋ฆฌ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋นํด ๋ฎ๊ณ ์ปค์คํ ์ ์ฉ์ดํจ
- (+) Framer ↔ Framer-Motion ๊ฐ์ ์ ์ฉ์ด ์ฉ์ดํจ
- ์๋ ์ฝ๋ ์์ฑ ๊ธฐ๋ฅ ์ ๊ณต
- ๋์์ด๋๊ฐ motion ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฃจ๋ ์๋๊ฐ ์ฌ๊น?
- Framer ๋ฅผ ๋ฉ์ธ ๋์์ธํด๋ก ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ํฐ ์ฅ์ ์ด ๋ ์๋?
๐ Framer Motion Quick Tutorial
Framer Motion ๊ตฌ์ฑ ์์ ๋ฏ์ด๋ณด๊ธฐ
๊ทธ๋ผ ์ด์ Framer-Motion
์ ๊ตฌ์ฑํ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ค์ ํ๋์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
โ ๏ธ ์ฌ๊ธฐ์ ๋ชจ๋ API ๋ฅผ ๋ค๋ฃจ์ง๋ ์์ต๋๋ค.
1๏ธโฃ Animation
Framer-Motion
์์ ์ ๋๋ฉ์ด์
์ ๊ตฌํํ๋ ๊ฐ์ฅ ํต์ฌ ์ปดํฌ๋ํธ๋ motion
์
๋๋ค.
motion
์ปดํฌ๋ํธ๋ ํ์ค HTML ๊ณผ SVG ์๋ฆฌ๋จผํธ๋ฅผ ๋ชจ๋ ๊ตฌํํ๊ณ ์์ผ๋ฉฐ,
์ผ๋ฐ์ ์ผ๋ก animate
์์ฑ์ผ๋ก ์ํ๋ animation ์ ์ง์ ํฉ๋๋ค.
์ฌ๊ธฐ์ ํน์ ๊ฐ
์ด๋ keyframe
์ ์ง์ ํ ์๋ ์์ต๋๋ค.
<motion.div
animate={{
scale: [1, 2, 2, 1, 1],
rotate: [0, 0, 180, 180, 0]
}}
/>
animate
์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ์์์ ํด๋น ๊ฐ์ผ๋ก ๋ณํํ๋ฉฐ ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก motion
์ ๋ณํํ๋ ๊ฐ์ ์ข
๋ฅ์ ๋ฐ๋ผ ์ ์ ํ transition ํจ๊ณผ๋ฅผ ๋ถ์ฌํฉ๋๋ค.
(์๋ฅผ ๋ค์ด x
, y
๋ scale
, rotate
๊ณผ ๊ฐ์ physical ์์ฑ๋ค์ spring
, opacity
๋ color
๋ tween
ํจ๊ณผ)
๋ฌผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ํ๋ ํจ๊ณผ๋ฅผ ์ง์ ํ ์๋ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก animate
์ ์ง์ ๋ keyframes ๋ค์ ๊ณ ๋ฅด๊ฒ ๋ถ๋ฐฐ๋ animation ์คํ์๊ฐ์ ๊ฐ์ง๋๋ฐ,
times
์์ฑ์ ํตํด 0~1
์ด ์ฌ์ด์์ ๊ฐ ํ๋ ์๋ณ ์์์๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
<motion.circle
cx={500}
animate={{ cx: [null, 100, 200] }}
transition={{ ease: 'easeOut', duration: 3, times: [0, 0.2, 1] }}
/>
์ ๋๋ฉ์ด์ ์ transition stage ๋ฅผ ์ถ์ ํ๊ณ ์ถ๋ค๋ฉด,
motion
์ปดํฌ๋ํธ์์ ์ ๊ณตํ๋ animation event props ์ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค.
<motion.div
animate={{ x: 100, opacity: 0 }}
onAnimationStart={onStart}
onUpdate={onUpdate}
onAnimationComplete={definition => {
console.log('Completed animating', definition)
}}
/>
๋ํ motion
์ปดํฌ๋ํธ๋ SSR
(ServerSide Rendering) ๋ ์ง์ํฉ๋๋ค.
๋ค๋ง ์ผ๋ถ SVG ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ์๋ ์์ง๊น์ง ์์ ํ ํธํ๋์ง๋ ์๋๋ค๊ณ ํฉ๋๋ค.
๐ก React Tree ์ธ๋ง์ดํธ ์์๋ ์ ๋๋ฉ์ด์ ์ ์ ์งํ๊ณ ์ถ๋ค๋ฉด?
ํน์ ์ปดํฌ๋ํธ๊ฐ DOM ํธ๋ฆฌ์์ ์ ๊ฑฐ๋ ๋ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ ์งํ๋๋ก ์ฒ๋ฆฌํ๋๊ฒ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค.
๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ด ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์ฌ์ฉํ ๊ฒฝ์ฐ react-transition-group
์ ์ด์ฉํ๋ฉด
์ ๋๋ฉ์ด์ ์ด ๋์ํ๊ธฐ ์ ์ ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋๊ธฐ ๋๋ฌธ์ ์ํ๋๋๋ก ๋์ํ์ง ์์ต๋๋ค.
show && <Popup />
Framer-Motion
์์๋ ์ด๋ฅผ ์ํด AnimatePresence
์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
<AnimatePresence>
{show && <Popup />}
</AnimatePresence>
2๏ธโฃ ๋ณต์กํ ์ ๋๋ฉ์ด์ ๊ตฌํ์ ์ํ Variants
ํ๋์ ์ปดํฌ๋ํธ์์ ๋จ์ํ ์ ๋๋ฉ์ด์
์ ๊ตฌํํ ๊ฒฝ์ฐ์๋ animate
์์ฑ ํ๋๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํ ๊ฒ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์ ๋๋ฉ์ด์ ํธ๋ฆฌ๊ฑฐ๊ฐ ์ฌ๋ฌ ์ปดํฌ๋ํธ์ ์ ํ๋์ด ๋ณตํฉ์ ์ธ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ๊ตฌ์ฑํด์ผ ๋๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ํ ์ ์์๊น์?
์ด๋ฅผ ์ํด์ Framer-Motion
์ variants
๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
variants
๋ ๋ถ๋ชจ์ ์์ motion ์ปดํฌ๋ํธ๋ค๋ก ์ ํ(propagation) ๋๊ณ ,
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์๋ค์ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ ์ ํ๊ฒ ์กฐ์จ(orchestration)ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
variants
๋ฅผ ๋์ (dynamic)์ผ๋ก ์์ฑํ๊ณ ์ถ๋ค๋ฉด, custom
์์ฑ์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
const variants = {
visible: i => ({
opacity: 1,
transition: {
delay: i * 0.3,
},
}),
}
<motion.li
custom={i}
animate="visible"
variants={variants}
/>
๊ทธ๋ฆฌ๊ณ ํ๋์ motion
์์ ์ฌ๋ฌ๊ฐ์ variants
๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์ด๋ ๊ฐ variants
์์ ๊ฒน์น๋ ์ ๋๋ฉ์ด์
์์ฑ์ด ์กด์ฌํ๋ฉด, ๊ฐ์ฅ ๋ง์ง๋ง์ ์ ์๋ ๊ฒ์ผ๋ก ์ง์ ๋ฉ๋๋ค.
<motion.div variants={['open', 'primary']} />
3๏ธโฃ Layout Animation
width
, height
๋ฑ๋ฑ์ css layout ๊ด๋ จ ์ ๋๋ฉ์ด์
์ ์ฃผ์ ์ฑ๋ฅ์ ํ๋ฅผ ์ผ์ผํค๋ ์์์
๋๋ค.
Framer-Motion
์์๋ ์ด๋ฌํ layout ๊ด๋ จ ๊ฐ ๋ณ๊ฒฝ์ ์ถ์ ํ์ฌ
transform
๊ธฐ๋ฐ์ ์ ๋๋ฉ์ด์
์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ์ผ๋ฐ์ ์ธ ์ ๋๋ฉ์ด์ ๊ตฌํ์ ์ฌ์ฉ๋๋ ์์ฑ์ด ์๋๋๋ผ๋
์ํ๋ transition ์ด ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
(justify-content
๋ ํ์ฌ ์คํ์ transitionable ํ ์์ฑ์ด ์๋๋๋ค.)
์ด์ฒ๋ผ, layout ๊ณผ ๊ด๋ จ๋ ๋ณํ๊ฐ ์๊ธฐ๋ฉด re-render ๊ฐ ๋ฐ์ํ๋ฉด์ ์ ์ ํ ์ ๋๋ฉ์ด์ ํจ๊ณผ๊ฐ ์ํ๋ฉ๋๋ค.
๋ฌผ๋ก ์ํ๋ transition ์ผ๋ก ์ปค์คํ ๋ ๊ฐ๋ฅํฉ๋๋ค.
4๏ธโฃ Gesture Animation
Framer-Motion
์ React
์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ์ ์ธ ์ด๋ฒคํธ๋ฅผ ํ์ฅํ
hover, tap, pan, viewport, drag ๊ด๋ จ gesture detection system ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด๋ค์ ๋ชจ๋ motion
์ปดํฌ๋ํธ์ ํจ๊ป ์ฌ์ฉ๊ฐ๋ฅํ๋ฉฐ
whileHover, whileTap, whileDrag, whileInView
๋ฑ์ helper props ๋ค๋ก ์ ๊ณต๋ฉ๋๋ค.
์ด๋ค์ transition
prop ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ์ ์ํ๋ gesture ํจ๊ณผ๋ฅผ ๊ตฌํํ๋ฉฐ
๋๊ฐ ์ด์์ gesture ๊ฐ ํจ๊ป ๋์๋ ๊ฒฝ์ฐ ์ฐ์ ์์์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋ฉ๋๋ค.
motion
์ ์ด๋ค gesture ์ฌ์ด์์ ์์์ ์ฐ์ ์์์ ๋ฐ๋ฅธ interplay ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
5๏ธโฃ Draggable
Framer-Motion
์์๋ drag
gesture ์ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์ปดํฌ๋ํธ์ drag
๋ผ๋ ์์ฑ์ ๋ถ์ฌํด์ฃผ๋ฉด draggable
ํ๋๋ก ํ ์ ์์ต๋๋ค.
drag ๋ฒ์๋ฅผ ์ง์ ํ๊ธฐ์ํด px ๋จ์๋ก ์ง์ ํ๊ฑฐ๋ ๋์์ด ๋ ์ปดํฌ๋ํธ์ ref
๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
Reorder Group ์ child component ์ key ๋ฅผ ํตํด ์์น ๋ณํ๋ฅผ ์ถ์ ํ๊ณ ,
๋ณํ๋ ์์์ ๋ง๋ ์ํ๋ฅผ onReorder
prop ์ ํตํด ์
๋ฐ์ดํธํด์ค๋๋ค.
6๏ธโฃ Scroll linked & triggerd Animation
์ธํฐ๋ ํฐ๋ธ ์น์์๋ ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ํตํ ์ฌ๋ฌ transition ํจ๊ณผ๋ค์ ๊ตฌํํ๊ธฐ๋ ํฉ๋๋ค.
์ฌ๊ธฐ์๋ ์คํฌ๋กค ์ ๋์ ๋ฐ๋ผ ์๋จ progress bar ๋ฅผ ๋ ธ์ถํ๋ ๊ฐ๋จํ ์์์ฝ๋์ ๋๋ค.
7๏ธโฃ Motion Values
๋ชจ๋ motion
์ปดํฌ๋ํธ๋ ๋ด๋ถ์ ์ผ๋ก MotionValue
๋ฅผ ์ฌ์ฉํ์ฌ animation ์ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๋ ์ด ๊ฐ์ ์ง์ ๋ค๋ฃฐ ์ผ์ด ์์ง๋ง, ์ข ๋ ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ๊ธฐ ์ํด์
์ง์ ์ด ๊ฐ์ ์์ฑํด์ motion
์ปดํฌ๋ํธ์ ์ฃผ์
ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด animation state ๋ฅผ ์ค์ ํ๊ฑฐ๋ ์ฐธ์กฐํ์ฌ ๋ค๋ฅธ ์ฌ๋ฌ ์ปดํฌ๋ํธ์ motion ์ ๋๊ธฐํ์ํฌ ์ ์์ผ๋ฉฐ
react ์ render cycle ์ ๊ด๊ณ์์ด visual ์์ฑ์ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
Framer-Motion
์์๋ ์ด๋ฌํ Motion Value
๋ค์ ๋ค๋ฃจ๊ธฐ ์ํ ์ฌ๋ฌ react hook ๋ค์ ์ ๊ณตํด์ค๋๋ค.
useTransform, useSpring, useVelocity
๋ฑ์ผ๋ก ํน์ Motion Value
์ ๋ฐ๋ผ ๋ณํํ๋
์๋ก์ด Motion Value
๋ฅผ ์์ฑํ๊ฑฐ๋, useTime
์ผ๋ก ์ ๋๋ฉ์ด์
ํ๋ ์ ๋จ์์ ์์
์ ์ํํ ์๋ ์์ต๋๋ค.
์ด์ธ์๋ ์ฌ๋ฌ hook ๋ค์ด ์์ผ๋, ํ์์ ๋ฐ๋ผ ์ ์ ํ feature ๋ค์ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค์.
8๏ธโฃ Utilities
์ด์ธ์๋ Framer-Motion
์์๋ ์ฌ๋ฌ ์ธํฐ๋ ์
๊ตฌํ์ ์์ฃผ ์ฌ์ฉ๋๋
useAnimationFrame
, useInView
, useDragControls
๋ฑ์ ์ ์ฉํ custom hook ๋ค์ ์ ๊ณตํด์ค๋๋ค.
๋ณด๋ค ๋ณต์กํ ์ ๋๋ฉ์ด์ ๊ตฌํ์ด ํ์์ ํ ๊ฒฝ์ฐ์ ํ์ฉํ ์ ์์ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
๐ styled-component ์ ํจ๊ป ์ฌ์ฉํ๋๋ฒ
1๏ธโฃ styled-component ๋ฅผ animatable ํ๊ฒ ๋ฐ๊พธ๊ธฐ
styled-component ์ as
prop ์ ์ฌ์ฉํ์ฌ Motion
์ปดํฌ๋ํธ๋ก ๋ ๋๋งํฉ๋๋ค.
<MyComponent as={motion.div} animate={{ y: 100 }} />
2๏ธโฃ styled-component ๋ก ์ปค์คํ ํ Framer Motion ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
styled-component ์ ์คํ์ผ์ ํ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
const MyCustomComponent = styled(motion.div)`
width: 2rem;
background-color: tomato;
`;
Animate Styled Components with Framer Motion!
Animate Styled Components with Framer Motion!
I love Framer Motion because it's a library that's easy to use and powerful. I've created page transi...
dev.to
๐ ๋ฒ๋ค์ฌ์ด์ฆ ์ต์ ํํ๊ธฐ
Framer-Motion
์ ์จ์ ํ ์ฌ์ฉํ ๊ฒฝ์ฐ 50kb
์ด์์ ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ๊ฐ์ง๋ ํจํค์ง์
๋๋ค.
๋์ rollup ์ด๋ webpack ๊ณผ ๊ฐ์ ๋ฒ๋ค๋ง ํด์ ์ฌ์ฉํ๋ค๋ฉด, tree-shaking ์ ์ง์ํ๊ธฐ ๋๋ฌธ์,
ํ์ํ ์ปดํฌ๋ํธ๋ง ๋ถ๋ฌ์ ์ฌ์ฉํ๋ฉด ์ฌ์ด์ง๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
์ด ํจํค์ง์ ๊ฐ์ฅ ํต์ฌ์ด ๋๋ motion
์ปดํฌ๋ํธ๋ฅผ ํฌํจํ ๊ฒฝ์ฐ 29kb
๋ฏธ๋ง์ผ๋ก๋ ์ต์ ํ๊ฐ ๋ถ๊ฐ๋ฅํ์ง๋ง,
๋ง์ฝ motion
์ปดํฌ๋ํธ์ ๋ค๋ฅด๊ฒ ๋ชจ๋ ์ ๋๋ฉ์ด์
๊ธฐ๋ฅ๋ค์ preload ํ์ง ์๋ m
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด
์ด๊ธฐ ๋ ๋๋ง ์ ํ์ํ ํจํค์ง ์ฌ์ด์ฆ๋ฅผ 4.9kb
๊น์ง ์ค์ผ ์ ์์ต๋๋ค.
(๋์ ์ดํ์ ์ฌ์ฉํ๋ ค๋ ์ ๋๋ฉ์ด์ feature ์ ๋ฐ๋ผ ๋ก๋ํ๋ ํจํค์ง ์ฌ์ด์ฆ๊ฐ ๋ฌ๋ผ์ง๊ฒ ์ฃ )
LazyMotion
& m
์ผ๋ก ๋ฒ๋ค ์ฌ์ด์ฆ ์ต์ ํํ๊ธฐ
์์ ๋งํ๋ฏ์ด, motion
์ ๋ชจ๋ ์ ๋๋ฉ์ด์
feature ๋ฅผ preload ํฉ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ์ง ์๋ ๊ฒ๋ค๊น์ง ํฌํจํด์ ๋ถ๋ฌ์ค๊ฒ๋ฉ๋๋ค.
๋์ ์ LazyMotion
์ ํตํด์ ํ์ํ feature ๋ฅผ ๋ด์ animation set ์ ๋ก๋ํ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
<LazyMotion features={domAnimation}>
{children}
</LazyMotion>
์ฌ๊ธฐ์ ์ฌ์ฉ๊ฐ๋ฅํ animation set ์ ํ์ฌ ๋ค์ ๋๊ฐ์ง ์ ๋๋ค.
์ด๋ถ๋ถ์ ์ถํ์ ๋ฒ์ ์ ๊ทธ๋ ์ด๋์ ๋ฐ๋ผ ๋ณด๋ค ์ธ๋ถํ๋ ๊ฐ๋ฅ์ฑ์ด ์์ด๋ณด์ด๋ค์.
(Framer-Motion
์ ๋ฉ์ธ feature ๋จ์๋ก ์ชผ๊ฐ์ง์ง ์์๊น์?)
- domAnimation : animations, variants, exit animations, tap/hover/focus gestures (+15kb)
- domMax : ๋ชจ๋ feature ํฌํจ (+25kb)
์ ์ํ ์ ์ LazyMotion
์ motion
๊ณผ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ, motion
์ preload ๋๋ฌธ์
LazyMotion
์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ด์ ์ด ์๊ธฐ ๋๋ฌธ์,
m
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ ์ ์๋ strict
์ต์
์ด ์์ต๋๋ค.
<LazyMotion strict features={domAnimation}>
<motion.div />
</LazyMotion>
LazyMotion
์ strict
์ค์ ์ ํ๊ณ motion
์ ๋ ๋๋งํ๋ ค๊ณ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์ LazyMotion
์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ strict
์ค์ ์ ๊ฐ์ ํ๋ ๊ฒ์ด
๋ฒ๋ค๋ง ์ฌ์ด์ฆ ์ต์ ํ๋ฅผ ์ํด ๋ ๋์ ๋ฐฉํฅ์ด๋ผ๊ณ ๋ณด์ด๋ค์.
๐ ๋ง๋ฌด๋ฆฌ
์ด ํจํค์ง๋ฅผ ์ฌ์ฉํด๋ณด๋ฉฐ ๋๋ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- declarative animation code
- ์ ๋๋ฉ์ด์ ๊ด๋ จ์ฝ๋๋ฅผ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. (๊ด์ฌ์ฌ ๋ถ๋ฆฌ)
- ๊ฐ๊ฒฐํ๊ณ ๋ช
ํํ Rich API
- ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ ๋ณด๋ค ์ฝ๊ฒ ๊ตฌํํ ์ ์์ด๋ณด์ ๋๋ค.
- ๊ตฌํํ๊ธฐ ๊น๋ค๋ก์ด physics ๊ธฐ๋ฐ์ ์ฌ์ค์ ์ธ transition ํจ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์น์ ํ ๋ฌธ์์ ์ง์์ ์ธ ์
๋ฐ์ดํธ
- ์ต๊ทผ PR ๋ค์ ๋ณด๋ฉด animation timeline ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ด ๊ฐ๋ฐ์ค์ธ ๊ฒ ๊ฐ์ต๋๋ค.
- ๋์์ธ ํด์ธ
Framer
์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋์์ด๋์์ ํ์ ์ ์ข ๋ ๋์์ด ๋์ง ์์๊น?- ๋์์ธ๊ณผ ํ๋ก๋์ ๊ณผ์ ๊ฐ๊ทน์ด ์ข๋ ์์ฝ๊ฒ ์ขํ์ง ์ ์๋ ์ข์ ๋๊ตฌ๊ฐ ๋ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค๋ง ์ ์ํ ์ฌํญ๋ ๋ช๊ฐ์ง ์์ต๋๋ค.
- ์ฐ์ ์ฉ๋์ด ํฐ ํธ์ด๋ค.
- ๋์ ํ์ํ๊ฒ๋ง ๊ฐ์ ธ๋ค ์ฐ๋ฉฐ tree-shaking ๋ ์ง์ํ๊ธฐ์ ์ด๋์ ๋ ๋ณด์ ๊ฐ๋ฅํ ๋ฏํฉ๋๋ค.
- ๊ทธ๋ ๊ธฐ์ ๊ฐ๋ณ๊ณ ๋จ์ํ ์ ๋๋ฉ์ด์
์ ๊ตฌํํ๊ณ ์ ํ๋ ๊ฒ์ด๋ผ๋ฉด ๊ตณ์ด,,?
- ๊ทผ๋ฐ ์ฑ ๋ด์ ๋ง์ ์ ๋๋ฉ์ด์ ์ด ์๋ค๋ฉด, ์ด๊ฑธ๋ก ๊ด๋ฆฌํ๋ ๊ฒ๋ ์ ์ง๋ณด์์ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
- ํด๋น ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณ๋๋ก ์ตํ์ผํฉ๋๋ค.
- ๊ทผ๋ฐ ์ฌ์ฉ๋ฒ์ด ์ด๋ ค์ด ๊ฒ์ ์๋๋ผ์ ํฐ ๋จ์ ์ผ๋ก ๋ณด์ด์ง๋ ์์ต๋๋ค.
- ์คํ๋ ค ํต์ผ๋ ์ฝ๋๋ก ์ ์ง๋ณด์์ ๋์์ด ๋์ง ์์๊น์?
- ์์ฒด ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ์ ๊ณตํ๋ ์ธ๋ถ ์ปดํฌ๋ํธ (chart, drag&drop ๋ฑ) ์์ ํธํ์ฑ์?
- ํ์ํ๋ค๋ฉด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์๋์ง ์ฐพ๊ณ , ๊ทธ๋ด๋งํ ๊ฐ์น๊ฐ ์๋์ง ์๊ฐํด๋ณผ ํ์๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
- ๋ค๋ง ์ด๋ฏธ ์์ฒด์ ์ธ ๋ฐฉ์์ผ๋ก ์ ๊ณตํ๋ค๋ฉด, ๊ตณ์ด ํด๋น ์ปดํฌ๋ํธ์๋ ์ ์ฉํ ํ์๋ ์์ด ๋ณด์ด๋ค์.
- SSR ์ ์ง์ํ์ง ์๋ ์ผ๋ถ SVG ์ปดํฌ๋ํธ๋ค์ด ์์ต๋๋ค.
- ํด๋น svg ์ปดํฌ๋ํธ๋ฅผ ์ง์ ์ฌ์ฉํ ์ผ์ด ์๋ค๋ฉด ๋น๋ถ๊ฐ ํฐ ๋ฌธ์ ๋ ์๋๋ฏ ํฉ๋๋ค.
์ง์์ ์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ ๋ฐ์ ํ๊ณ ์๋ ํจํค์ง์ธ๋งํผ, ๊ฐ๋ฐ ์์ฐ์ฑ์ ์ํด ๋์ฌ๊ฒจ ๋ณผ๋งํ์ง ์์๊น์?
์ฐ์ ์ผ๋ถ ํ๋ก์ ํธ์ ์คํ์ ์ผ๋ก ๋์ ํด๋ด๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ๋ฌ๋ถ๋ค์ ์๊ฒฌ์ด ๊ถ๊ธํ๋ค์!
'๐จโ๐ป web.dev > fe' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Storybook loaders ๋ก story์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฃผ์ ํ๊ธฐ (0) | 2023.06.24 |
---|---|
Storybook ์์ ์ปดํฌ๋ํธ ๋จ์ ํ ์คํธํ๊ธฐ (0) | 2023.06.24 |
ํ๋ก ํธ์๋ E2E ํ ์คํ (with Cypress) (2) | 2023.03.19 |
Next.js styled-component ์ค์ ํ๊ธฐ (SSR FOUC ์ด์) (0) | 2022.11.27 |
AWS SDK ๋ก s3 ํ์ผ ์ฌ์ด์ฆ ์กฐํํ๊ธฐ (0) | 2022.11.26 |
๐ฌ ๋๊ธ