먼저 이미지 4개를 준비합니다. 사이즈는 비슷한게 좋아요.

저는 1280x485px로 작업하였어요.

 

슬라이드 구현되는 방법을 서술하자면,

prev, next 버튼을 누르면 4개의 이미지가 하나씩 X좌표 이동하는 거예요.

그리고 첫 이미지 때는 이전 이미지가 없기 때문에 prev 버튼이 비활성화 되고

마지막 이미지 때는 이후 이미지가 없기 때문에 next 버튼이 비활성화 됩니다.

 

추가로 css images 태그에 transition: transform 0.5s; 추가하여

좌우 이미지 슬라이드에 자연스러운 애니메이션 효과를 주었습니다.

 

 

HTML

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="style.css">
  <title>slider</title>
</head>
<body>
  <div class="container">
    <h1>SLIDER</h1>
    <div class="album">
      <div class="images">
        <img src="images/img-1.jpg" alt="">
        <img src="images/img-2.jpg" alt="">
        <img src="images/img-3.jpg" alt="">
        <img src="images/img-4.jpg" alt="">
      </div>
    </div>
    <button class="prev">prev</button>
    <button class="next">next</button>
  </div>  
  <script src="script.js"></script>
</body>
</html>

 

CSS

.container{width:1280px;margin: 0 auto;}

h1{text-align: center;}

.album{width: 1280px;height: 485px;overflow: hidden;}

.images{position: relative;display: flex;height: 485px; transition: transform 0.5s;}

img{width: 1280px;height: 485px;}

button, button:active, button:focus{width: 100px; height: 30px; border: none;color: white; background-color: teal; outline: none;}

button:hover{background-color: turquoise;}

button:disabled{background-color: gray;}

.prev{float: left;}

.next{float: right;}

 

JS

 

let curPos = 0; // 현재 보여주는 이미지의 인덱스 번호
let positionValue = 0; // 이미지 태그의 위치 값 지정할 변수
const IMAGE_WIDTH = 1280;

const prevBtn = document.querySelector(".prev");
const nextBtn = document.querySelector(".next");
const images = document.querySelector(".images");

// 다음 이미지로 이동하는 함수
function next(){
  // 현재 이미지가 마지막 이미지가 아닌 경우에만 이동 가능
  if(curPos < 3){
    prevBtn.removeAttribute('disabled'); // 이전 버튼 활성화
    positionValue -= IMAGE_WIDTH; // 다음 이미지 위치로 이동
    images.style.transform = `translateX(${positionValue}px)`; // 이미지 이동 애니메이션
    curPos += 1; // 현재 이미지 인덱스 증가
  }
  if(curPos === 3){
    nextBtn.setAttribute('disabled','true');
  }
}

// 이전 이미지로 이동하는 함수
function prev(){
  if(curPos > 0){
    nextBtn.removeAttribute('disabled'); // 다음 버튼 활성화
    positionValue += IMAGE_WIDTH; // 이전 이미지 위치로 이동
    images.style.transform = `translateX(${positionValue}px)`; // 이미지 이동 애니메이션
    curPos -= 1; // 현재 이미지 인덱스 감소
  }
  if(curPos === 0){
    prevBtn.setAttribute('disabled','true');
  }
}


function init(){
  prevBtn.setAttribute('disabled','true'); // 페이지 로드 시 이전 버튼 비활성화
  prevBtn.addEventListener("click", prev); // 이전 버튼에 클릭 이벤트 추가
  nextBtn.addEventListener("click", next); // 다음 버튼에 클릭 이벤트 추가
}

init(); // 초기화 함수 호출

 

반응형

+ Recent posts