Next.js + TypeScript + styled-components 환경에서 위와 같은 텍스트 슬라이드업 캐러셀을 구현해보자!
[components/Home/HomeAnimation.tsx]
import { useState, useEffect, useRef } from 'react';
import {
...
CarouselContainer,
CarouselRotator,
CarouselRotatorItem,
} from './HomeAnimation.styled';
export default function HomeAnimation() {
const [count, setCount] = useState(0);
const intervalRef: { current: NodeJS.Timeout | null } = useRef(null);
useEffect(() => {
intervalRef.current = setInterval(() => {
setCount((prev) => prev + 1);
}, 2500);
return () => clearInterval(intervalRef.current as NodeJS.Timeout);
}, []);
return (
<>
...
<CarouselContainer>
<span>IT Community</span>
<span>for</span>
<CarouselRotator>
{count % 3 === 0 && <CarouselRotatorItem>Hustler</CarouselRotatorItem>}
{count % 3 === 1 && <CarouselRotatorItem>Hacker</CarouselRotatorItem>}
{count % 3 === 2 && <CarouselRotatorItem>Hipster</CarouselRotatorItem>}
</CarouselRotator>
</CarouselContainer>
...
</>
);
}
setInterval로 일정 시간마다 count 값을 증가시켜 컴포넌트를 교체하는데, useRef의 current 속성에 값을 저장하고 useEffect로 초기화해 랜더링마다 값이 중첩되지 않도록 해줘야 한다! (타입 지정은 구글링으로 해결)
[components/Home/HomeAnimation.styled.tsx]
import styled, { keyframes } from 'styled-components';
...
export const CarouselContainer = styled.div`
display: inline-flex;
align-items: center;
...
`;
const slideUp = keyframes`
0% {
transform: translateY(100%);
}
100% {
transform: translateY(0);
}
`;
export const CarouselRotator = styled.div`
border-bottom: solid 3.5px ${(props) => props.theme.color.secondary};
display: inline-block;
margin: auto;
overflow: hidden;
...
`;
export const CarouselRotatorItem = styled.div`
animation: ${slideUp} 1.5s;
`;
애니메이션은 keyframes를 활용해 CSS로 구현, display 속성과 태그들 간의 관계를 주의해주자!
Reference🔽
'Front-end > Next.js' 카테고리의 다른 글
[wanted] #1 자바스크립트의 발전은 어떻게 웹을 바꾸었는가 (0) | 2022.10.06 |
---|---|
[wanted] #0 CSR / SSR with Next.js 사전 과제 (0) | 2022.09.28 |
[TIL] react-animated-cursor 커서 디자인 (0) | 2022.06.04 |
[TIL] Next.js에서 SVG 이미지 사용하기 (0) | 2022.05.02 |
[TIL] Next.js & TypeScript & styled-components 초기 세팅 (0) | 2022.04.07 |