GuidePage
GuideSlider컴포넌트
Slide컴포넌트
const GuideSlider = ({
...props
}: React.ComponentProps<'div'>): JSX.Element => {
const [slideIndex, setSlideIndex] = useState(0);
const maxLength = Object.keys(GUIDE_SLIDE_DATA).length;
const handleClickPrev = () => {
setSlideIndex(state => {
if (state - 1 < 0) {
return maxLength - 1;
} else {
return state - 1;
}
});
};
const handleClickNext = () => {
setSlideIndex(state => {
if (state + 1 >= maxLength) {
return 0;
} else {
return state + 1;
}
});
};
return (
<Slider {...props}>
{GUIDE_SLIDE_DATA.map(({ text, url }, index) => (
<Slide
key={text}
text={text}
imageUrl={url}
style={{ display: index === slideIndex ? 'flex' : 'none' }}
/>
))}
<Dots>
{Object.entries(GUIDE_SLIDE_DATA).map(([key, _], index) => (
<Dot key={key} active={index === slideIndex}></Dot>
))}
</Dots>
<ArrowIcons onClickPrev={handleClickPrev} onClickNext={handleClickNext} />
</Slider>
);
};
가이드 페이지 이미지 슬라이드 반응형 적용에서 애를 먹었다.
이미지 사이즈가 다 다르고, 텍스트가 2줄이 될 때 slide컨테이너의 높이가 변하는게 문제였다.
heigth가 auto일 시 자식들의 높이를 따라가기 때문이다.
flex-direction: column
, justify-content: space-between
를 설정해서 텍스트는 가장 위로, 이미지는 가장 아래로 정렬되도록 했다.const Slide = ({ text, imageUrl, ...props }: SlideProps): JSX.Element => {
return (
<Container {...props}>
<Title>{text}</Title>
<ImageContainer>
<StyledImg src={imageUrl} />
</ImageContainer>
</Container>
);
};
const Container = styled.div`
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
width: 70%;
height: 510px;
@media ${Common.media.md} {
width: 80%;
height: 450px;
}
@media ${Common.media.sm} {
width: 100%;
height: 300px;
}
...
`;
const ImageContainer = styled.div`
width: 100%;
height: 400px;
@media ${Common.media.sm} {
height: 250px;
}
...
`;