오늘은 위쪽으로 슬라이드가 넘어가는데, 3번째 효과와 다르게 연속적으로 움직일 수 있도록 작업해보겠습니다!

자바스크립트 슬라이드 효과

슬라이드 효과 5 

슬라이드 이펙트 중 이미지가 세로로, 위쪽으로 넘어가는 효과입니다.(연속적)

구조

<main id="main">
    <div class="slider__wrap">
        <div class="slider__img">
            <div class="slider__inner">
                <div class="slider s1"><img src="./img/sliderEffect04-min.jpg" alt="이미지1"></div>
                <div class="slider s2"><img src="./img/sliderEffect08-min.jpg" alt="이미지2"></div>
                <div class="slider s3"><img src="./img/sliderEffect03-min.jpg" alt="이미지3"></div>
                <div class="slider s4"><img src="./img/sliderEffect06-min.jpg" alt="이미지4"></div>
                <div class="slider s5"><img src="./img/sliderEffect10-min.jpg" alt="이미지5"></div>
            </div>
        </div>
    </div>
</main>
<!-- //main -->

스크립트_선택자 및 변수 설정하기

<script>
    // 선택자
    const sliderWrap = document.querySelector(".slider__wrap");
    const sliderImg = sliderWrap.querySelector(".slider__img");             // 보여지는 영역
    const sliderInner = sliderWrap.querySelector(".slider__inner");         // 움직이는 영역
    const slider = sliderWrap.querySelectorAll(".slider");                  // 개별 이미지

    let currentIndex = 0;                                                   // 현재 보이는 이미지
    let sliderCount = slider.length;                                        // 이미지 갯수
    let sliderInterval = 2000;                                              // 이미지 변경 간격 시간
    let sliderHeight = slider[0].clientHeight;                              // 이미지 세로값 구하기
    let sliderClone = sliderInner.firstElementChild.cloneNode(true);        // 첫 번째 이미지 복사
</script>

슬라이드 효과 4에서는 clientWidth값을 통해 이미지 가로값을 구했으니 이번엔 clientHeight를 통해 이미지의 세로값을 구해줍니다. 그리고 CSS 속성중에서도 display: flex; 속성을 없애줍니다.

 

스크립트_javascript

<script>
    // 복사한 첫 번째 이미지 마지막에 붙여넣기
    sliderInner.appendChild(sliderClone);

    function sliderEffect(){
        currentIndex++;

        sliderInner.style.transition = "all 0.6s";
        sliderInner.style.transform = `translateY(-${sliderHeight * currentIndex}px)`;

        // 마지막 이미지에 위치했을 때 
        if(currentIndex == sliderCount){
            setTimeout(() => {
                sliderInner.style.transition = "0s";
                sliderInner.style.transform = `translateY(0px)`;
            }, 700);
            currentIndex = 0;
        }
    };

    setInterval(sliderEffect, sliderInterval);
</script>

-sliderInner 변수에 있는 DOM 요소에 sliderClone 변수에 저장된 첫 번째 이미지를 복사하여 마지막 자식으로 추가합니다. 이를 통해 슬라이딩이 끝난 후 첫 번째 이미지가 다시 나타나 슬라이딩 효과가 연속적으로 발생할 수 있습니다.

-sliderEffect 함수를 정의합니다. 이 함수는 currentIndex 변수를 증가시킵니다.

-sliderInner 변수가 참조하는 DOM 요소의 스타일 속성 중 transition 속성과 transform 속성을 변경하여 슬라이딩 효과를 생성합니다. transition 속성은 0.6초 동안 적용되도록 설정되어 있습니다. transform 속성은 translateY 함수를 이용해 현재 이미지의 높이(sliderHeight)와 currentIndex 값을 곱한 만큼 요소를 위로 이동시킵니다.

-if문에서는 currentIndex가 sliderCount(이미지 갯수)와 같아지면 마지막 이미지에 위치했음을 의미합니다. 이 경우 sliderInner 변수가 참조하는 DOM 요소의 스타일 속성을 변경하여 다시 처음 위치로 이동시킵니다. 이 때 setTimeout 함수를 사용해 0.7초 후에 위치를 변경합니다. 이유는 transition 속성을 0초로 변경한 뒤 바로 위치를 변경하면 이동 효과가 적용되지 않아 이동 효과가 끝날 때까지 대기하기 위함입니다.

