1. emotion keyframes ์ฌ์ฉํ๊ธฐ
์ฐธ์กฐ์ฌ์ดํธ
https://www.npmjs.com/package/@emotion/react
https://emotion.sh/docs/keyframes
emotion/react ์์๋ keyframes๋ฅผ ํตํ์ฌ ๊ธฐ์กด CSS์์ ์ฌ์ฉํ์๋ ์ ๋๋ฉ์ด์ keyframe์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋จผ์ ์ค์น๋ฅผ ํฉ๋๋ค.
yarn add @emotion/react
๊ฐ๋จํ ์ฌ์ฉ๋ฒ ๋ฐ ๋ฐํ์์๋ฌ๊ฐ ๋๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
์์ฃผ ์ฌํํ floating ์ ๋๋ฉ์ด์ ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ keyframes๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
floating ์ ๋๋ฉ์ด์ ์ ๋ง๋ค๊ณ , ์คํ์ผ์ ๋ฃ์ด์ค๋๋ค.
๊ฐ๋จํ ์ธํ ๋ง์ผ๋ก ๊ธฐ์กด์ ์ฐ๋ CSS๋๋ก ์ฌ์ฉํ ์ ์์ผ๋ ์์ฃผ ํธํฉ๋๋ค.
๋ํ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ์ฌ๊ธฐ์ ๊ธฐ import ํด์ ์ธ ์ ์์ผ๋ ์์ฃผ ์ ์ฉํ๊ฒ ์ฌ์ฉ ๋ ๊บผ๋ผ ์๊ฐ๋ฉ๋๋ค.
import { css, keyframes } from '@emotion/react'
function Animation1() {
return (
<div>
<h2>emotion Animation</h2>
<div className="wrap">
<div className="box" css={boxStyle}></div>
</div>
</div>
)
}
const floating = keyframes`
0 {
transform: translateY(0);
}
50% {
transform: translateY(-15px);
}
100% {
transform: translateY(0);
}
`
const boxStyle = css`
width: 50px;
height: 50px;
border-radius: 100%;
background: #a951bf;
animation: ${floating} 2s ease infinite;
`
export default Animation1
2. gsap ์ฌ์ฉํ๊ธฐ
์ฐธ์กฐ์ฌ์ดํธ
https://www.npmjs.com/package/react-gsap
๊ตฌํํ๋ค ๋ณด๋ฉด ์ ๋๋ฉ์ด์ ๋ณด๋ค๋ ์ธํฐ๋ ์ ์ด ํ์ํ ๋๊ฐ ๋ง์ต๋๋ค.
gsap ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ gsap ์ react-gsap ๋ ๊ฐ์ง๋ฅผ ์ค์นํ๋๋ก ์๋ด๋์ด์์ต๋๋ค.
gsap๋ ๊ธฐ์กด javascript์์ ์ฐ๋ ๋ฐฉ๋ฒ๊ณผ ํฌ๊ฒ ๋ค๋ฅธ๊ฒ ์์์ต๋๋ค.
yarn add gsap
gsap๋ from, to ํค์๋๋ก ์์์ ๊ณผ ๋์ ์ ์ฐ๊ฒฐ ์ํฌ ์ ์์ต๋๋ค.
์๋๋ฉด ๋จ๋ ์ผ๋ก to๋ง ์ฌ์ฉํ์ฌ ๊ธฐ์กด css์์ ๋ณํ์ ์ค ์ ์์ต๋๋ค.
๊ธฐ์กด gsap ๋์๋ฐฉ์์ ๊ฐ์ฒด์ ์ง์ ์ ๊ทผํ์ฌ ์์ง์์ ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ์์๋ useRef๋ฅผ ์ฌ์ฉํ์ฌ,
๊ตฌํํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐ๋ ์ ์ ํ ๋ฒ๋ง ๋์ ํ๋ฉฐ, ๋ฐ๋ณต์ ์ฃผ๊ณ ์ถ๋ค๋ฉด repeat: -1 ์์ฑ์ ์ถ๊ฐํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
import gsap from 'gsap'
function Animation2() {
const boxRef = useRef(null);
useEffect(() => {
gsap.to(boxRef.current, 1, {transform: 'translateX(200px)', delay: .5, ease: 'ease'})
}, [])
return (
<div>
<h2>gsap Animation</h2>
<div className="wrap">
<div className="box" css={boxStyle} ref={boxRef}></div>
</div>
</div>
)
}
const boxStyle = css`
width: 50px;
height: 50px;
border-radius: 100%;
background: #bf5160;
`
export default Animation2
3. react-gsap ์ฌ์ฉํ๊ธฐ
์ฐธ์กฐ์ฌ์ดํธ
https://bitworking.github.io/react-gsap/src-components-timeline
gsap์ react-gsap์ ์ฌ์ฉ๋ฒ์ด ๊ฝค ๋ง์ด ๋ฌ๋ผ๊ณ ๋ณ๊ฐ๋ก ๊ตฌ๋ถ์ ํด๋ณด์์ต๋๋ค.
์ด๋ฒ์๋ timeline์ ์ฃผ์ด ๋ ๊ฐ์ง ๋์์ ์์ฐจ์ ์ผ๋ก ๋ถ๋ฌ์ค๋๋ก ํ๊ฒ ์ต๋๋ค.
1. opacity 0 -> 1
2. ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์
react-gsap๋ gsap์๋ ๋ฌ๋ฆฌ class ์ปดํฌ๋ํธ ํํ๋ก ์์ง์์ ์ฃผ๋ ค๋ ๊ฐ์ฒด๋ฅผ target์ผ๋ก ๋ณด๋ด์ ๊ตฌํ์ ํฉ๋๋ค.
์ดํ ๊ตฌํํ๋ ค๋ ๋ชจ์ ๋ค์ Tween์ ๋ด๊ณ TimeLine์ผ๋ก ๊ฐ์ธ์ฃผ๋ฉด ๋ฉ๋๋ค.
yarn add gsap react-gsap
import { Timeline, Tween } from 'react-gsap';
function Animation3() {
return (
<div>
<h2>react-gsap Animation</h2>
<div className="wrap">
<Timeline
target={<div className="box" css={boxStyle}></div>}
>
<Tween from={{ opacity: 0 }} to={{opacity: 1}} duration={1} />
<Tween to={{ x: '200px' }} />
</Timeline>
</div>
</div>
)
}
const boxStyle = css`
width: 50px;
height: 50px;
border-radius: 100%;
background: #bf5160;
opacity: 0;
`
export default Animation3
์ด๋ ๊ฒ ํ๋ฉด ์ ๋ง ์ฝ๊ฒ ๊ตฌ์ถ ํ ์ ์์ต๋๋ค.
๊ณต์ ์ฌ์ดํธ๋ฅผ ๋ณด์๋ฉด stop, pause ๋ฑ๋ฑ ๋ค์ํ ์ต์ ์ด ์์ต๋๋ค.
์ฌ๋ฌ๋ชจ๋ก ์ธํฐ๋ ์ ๊ตฌํํ์๋ ๋ถ๋ค์๊ฒ ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๐
'๊ฐ๋ฐ ๐พ > ReactJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด๊ฐ๋จ useContext + useReducer (0) | 2021.07.02 |
---|---|
React ์์ useRef ์ฌ์ฉํ๊ธฐ (0) | 2021.06.30 |
react draggable ๊ฐ๋จ ์ํ (0) | 2021.06.22 |
๋ฆฌ์กํธ์์ setInterval์ ์ฌ์ฉํ์ฌ ํ์ดํ ํจ๊ณผ ์ฃผ๊ธฐ (0) | 2021.06.18 |
React ์์ select ์ฌ์ฉํ๊ธฐ (6) | 2021.06.14 |