react로 이미지 슬라이드를 쉽게 구현하고자 한다.
✍🏻 기술스택 : React, tailwind.css
나의 경우 두가지 경우로 구현하였다.
1. animation을 이용하여 구현하기
작동 방식
보여주고 싶은 카드들의 배열을 만들고, 이를 복제하여 나타낸 뒤 번갈아 가며 보여주는 방식이다. 내가 만들고자 하는 컴포넌트들의 컨테이너를 배너라고 칭한다.
[원본 배너]
- 원본 배너와 복제 배너를 한 방향으로 이동시켜주는 애니메이션을 실행시킨다
- 원본 배너가 배너 너비만큼 이동하면, 복제 배너의 뒤로 이동시킨다.
- 원본 배너는 다시 배너 너비만큼 이동한다.
[복제 배너]
- 복제배너는 일정 방향으로 배너크기의 2배만큼 이동시켜주면 된다.
- 사용자는 마치 하나의 배너가 무한으로 렌더링되는 것처럼 보인다..
- 사실은 2개의 배너가 번갈아가면서 나오는 것이다.
그림으로 이해하기
- 노란색: 화면 영역(UI 영역)
- 보라색: 원본 배너
- 초록색: 복제 배너
① 초기 상태
✏️ 원본 기준 keyframes: 0%
화면 영역보다 긴 원본 배너를 위치시키고, 뒤에 복제 배너를 위치시킨다.
② 배너의 너비만큼 이동 (원본 + 복제배너)
✏️ 원본기준 keyframes: 0% to 50%
보라색 원본배너가 본인의 길이만큼 애니메이션을 작동시켜 이동한다. 이때, 당연히 복제배너는 뒤를 따라간다.
cf) 해당 상태를 보는 유저는 12345 1234 까지 보았다.
③ 원본을 복제 뒤로 이동
✏️ 원본 기준 keyframes: 50% to 50.1%
보라색 원본배너를 복제배너 뒤에 위치시킨다 (keyframes: 50% → keyframes: 50.01%, 찰나의 순간)
이후, 계속 이동방향으로 이동시키면 유저는 연속된 숫자를 보게 됨
④ 배너 너비만큼 이동
✏️ 원본기준 keyframes: 50.1% to 100%
배너 너비만큼 이동
복제배너는 처음 자리로 이동시키고(animation 속성) 1번부터 다시 실행 (infinite animation)
2. react-fast-marquee로 구현하기
밑의 참고 사이트의 공식 문서를 활용하여 구현하였다.
1) react-fast-marquee 설치하기
npm install react-fast-marquee --save
2) 사용하기
pauseOnHover 기능을 사용하여 hover되면 멈출 수 있게 하였다. useState에서 하나의 변수를 선언하여 호버했을 때가 이가 멈출 수 있게 하였다.
import Marquee from "react-fast-marquee";
const [isHovered, setIsHovered] = useState(false);
<div
onMouseOver={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
>
<Marquee pauseOnHover={isHovered}>
I can be a React component, multiple React components, or just some
text.
</Marquee>
</div>
그런데 내가 참고한 사이트에서 크기를 마음대로 맞추지 못해 만들어 커스텀 마이징한 것을 보았다. 가볍게 쓸려면 2번의 경우를 사용하여 코드 짠 시간을 절약할 수 있지만, 디테일하여 디자인을 맞춰 짜고 싶다면 1의 방법을 추천한다.
🤩결과 화면
위의 이미지들이 돌아가는 이미지 슬라이드가 1번 방법을 활용하여 구현한 경우이고, 아래의 경우가 2번을 활용하여 만든 것이다.