Lumpy Space Princess - Adventure Time

JAVASCRIPT

Slider Effect 06 - 이미지 슬라이드의 버튼과 닷메뉴에 대해서 알아보자

jongyung 2023. 4. 13. 22:13

“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90

설명:

버튼은 페이지의 왼쪽과 오른쪽에 있는 preview 와 next 버튼을 말하고, 닷메뉴는 페이지의 하단에 위치한 다섯 개의 동그란 메뉴를 말합니다.

 

각각의 버튼과 닷메뉴를 누르면, 이미지가 이동하면서 누른 순서와 방향대로 보여집니다.

 

body 의 main 과 script 로 나눠서 보여드리겠습니다.

body 의 main 

 <main id="main">
    <div class="slider__wrap">
        <div class="slider__img">
            <div class="slider__inner">
                <div class="slider s1"><img src="./img/sliderEffect02-min.jpg" alt="이미지6"></div>
                <div class="slider s2"><img src="./img/sliderEffect01-min.jpg" alt="이미지7"></div>
                <div class="slider s3"><img src="./img/sliderEffect03-min.jpg" alt="이미지8"></div>
                <div class="slider s4"><img src="./img/sliderEffect05-min.jpg" alt="이미지9"></div>
                <div class="slider s5"><img src="./img/sliderEffect04-min.jpg" alt="이미지10"></div>
            </div>
        </div>
        <div class="slider__btn">
            <a href="#" class="prev" title="이전이미지">prev</a>
            <a href="#" class="next" title="다음이미지">next</a>
        </div>
        <div class="slider__dot"></div>
    </div>
</main>

각 이미지에 class 를 부여해서 해당하는 순서의 닷메뉴를 누르면, 그 이미지가 보일 수 있도록 했습니다.

script 

//선택자
const sliderWrap = document.querySelector(".slider__wrap");
const sliderImg = sliderWrap.querySelector(".slider__img"); //보여지는 영역
const sliderInner = sliderWrap.querySelector(".slider__inner"); //움직이는 영역
const slider = sliderWrap.querySelectorAll(".slider"); //개별 이미지
const sliderDot = sliderWrap.querySelector(".slider__dot"); // 닷 메뉴
const sliderBtn = sliderWrap.querySelectorAll(".slider__btn a"); // 버튼

let currentIndex = 0; //현재 보이는 이미지, 첫 번째라서 0
let sliderCount = slider.length; //이미지 갯수
let sliderInterval = 2000; //이미지 변경되는 간격 시간
let sliderWidth = slider[0].offsetWidth; //이미지 가로값
let dotIndex = "";

function init(){
    // 이미지 갯수만큼 닷 메뉴 생성
    slider.forEach(() => dotIndex += "<a href='#' class='dot'>이미지</a>");
    sliderDot.innerHTML = dotIndex;

    // 첫 번째 닷 메뉴한테 활성화 표시
    sliderDot.firstChild.classList.add("active");
}
init();

// 이미지 이동
function gotoSlider(num){
    sliderInner.style.transition = "all 400ms";
    sliderInner.style.transform = "translateX("+ -sliderWidth * num +"px)";
    currentIndex = num;

    // 닷 메뉴 활성화
    let dotActive = document.querySelectorAll(".slider__dot .dot");
    dotActive.forEach((active) => active.classList.remove("active"));
    dotActive[num].classList.add("active");
}

// 버튼을 클릭했을 때 (addEventListener 를 다중이에 사용하려면 forEach 함수를 써서 사용함)
sliderBtn.forEach((btn, index) => {
    btn.addEventListener("click", () => {
        let prevIndex = (currentIndex+(sliderCount-1)) % sliderCount;
        let nextIndex = (currentIndex+1) % sliderCount; // 1 2 3 4 0 1 2 3 4 

        if(btn.classList.contains("prev")){
            gotoSlider(prevIndex);
        } else {
            gotoSlider(nextIndex);
        }
    });
});

// 닷메뉴 클릭했을 때 
const dotNodes = sliderDot.querySelectorAll(".dot");
    dotNodes.forEach((dot, index) => {
    dot.addEventListener("click", () => {
        gotoSlider(index);
    });
});

gotoSlider() 함수는 전달된 인덱스 값에 해당하는 슬라이더 이미지와 닷 메뉴를 활성화하는 함수입니다. 이 함수는 다음과 같은 동작을 수행합니다.

현재 보여지는 슬라이더 이미지와 닷 메뉴의 활성화 클래스를 제거합니다.
전달된 인덱스 값에 해당하는 슬라이더 이미지와 닷 메뉴를 활성화합니다.


슬라이더 이미지와 닷 메뉴를 이동할 위치를 계산하고, 해당 위치로 이동시킵니다.
현재 인덱스 값을 업데이트합니다.


다음은 gotoSlider() 함수의 구현 예시입니다.

function gotoSlider(index) {
  const activeSlider = sliderWrap.querySelector(".slider.active");
  const activeDot = sliderWrap.querySelector(".dot.active");
  activeSlider.classList.remove("active");
  activeDot.classList.remove("active");

  const newSlider = sliderWrap.querySelector(`.slider.s${index + 1}`);
  const newDot = sliderWrap.querySelector(`.dot.d${index + 1}`);
  newSlider.classList.add("active");
  newDot.classList.add("active");

  const offset = -sliderWidth * index;
  sliderInner.style.transform = `translateX(${offset}px)`;

  currentIndex = index;
}

이 함수를 사용하려면, 예를 들어 3번째 슬라이더를 보여주고 싶다면 다음과 같이 호출합니다.

gotoSlider(2); // 0번째부터 시작하므로 3번째 슬라이더의 인덱스는 2입니다.