Animated Turtle

Javascript

슬라이드 효과 만들기(버튼, 닷 메뉴)

훙구 2023. 4. 13. 22:38

...

728x90
반응형

버튼을 눌렀을 때 넘어가는 슬라이드 효과 만들기

이번에는 버튼을 눌렀을 때 이미지가 좌 혹은 우로 넘어가도록 만들어보겠습니다.

 

HTML 작성하기

<main id="main">
    <div class="slider__wrap">
        <div class="slider__img">
            <div class="slider__inner">
                <div class="slider s1"><img src="img/sliderEffect06-min.jpg" alt="이미지6"></div>
                <div class="slider s2"><img src="img/sliderEffect07-min.jpg" alt="이미지7"></div>
                <div class="slider s3"><img src="img/sliderEffect08-min.jpg" alt="이미지8"></div>
                <div class="slider s4"><img src="img/sliderEffect09-min.jpg" alt="이미지9"></div>
                <div class="slider s5"><img src="img/sliderEffect10-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>

추가된 html 알아보기

  • 이미지의 기본틀을 동일합니다.
  • 이미지의 좌 우에 버튼을 만들기 위해 slider__btn의 부분을 만들어 주었습니다.
  • 페이지의 하단에 dot메뉴를 만들기 위해 slider__dot의 부분을 만들어 주고,
  • 스크립트를 통해 이미지의 개수와 동일하게 dot을 만들어 줄 것이기 때문에 html의 구조상에는 아무것도 넣지 않았습니다.

CSS 작성하기

.slider__btn a {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 50px;
    height: 50px;
    line-height: 50px;
    text-align: center;
    /* background-color: #fff; */
    color: #fff;
    transition: all 0.2s;
    font-weight: bold;
}
.slider__btn a:hover {
    border-radius: 50%;
    background-color: #000;
    color: #fff;
}
.slider__btn a.prev {
    left: 0;
}
.slider__btn a.next {
    right: 0;
}
.slider__dot {
    position: absolute;
    left: 50%;
    bottom: 40px;
    transform: translateX(-50%);
}
.slider__dot .dot {
    width: 15px;
    height: 15px;
    background-color: rgba(255, 255, 255, 0.4);
    display: inline-block;
    border-radius: 50%;
    text-indent: -9999px;
    transition: all 0.3s;
    margin: 5px;
}
.slider__dot .dot.active {
    background-color: #fff;
}

추가된 CSS 정리해보기

  • slider__btn과 slider__dot, 스크립트로 받아 오게 될 dot에 대한 스타일 속성을 추가하였습니다.
  • 현재 표시되고 있는 이미지의 index와 같은 dot의 색을 다르게 하기위해 active 클래스가 붙은 dot에 대한 속성도 미리 만들어 주었습니다.

Javasciprt 작성하기

// 선택자
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;                               // 현재 보이는 이미지
let sliderCount = slider.length;                    // 전체 이미지 개수
let sliderWidth = slider[0].clientWidth;            // 이미지 width값
let dotIndex = "";

let sliderInterval = 2000; 
// 복사한 첫 번째 이미지 마지막에 붙여넣기

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");
};

function btnClick(){
    let dotActive = document.querySelectorAll(".slider__dot .dot");
    dotActive.forEach((btn, index) => {
        btn.addEventListener("click", () => {
            gotoSlider(index);
        });
    });
};
btnClick();


// 버튼을 클릭했을 때
sliderBtn.forEach((btn, index) => {
    btn.addEventListener("click", () => {
        let prevIndex = (currentIndex + sliderCount-1) % sliderCount;
        let nextIndex = (currentIndex+1) % sliderCount;
        if(btn.classList.contains("prev")){     // class에 prev가 있는지 확인
            gotoSlider(prevIndex);
        } else {
            gotoSlider(nextIndex);
        };
    });
});

Javscript 정리해보기

  • 선택자 목록에 slider__dot과 slider__btn의 a태그를 선택하는 선택자 sliderDot과 sliderBtn을 추가했습니다.
  • dotIndex 변수를 만들었습니다.
  • init() 함수
  • slider에 forEach를 사용하여 slider에 있는 요소의 개수 만큼 반복합니다.
  • dotIndex에 "<a href='#' class='dot'>이미지</a>"의 내용을 추가해서 저장합니다. (slider 요소 개수만큼)
  • sliderDot에 innerHTML을 사용하여 dotIndex를 적어줍니다.
  • sliderDot의 첫 번째 요소의 classList에 "active"를 추가합니다.

 

  • gotoSlider(num) 함수
  • sliderInner의 변화에 대한 시간을 400ms로 설정합니다.
  • sliderInner를 X축으로 (-sliderWidth * num)px 만큼 움직입니다.
  • currentIndex에 num의 값을 저장합니다.
  • slider__dot에 만들어놓은 각각의 dot을 선택하는 dotActive를 만들어줍니다.
  • dotActive에 forEach를 사용하여 모든 요소에게서 "active" class를 제거합니다.
  • [num] 번째 dotActive의 classList에 "active"를 추가합니다.

 

  • btnClick() 함수
  • 다시 한번 dotActive를 만들어줍니다.
  • dotActive에 forEach를 사용하여 각 요소들에게 addEventListener를 통해 클릭 했을 때,
  • gotoSlider함수의 매개변수로 각 dot들의 index를 보내며 실행합니다.

 

  • sliderBtn( prev, next )에 forEach를 사용합니다.
  • prevIndex 변수를 만들어 (currentIndex + (sliderCount-1)) % sliderCount의 값을 저장합니다.
  • (4 3 2 1 0 4 3 2 1 0 4 3 2 1 ...을 만듦)
  • nextIndex 변수를 만들어 (currentIndex + 1) % sliderCount의 값을 저장합니다.
  • if(btn(sliderBtn의 요소).classList.contains("prev") 를 통해 클릭 된 요소의 class에 prev가 있는지 확인합니다.
  • {gotoSlider(prevIndex)} 참일 때, (classList에 "prev"가 있을 때 = prev 버튼을 눌렀을 때)
  • else { gotoSlider(nextIndex)} 거짓일 때 (classList에 "prev"가 없을 때 = next 버튼을 눌렀을 때)

 

 

 

이상으로 닷 메뉴가 있는 버튼 형식의 슬라이드 효과를 만들어 보았습니다 !

728x90
반응형