-currentIndex가 0으로 초기화되고, setInterval 함수를 이용해 일정 시간(sliderInterval)마다 sliderEffect 함수를 실행시키면서 슬라이딩 효과를 반복합니다.

스크립트_GSAP

<!-- GSAP -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
<script>
    sliderInner.appendChild(sliderClone);

    function sliderEffect(){
        currentIndex++;

        gsap.to(sliderInner, {
            y: -sliderHeight * currentIndex,
            duration: 0.6
        });

        // 마지막 이미지에 위치했을 때 
        if(currentIndex == sliderCount){
            setTimeout(() => {
                gsap.to(sliderInner, {
                    y: 0,
                    duration: 0
                });
            }, 700);
            currentIndex = 0;
        }
    };

    setInterval(sliderEffect, sliderInterval);
</script>

-sliderInner 변수에 있는 DOM 요소에 sliderClone 변수에 저장된 첫 번째 이미지를 복사하여 마지막 자식으로 추가합니다. 이를 통해 슬라이딩이 끝난 후 첫 번째 이미지가 다시 나타나 슬라이딩 효과가 연속적으로 발생할 수 있습니다.

-sliderEffect 함수를 정의합니다. 이 함수는 currentIndex 변수를 증가시킵니다.

-gsap.to 함수를 이용해 sliderInner 변수가 참조하는 DOM 요소의 위치를 변경하여 슬라이딩 효과를 생성합니다. 이 때 duration 속성을 0.6초로 설정하며, y 속성을 이용해 현재 이미지의 높이(sliderHeight)와 currentIndex 값을 곱한 만큼 요소를 위로 이동시킵니다.

-if문에서는 currentIndex가 sliderCount(이미지 갯수)와 같아지면 마지막 이미지에 위치했음을 의미합니다. 이 경우 setTimeout 함수를 사용해 0.7초 후에 위치를 변경합니다. 이 때 gsap.to 함수를 이용해 y 속성을 이용해 요소를 0px 위치로 이동시킵니다. 이동 효과는 duration 속성이 0이므로 적용되지 않습니다.

-currentIndex가 0으로 초기화되고, setInterval 함수를 이용해 일정 시간(sliderInterval)마다 sliderEffect 함수를 실행시키면서 슬라이딩 효과를 반복합니다.

스크립트_jQuery

<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"></script>
<script>

    sliderInner.append(sliderClone);

    function sliderEffect(){
        currentIndex++;

        $(".slider__inner").css({
            'transition': 'all 0.6s',
            'transform': `translateY(-${sliderHeight * currentIndex}px)`
        });

        if(currentIndex == sliderCount){
            setTimeout(() => {
                $(".slider__inner").css({
                    'transition': '0s',
                    'transform': 'translateY(0px)'
                });
            }, 700);
            currentIndex = 0;
        }
    };

    setInterval(sliderEffect, sliderInterval);
</script>

-코드를 자세히 살펴보면, HTML 구조에서 이미지 슬라이더를 담고 있는 .slider__wrap 요소와 이미지를 담고 있는 .slider__inner 요소, 그리고 개별 이미지를 담고 있는 .slider 요소를 선택하고 있습니다.

-sliderInner.append(sliderClone); 코드는 첫 번째 이미지를 복제하여 마지막 이미지 다음에 추가합니다.

-sliderEffect 함수는 setInterval 함수에 의해 일정 시간 간격으로 호출됩니다. 함수 내부에서는 현재 인덱스를 증가시키고, $(".slider__inner").css를 사용하여 슬라이더를 이동시키는 애니메이션 효과를 적용합니다.

-마지막 이미지에 위치했을 경우, setTimeout 함수를 사용하여 0.7초 후에 첫 번째 이미지로 다시 돌아가게끔 처리하고 있습니다.

-이 코드에서 사용된 jQuery는 HTML 문서의 요소들을 쉽게 선택하고 조작할 수 있는 라이브러리입니다. jQuery UI는 jQuery를 기반으로 한 UI 컴포넌트 라이브러리로, 사용자 인터페이스 요소들을 손쉽게 제작할 수 있도록 도와줍니다.


728x90
반응형
다쭐◠‿◠