이 글은 애니메이션 효과나 옆으로 넘어가는 모션이 없는 동적 슬라이드를 구성하기 위한 코드입니다.
import ImageSlider0 from "./ImageSlider0.js";
const App0 = () => {
const slides = [
{url: './images/tea1.jpg', title:"pic1"},
{url: './images/tea2.jpg', title:"pic2"},
{url: './images/tea3.jpg', title:"pic3"},
{url: './images/tea4.jpg', title:"pic4"}
]
const containerStyles = {
width: '500px',
height: '280px',
margin: '0 auto',
}
return(
<div>
<h1>Hello monsterlessons</h1>
<div style={containerStyles}>
<ImageSlider0 slides={slides} />
</div>
</div>
);
}
export default App0;
단순히, 이미지 슬라이더 크기를 지정해주고, 가운데로 해주는 레이아웃입니다.
import { useState, useRef, useEffect, useCallback } from "react";
import styled from "styled-components";
const ImageSlider0 = ({ slides }) => {
const [imageIndex, setImageIndex] = useState(0);
const [currList, setCurrList] = useState()
const slidesLength = slides.length;
let timeoutId;
const goLeft = () => {
if (imageIndex === 0) {
setImageIndex(slidesLength - 1);
} else {
setImageIndex(imageIndex - 1);
}
resetTimeout();
};
const goRight = () => {
if (imageIndex === slidesLength - 1) {
setImageIndex(0);
} else {
setImageIndex(imageIndex + 1);
}
resetTimeout();
};
const resetTimeout = () => {
// 기존의 타임아웃을 지웁니다.
clearTimeout(timeoutId);
// 자동 슬라이드용 새로운 타임아웃을 설정합니다.
timeoutId = setTimeout(goRight, 3000);
};
useEffect(()=>{
timeoutId = setTimeout(goRight, 3000);
return () => clearTimeout(timeoutId);
}, [imageIndex])
let myList=slides
return (
<ImageBox>
<LeftBtn onClick={goLeft}><</LeftBtn>
<RightBtn onClick={goRight}>></RightBtn>
<ImageRoll currentIndex={imageIndex} length={slidesLength}>
{myList.map((slide)=>(
<Image key={slide.url} src={slide.url} alt={slide.title}/>
))
}
</ImageRoll>
</ImageBox>
);
};
export default ImageSlider0;
const ImageBox = styled.div`
background-color: pink;
width: 100%;
height: 100%;
position: relative;
overflow:hidden;
`;
const LeftBtn = styled.div`
position: absolute;
top: 50%;
left: 15px;
cursor: pointer;
font-size:35px;
font-weight:700;
transform:translate(0,-50%);
z-index: 5;
`;
const RightBtn = styled.div`
position: absolute;
top: 50%;
right: 15px;
cursor: pointer;
font-size:35px;
font-weight:700;
transform:translate(0,-50%);
z-index: 5;
`;
const ImageRoll = styled.div`
display: flex;
transform: translateX(${(props) => `-${props.currentIndex * 500}px`});
transition: transform ease-out 0.3s;
width: ${(props) => `${props.length * 500}px`};
height: 100%;
`;
const Image = styled.img`
width: 100%;
height:100%;
object-fit: cover;
`;
- https://velog.io/@pkook7/%EC%A0%95%EC%A0%81-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C-%EA%B5%AC%ED%98%84
기존에 있던 정적슬라이드와 같이 state를 활용하지만 애니메이션이 추가되었습니다.
- 동적 슬라이드는 옆으로 넘어가는 느낌이 있어야 했기 때문에 여러장의 사진을 이어붙여줬습니다.
- useEffect에 setTimeout을 넣어줘서, 3초마다 슬라이드가 넘어갈 수 있게 했습니다.
- 현재는 1,2,3,4 다음에 4,3,2,1로 돌아와서 다시 1부터 시작합니다.
- 원하는 기능은 1,2,3,4 다음에 자연스럽게 오른쪽으로 넘어가는 방향입니다. 해당 기능은 더 연구해보겠습니다.