💡깨달음💡/Javascript

슬라이드 만들기(slick.js 만들어보기03)

과부하가즈아 2024. 4. 8. 15:44

🔴자동슬라이드 구현하기

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="jquery-1.12.4.js"></script>
    <link rel="stylesheet" href="style.css" />
    <title>Document</title>
  </head>
  <body>
    <div class="contanier">
      <div class="slide">
        <ul>
          <li>
            <img src="/images/01.jpg" />
          </li>
          <li>
            <img src="/images/02.jpg" />
          </li>
          <li>
            <img src="/images/03.jpg" />
          </li>
          <li>
            <img src="/images/04.jpg" />
          </li>
          <li>
            <img src="/images/05.jpg" />
          </li>
        </ul>
      </div>
      <div class="btn">
        <button class="prev"><</button>
        <button class="stop">STOP</button>
        <button class="play">GO</button>
        <button class="next">></button>
      </div>
    </div>
    <script src="custom.js"></script>
  </body>
</html>
body {
  margin: 0;
}
ul,
li {
  margin: 0;
  padding: 0;
  list-style: none;
}
img {
  width: 400px;
}
button {
  padding: 0;
}
/*  */
body {
  position: relative;
  height: 100vh;
}
.contanier {
  width: 1240px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.slide {
  width: 100%;
  height: 250px;
  overflow: hidden;
  position: relative;
}
ul {
  overflow: hidden;
  /* width: 2080px; */
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
}
ul.animated {
  transition: 0.5s;
}
li {
  float: left;
  margin-right: 20px;
}
li:last-child {
  margin-right: 0;
}
.btn {
  text-align: center;
  margin-top: 15px;
}
.btn > button {
  padding: 10px 15px;
  margin-left: -8px;
  width: 150px;
  border: 3px solid rgb(20, 98, 175);
  background-color: #fff;
  font-size: 18px;
  font-weight: 600;
}
.btn > button:hover {
  background-color: rgb(20, 98, 175);
  color: #fff;
}
.prev {
  margin-left: 0;
  border-radius: 10px 0 0 10px;
}
.next {
  border-radius: 0 10px 10px 0;
}

자동 슬라이드 함수 만들기

setInterval(function(){}, 시간): 시간마다 함수를 반복
function playSlide() {
  setInterval(function () {
    moveSlide(currentIdx + 1);
  }, 2000);
}
playSlide();

계속해서 시간마다 다음 슬라이드로 넘어가야 하므로  moveSlide(currentIdx + 1)을 수행해야 한다. 즉, 시간마다 nextBtn과 같은 동작을 진행하는 것이다.


정지 슬라이드 함수 만들기

clearInterval(): setInterval() 함수에 의해 설정된 반복된 작업을 중지시킬 때 사용
// B라는 함수작성
function B () {
  console.log("Hi");
}

// B가 1초마다 실행, 이 동작을 변수 A로 지정
let A = setInterval(B, 1000)

// A의 동작을 clearIntervla을 통해서 멈춤
clearInterval(A)​

 

 

정지를 위해 정지를 실행하면 playSlide안에 지정된 동작을 멈춰야 함 

function playSlide() {
  setInterval(function () {
    moveSlide(currentIdx + 1);
  }, 2000);
}
playSlide();

function stopSlide(){
  clearInterval()
}

stopSlide에 clearInterval()을 사용하고자 하는데 변수로 setInterval()한 동작을 넣어주어야 한다.


그래서 setInterval을 변수_intervalId로 지정을 해준다.

(playSlide내부에 let을 지정을 해버리면 playSlide안에서만 사용되므로 다음과 같이 전역으로 빼줌)

let intervalId; // 전역 변수

function playSlide() {
  intervalId = setInterval(function () {
    moveSlide(currentIdx + 1);
  }, 2000);
}
playSlide();

function stopSlide() {
  clearInterval(intervalId);
}

stopBtn.addEventListener("click", stopSlide);
playBtn.addEventListener("click", playSlide);

 

let intervalId = undefined;

function playSlide() {
  console.log(intervalId)  // undefined
  if (intervalId === undefined) {
    intervalId = setInterval(function () {
      moveSlide(currentIdx + 1);
    }, 2000);
    console.log(intervalId) // 2
  }
}
playSlide();

function stopSlide() {
  clearInterval(intervalId);
  console.log(intervalId) // 2
  intervalId = undefined;
  console.log(intervalId)  // undefined
}
stopBtn.addEventListener("click", stopSlide);
playBtn.addEventListener("click", playSlide);


🔴 STOP, GO변형

처음에 STOP만 있고 자동 슬라이드 되며, STOP를 누르면 GO로 버튼이 바뀌면서 슬라이드는 정지되고의 반복을 만들고 싶음

 

on이라는 class를 부여해서 on이 있다면 안보이도록 CSS 지정을 해준다.

      <div class="btn">
        <button class="prev"><</button>
        <button class="stop">STOP</button>
        <button class="play">GO</button>
        <button class="next">></button>
      </div>
.stop.on,
.play.on {
  display: none;
}

let intervalId = undefined;

// 자동재생함수
function playSlide() {
  if (intervalId === undefined) {
    intervalId = setInterval(function () {
      moveSlide(currentIdx + 1);
    }, 2000);
  }
  playBtn.classList.add("on")
  stopBtn.classList.remove("on")
}
playSlide();

// 정지함수
function stopSlide() {
  clearInterval(intervalId);
  intervalId = undefined;
  stopBtn.classList.add("on")
  playBtn.classList.remove("on")
}

stopBtn.addEventListener("click", stopSlide);
playBtn.addEventListener("click", playSlide);

자동으로 재생되는 playSlide()안에 playBtn에 먼저 on을 부여해서 playBtn이 안보이게 되고 stopBtn에서는 on을 제거해서 보이게 한다. 

 

그리고 정지를 누르면 stopBtn에 on을 부여해서 안보이게 하고 playBtn에 on을 제거해서 보이도록 해준다.