Script Sample/slider effect

sliderEffect08 - 무한, 버튼 추가, 닷 버튼 추가, 자동플레이, 시작버튼, 정지버튼

초짜코딩 2022. 4. 13. 16:56

const sliderWrap = document.querySelector(".slider__wrap");
const sliderImg = document.querySelector(".slider__img"); // 이미지 보이는 영역
const sliderInner = document.querySelector(".slider__inner"); // 이미지 움직이는 영역
const slider = document.querySelectorAll(".slider"); // 5개의 이미지
const sliderBtn = document.querySelector(".slider__btn") // 버튼
const sliderBtnPrev = sliderBtn.querySelector(".prev") // 왼쪽 버튼
const sliderBtnNext = sliderBtn.querySelector(".next") // 오른쪽 버튼
const sliderDot = document.querySelector(".slider__dot")  //닷 버튼

let currentIndex = 0;                       // 첫번째 이미지
let sliderWidth = sliderImg.offsetWidth;    // 이미지 가로값
let sliderLength = slider.length;  // 이미지 갯수
let sliderFirst = slider[0];    // 첫번째 이미지
let sliderLast = slider[sliderLength-1];    // 마지막 이미지
let cloneFirst = sliderFirst.cloneNode(true);   // 첫번째 이미지 복사
let cloneLast = sliderLast.cloneNode(true);     // 마지막 이지미 복사
let posInitial ="";
let dotIndex = "";
let sliderTimer = "";
let interval = 3000;


// 이미지 복사 (제이쿼리: appendTo/prependTo : append/prepend)
sliderInner.appendChild(cloneFirst); 
sliderInner.insertBefore(cloneLast, sliderFirst); 

// 이미지 움직이기
function gotoslider(index){
    sliderInner.classList.add("transition");
    // 1 2 3 4 5
    sliderInner.style.left = -sliderWidth * (index+1) + "px";
    console.log(currentIndex);
    currentIndex = index;
    // 두번째 이미지 : left : -1600
    // 세번째 이미지 : left : -2400
    // 네번째 이미지 : left : -3200
    // 다섯번째 이미지 : left : -4000
};

//이미지 갯수만큼 dot을 추가
function dotInit(){
    for(let i=0; i<<<sliderLength; i++){
        dotIndex += "<<<a href='#' class='dot'><<</a>"
    }
    dotIndex += "<<a href='#' class='play'>play<</a>"
    dotIndex += "<a href='#' class='stop show'>stop</a>"
    sliderDot.innerHTML = dotIndex;
    sliderDot.firstElementChild.classList.add("active");
}
dotInit();


// 자동플레이
function autoPlay(){
    sliderTimer = setInterval(()=>{
        gotoslider(currentIndex + 1);
    }, interval);
};
autoPlay();

// 자동플레이 멈춤
function stopPlay(){
    clearInterval(sliderTimer);
};

    // 왼쪽 버튼
sliderBtnPrev.addEventListener("click", ()=>{
    let prevIndex = currentIndex - 1;
    gotoslider(prevIndex);
});

    // 오른쪽 버튼
sliderBtnNext.addEventListener("click", ()=>{
    let prevIndex = currentIndex + 1;
    gotoslider(prevIndex);
});

// 애니메이션 종료 후
sliderInner.addEventListener("transitionend", ()=>{
    sliderInner.classList.remove("transition");
    // 이미지 시작 부분
    if(currentIndex == -1){
        sliderInner.style.left = -(sliderLength * sliderWidth) + "px"
        currentIndex = sliderLength - 1;
    }
    // 이미지 마지막 부분
    if(currentIndex == sliderLength){
        sliderInner.style.left = -(1 * sliderWidth) + "px"
        currentIndex = 0;
    }
});

// 마우스가 이미지에 올라가면
sliderInner.addEventListener("mouseenter", ()=>{
    stopPlay();
})
// 마우스가 이미지에서 떨어지면
sliderInner.addEventListener("mouseleave", ()=>{
    autoPlay();
})

sliderInner.addEventListener("mouseleave", () => {
    if(document.querySelector(".play").classList.contains("show")){
        stopPlay();
    } else {
        autoPlay();
    }
})

// 플레이 버튼을 눌렀을 때
document.querySelector(".play").addEventListener("click",()=>{
    document.querySelector(".play").classList.remove("show");
    document.querySelector(".stop").classList.add("show")
    autoPlay();
});

// 정지 버튼을 눌렀을 때
document.querySelector(".stop").addEventListener("click",()=>{
    document.querySelector(".play").classList.add("show");
    document.querySelector(".stop").classList.remove("show")
    stopPlay();
});