import {motion} from "framer-motion"
간단한 애니메이션의 경우 animate props에서 직접 값을 설정할 수 있다.
<Box
initial={{ scale: 0 }}
transition={{ type: "spring", delay: 1 }}
animate={{ scale: 1, rotateZ: 360 }}
/>
Variants는 코드를 깔끔하게, 여러 애니메이션을 하나로 묶어준다.
const myVars = {
start: { scale: 0 },
end: { scale: 1, rotateZ: 360, transition: { type: "spring", delay: 1 } },
};
function App() {
return (
<Wrapper>
<Box variants={myVars} initial="start" animate="end" />
</Wrapper>
);
}
initial과 animate state에는 오브젝트 내의 프로퍼티 이름을 써주면 된다.
만약 자식 컴포넌트가 있다면 default로 부모컴포넌트의 initial과 animate 속성이 자식들에게 전달된다.
import React from "react";
import styled from "styled-components";
import { motion } from "framer-motion";
const Wrapper = styled.div`
height: 100vh;
width: 100vw;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
`;
const Box = styled(motion.div)`
width: 200px;
height: 200px;
display: grid;
grid-template-columns: repeat(2, 1fr);
background-color: rgba(255, 255, 255, 0.2);
border-radius: 40px;
box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.06);
`;
const Circle = styled(motion.div)`
background-color: white;
height: 70px;
width: 70px;
place-self: center;
border-radius: 50%;
box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.06);
`;
// const myVars = {
// start: { scale: 0 },
// end: { scale: 1, rotateZ: 360, transition: { type: "spring", delay: 1 } },
// };
const boxVariants = {
start: { opacity: 0, scale: 0.5 },
end: {
opacity: 1,
scale: 1,
transition: {
type: "spring",
duration: 0.5,
bounce: 0.5,
delayChildren: 0.5,
staggerChildren: 0.2,
},
},
};
const circleVariants = {
start: {
opacity: 0,
y: 10,
},
end: {
opacity: 1,
y: 0,
},
};
function App() {
return (
<Wrapper>
<Box variants={boxVariants} initial="start" animate="end">
<Circle variants={circleVariants} />
<Circle variants={circleVariants} />
<Circle variants={circleVariants} />
<Circle variants={circleVariants} />
</Box>
</Wrapper>
);
}
export default App;
delayChildren과 staggerChildren을 사용하면 이런 애니메이션을 만들 수 있다.