연습 페이지 링크 (https://sad-wing-00b0bb.netlify.app)
페이지 깃허브 (https://github.com/joohaem/prt-framer-motion)
공식 문서 (https://www.framer.com/docs/introduction/)
공식 깃허브 (https://github.com/framer/motion)
목차
.
├── Props
│ ├── initial
│ ├── animate
│ ├── transition
│ ├── variants
│ ├── custom
│ ├── style
│ ├── whielHover / whileTap
│ ├── drag / dragContraints
│ └── layout / layoutId
├── Motion Value
├── SVG path animation
└── AnimatePresence
Props
initial
초기 상태를 지정하는 props
animate
애니메이션 상태를 지정하는 props
transition
`bounce`(0.8) and `duration`(0.3) will be overridden if `stiffness`(100), `damping`(10) or `mass`(1) are set
- type `spring` by default (`tween` is no non-orchestration and `inertia` is for natural deceleration)
<motion.div
transition={{
default: { duration: 2 },
fill: { duration: 3, delay: 1 },
}}
/>
위처럼 속성별로 `duration` 값을 다르게 설정할 수 있다
variants
variants object를 만들고, property 이름을 지정해 작성하면,
motion은 이를 찾는다
const myVars = {
start: { scale: 0 },
end: { scale: 1, rotateZ: 360, transition: { type: "spring", delay: 0.5 } },
};
<Box variants={myVars} initial="start" animate="end" />
자식 컴포넌트들은 부모 컴포넌트의 `initial`과 `animate` 속성을 상속받는다
custom
요소의 `exit` 속성이나 `variants` 속성 등을 동적으로 정의할 수 있다, 이를 통해 제거되는 요소가 최신 데이터를 사용하여 애니메이션된다
const boxVariants = {
invisible: (isBack: boolean) => {
return {
x: isBack ? -500 : 500,
opacity: 0,
scale: 0,
};
},
};
<AnimatePresence custom={isBack}>
<StBox
custom={isBack}
variants={boxVariants}
initial="invisible"
animate="visible"
exit="exit"
/>
</AnimatePresence>
style
`x`, `y`, `scale`, `heigth`, `backgroundColor` 등 css value
whielHover / whileTap
이외에 `whileFocus`, `whileDrag`, `whileInView` 등의 속성이 있다
drag / dragContraints / dragElastic(0.5)
`drag="x"`, `drag="y"` 로 축을 제한할 수 있다
<motion.div
dragContraints={{ top: 0, right: 0, bottom: 0, left: 0, }}
/>
// === dragSnapToOrigin 속성
위처럼 직접 박스를 만들거나, `useRef`를 사용하여 제한한다
layout / layoutId
- `layout` 속성을 추가하면, 컴포넌트가 layout이 바뀔 때 애니메이션이 자동으로 활성화된다
- 서로 다른 컴포넌트에 `layoutId` 속성값을 같은 값으로 주면, 둘을 연결(shared)되는 애니메이션이 자동으로 활성화된다
Motion Value
const x = useMotionValue(0);
// useTransform(motionValue, inputRange, outputRange[, options])
const scale = useTransform(x, [-800, 0, 800], [2, 1, 0.1]);
`useMotionValue(0)` 등의 hook은
MotionValue가 바뀌어도, React state로 살지 않기 때문에,
리렌더링 되지 않는다(without triggering React's render cycle)
SVG path animation
const StSvg = styled.svg`
width: 200px;
height: 200px;
stroke: #f53000;
stroke-width: 0.3;
`;
`svg`의 `SC` 설정으로 `stroke` 혹은 `stroke-width` 설정이 가능하다
const svgVariants = {
start: {
pathLength: 0,
fill: "rgba(255, 255, 255, 0)",
},
end1: {
pathLength: 1,
fill: "#F53000",
},
};
`pathLength`나 `fill` 속성의 애니메이션을 variants로 선언하여 아래 코드와 같이 지정한다
<StSvg viewBox="0 0 25 27" xmlns="http://www.w3.org/2000/svg">
<motion.path
variants={svgVariants}
initial="start"
animate="end1"
transition={{
default: { duration: 2 },
fill: { duration: 3, delay: 1 },
}}
d="M5.0416 10.4955H0.553223L5.73268 15.6277V12.053V10.4955H5.0416Z"
></motion.path>
</StSvg>
AnimatePresence
- `AnimatePresence`의 자식 요소가 React 트리에서 제거될 때 애니메이션을 제거할 수 있다. 즉, unmount를 요소에 알리고 애니메이션이 완료될 때까지 지연시킨다
- 자식 요소인 각 `motion` 컴포넌트들은 고유한 `key`값이 있어야, 트리에서 `AnimatePresence`가 컴포넌트의 존재를 추적할 수 있다
따라서, `key`값만을 활용하여 컴포넌트의 `exit` 애니메이션을 활성화할 수 있다
exitBeforeEnter
- `exitBeforeEnter` 속성이 `true`이면, `setTimeout()` 함수와 같이 exit 애니메이션이 모두 끝난 후에 새 컴포넌트가 rendering 된다
- `exitBeforeEnter` 속성이 `true`이면, `AnimatePresence` 의 자식 요소는 하나의 컴포넌트만 와야 한다
'Web.d' 카테고리의 다른 글
[React][Javascript] 뒤로 가기 막기 / 창 닫기 막기 / 새로고침 막기 (2) | 2022.03.02 |
---|---|
[React][비교] SWR vs React Query vs Recoil selector ? (0) | 2022.02.18 |
[React] map 함수에 key 값이 필요한 이유 (재조정; Reconciliation) (0) | 2022.02.02 |
[React][lodash/debounce] debounce 와 throttling 구현하기 (0) | 2022.01.16 |
[React][Context] Prop drilling 과 useContext (1/2) (0) | 2021.12.30 |