What I did.
- 마케팅팀에서 자동 롤링 배너틑 포함한 후순위 담보 대출 페이지 제작을 요청하였습니다. 요청에 따라 Tailwind의
transition-transform
, transform
, duration
, ease-in-out
등 transition 클래스를 활용하여 재사용 가능한 자동 롤링 배너를 개발했습니다. - 해당 페이지 뿐만 아니라 다른 페이지에서도 사용할 수 있도록 별도의 component로 분리를 하였습니다. 코드 재사용을 가능하게 하여 개발 효율성을 증대시켰으며, transition css를 활용하여 자연스러운 전환 효과를 적용하였습니다.
- 또한, 기존 setInterval의 Web API 사용 시 cleanup 함수를 추가하여 메모리 누수를 보완하고,
translate
css로 옆으로 넘기는 듯한 모션을 추가하여 사용자 경험을 개선했습니다.
Before
* 예시 코드입니다.
// 이미지 두 개를 번갈아가며 보여줄 수 있도록 useState로 isActive flag 생성
const [isFirstImage, setIsFirstImage] = useState(true)
// setInterval로 1초마다 active 이미지 변경
useEffect(() => {
setInterval(() => {
setIsFirstImage(!isFirstImage)
}, 1000)
}, [])
...
// render 내부 코드
{
<BannerLayout>
(isFirstImage) ? {
<img src="/src/to/image1" alt="이미지 1" />
} : {
<img src="/src/to/image2" alt="이미지 2" />
}
</BannerLayout>
}
After
* 예시 코드입니다.
import cn from 'classnames'
// 이미지 두 개를 번갈아가며 보여줄 수 있도록 useState로 isActive flag 생성
const [isFirstImage, setIsFirstImage] = useState(true)
const ImageUrl = { url1: '/image/url/1', url2: 'image/url/1' }
useEffect(() => {
const intervalId = setInterval(() => {
setIsFirstImage(!isFirstImage);
}, 1000)
// cleanup 함수 추가
return () => clearInterval(intervalId);
}, [setIsFirstImage, isFirstImage])
// render 내부 코드
<AutoBanner isFirstImage={isFirstImage} ImageUrl={ImageUrl} />
// AutoBanner 컴포넌트 내부 코드
<BannerLayout>
<img
className={cn(
'transition-transform transform duration-800 ease-in-out',
isFirstImage ? 'translate-x-0' : '-translate-x-full',
)}
src={ImageUrl.url1}
alt="이미지 1"
/>
<img
className={cn(
'transition-transform transform duration-800 ease-in-out',
!isFirstImage ? 'translate-x-0' : '-translate-x-full',
)}
src={ImageUrl.url2}
alt="이미지 2"
/>
</BannerLayout>