블로그에 동적인 요소로 활기 불어넣기
들어가며
Next.js를 사용하여 성공적으로 블로그를 만들었다.(짝짝) 필요한 기능은 추후에 만들어야할 때 하나씩 추가하는걸로 생각했고, 배포도 성공적으로 하고나서 보니 블로그가 약간 심심해 보였다. 간단하게 라이브러리를 사용하여 동적인 요소를 추가해보고자 한다. 내가 어떻게 사용했는지 그리고 블로그에 적용했을 때 어떻게 나오는지 한번 알아보자.
타이핑 하는 효과
처음에 블로그에 들어오면 보이는 인사말이다. 지금도 좋지만 들어온 사람에게 실시간으로 인사하는 느낌을 주고싶어 타이핑 효과를 적용해보기로 했다.
타이핑 효과 관련 라이브러리
react-type-animation vs react-typed vs react-typing-animation vs react-typist | npm trends
npm trends로 비슷한 라이브러리들을 비교해봤다. 나는 react-type-animation 을 선택했는데 다운로드 수는 적지만 업데이트도 2달전으로 가장 빠르고 무엇보다 용량이 넷 중에는 가장 가벼웠다.
react-type-animation을 사용해보자
설치
npm install react-type-animation
사용
//components/IndexProfile.tsx
import { TypeAnimation } from 'react-type-animation';
const IndexProfile = () => {
return (
<TypeAnimation
sequence={['안녕하세요! 김영진입니다.', 1000, '', 500]}
speed={10}
repeat={Infinity}
wrapper="h1"
className="text-xl sm:text-3xl font-bold" //tailwind css
/>
);
};
- sequence: string과 number를 사용한 배열의 형태이다. string이 타이핑 되고 number동안 유지된다.
[ '안녕하세요! 김영진입니다.', //처음 타이핑 되는 텍스트 1000, //1초 동안 텍스트가 유지됨 '', //처음 타이핑 되는 텍스트가 지워지고 타이핑 되는 텍스트 500, //0.5초 동안 텍스트가 유지됨 ];
- speed: 타이핑 애니메이션의 속도. 낮을수록 느리다. 기본값은 40
- repeat: 반복 횟수이다. Infinity 값을 주면 계속 loop한다. 기본값은 0
- wrapper: html 태그로 감쌀 수 있다. 나는 h1으로 감싸는걸 선택했다. 기본값은 div 태그.
결과
참고사이트
꽃가루 효과
미모티콘을 넣었는데 귀엽긴 하지만 하나가 아쉬웠다. 블로그 메인 페이지에 들어왔을때 혹은 클릭했을때 꽃가루가 터지는 효과를 넣고싶었다.
react-rewards를 사용해보자
처음에 애니메이션 효과의 이름을 정확하게 몰라서 검색하는게 약간 애를 먹었다. fireworks
같은 키워드로 검색하다가 운좋게 confetti
라는 키워드를 얻어냈다. 그러다가 react-rewards
를 발견했는데 다른 라이브러리가 화면 전체에 꽃가루가 흩날리는 느낌이라면 이 라이브러리는 내가 생각하던 폭죽이 발사되는 느낌으로 제작되어있었다.
설치
npm install react-rewards
사용
//components/IndexProfile.tsx
import { useReward } from 'react-rewards';
const IndexProfile = () => {
const { reward, isAnimating } = useReward('rewardId', 'confetti', {
angle: 200, //꽃가루가 터질때 각도
position: 'absolute', //css position 설정 ('fixed'|'absolute')
startVelocity: 20, //꽃가루가 터지기 시작하는 속도
spread: 90, //꽃가루가 뿌려지는 각도
elementCount: 80, //꽃가루 갯수
lifetime: 150, //꽃가루 애니메이션되는 시간
});
//메인 페이지 첫 로딩시에도 꽃가루 효과를 내기 위해 useEffect를 사용하였다.
useEffect(() => {
reward();
}, []);
return (
<div
className="relative h-[120px] sm:h-[180px] cursor-pointer"
onClick={isAnimating ? undefined : reward} //연속 클릭 방지를 위해 애니메이션 중일땐 클릭을 막아놨다.
>
<Image src="/images/mimoji.png" fill alt="mimoji" />
<div className="absolute top-[100px] left-[-20px]">
{/* 위에서 설정한 id를 span태그의 id로 넣어준다. */}
<span id="rewardId" />
</div>
</div>
);
};
useReward
를import
하고 인자에 차례대로id
,넣을 효과
,옵션
을 넣어주면 된다.- 실행함수인
reward()
와 애니메이션 진행 상태를boolean
값으로 전달해주는isAnimating
을 비구조화 할당하여 사용하면 된다.