Winnie The Pooh Bear 슬라이드 이펙트 - 좌로 움직이기(연속적)

배움기록/JAVASCRIPT

슬라이드 이펙트 - 좌로 움직이기(연속적)

코딩은 처음이라 2023. 4. 11. 15:15

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

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90
반응형

슬라이드 이펙트 - 좌로 움직이기(연속적)

 

 

 

 

 

💜 슬라이더 이펙트 04

코드 보기 / 완성 화면

 

style

<style>
    /* slider__wrap */
    .slider__wrap {
        width: 100%;
        height: 100vh;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    .slider__img {  /* 이미지가 보이는 영역 */
        position: relative;
        width: 800px;
        height: 450px;
        overflow: hidden;
    }
    .slider__inner {       /* 이미지 움직이는 영역 = 전체 이미지를 감싸고있는 부모 : 움직이는 영역 */
        display: flex;
        flex-wrap: wrap;
        width: 4800px;    /* 총 이미지 4800 */
        height: 450px;
    }
    .slider {             /* 개별적인 이미지 */
        position: relative;
        width: 800px;
        height: 450px;
    }
</style>

이미지가 보이는 영역,

이미지가 움직이는 영역 = 전체 이미지를 감싸고 있는 부모,

총 이미지, 개별적인 이미지에 대한 css입니다.

 

body

<body class="img05 bg01 font04">
    <header id="header">
        <h1>Javascript Slider Effect04</h1>
        <p>04. 슬라이드 이펙트 : 좌로 움직이기(연속적으로)<p>
        <ul>
            <li><a href="sliderEffect01.html">1</a></li> 
            <li><a href="sliderEffect02.html">2</a></li> 
            <li><a href="sliderEffect03.html">3</a></li> 
            <li class="active"><a href="sliderEffect04.html">4</a></li>
            <li><a href="sliderEffect05.html">5</a></li> 
            <li><a href="sliderEffect06.html">6</a></li> 
        </ul>
    </header>
    <!-- //header -->

    <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="이미지1"></div>
                    <div class="slider s2"><img src="./img/sliderEffect01-min.jpg" alt="이미지2"></div>
                    <div class="slider s3"><img src="./img/sliderEffect03-min.png" alt="이미지3"></div>
                    <div class="slider s4"><img src="./img/sliderEffect04-min.jpg" alt="이미지4"></div>
                    <div class="slider s5"><img src="./img/sliderEffect05-min.jpg" alt="이미지5"></div>
                </div>
            </div>
        </div>
    </main>
    <!-- //main -->

    <footer id="footer">
        <a href="mailto:hunmi961119@gmail.com">hunmi961119@gmail.com</a> 
    </footer>
    <!-- //footer -->

body 안에 사진을 넣어주고 작업합니다.

 

script

<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 = 3000;               //이미지 변경 간격 시간
    let sliderWidth = slider[0].offsetWidth;  //이미지 가로값
    let sliderClone = sliderInner.firstElementChild.cloneNode(true); //첫번째 이미지 복사

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

    function sliderEffect (){
        currentIndex++;

        sliderInner.style.transition = "all 0.6s";
        sliderInner.style.transform = "translateX(-"+ sliderWidth * currentIndex +"px)";

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

슬라이드 이미지의 width값을 구하는 offsetWidth

sliderClone을 이용해 첫번째 이미지 복사

 

sliderClone 요소를 sliderInner 변수의 마지막 자식 요소로 추가

이를 통해 마지막 이미지에서 다시 첫 번째 이미지로 이동할 때 자연스러운 전환효과를 줍니다.

 

함수를 이용해 슬라이더 이미지를 변겨시켜줍니다.

currentIndex++ 로 현재 이미지에 1을 증가시킵니다.

 

슬라이더 이미지 변경에 애니메이션을 추가하고

슬라이더 이미지를 sliderWidth + currentIndex 만큼 왼쪽으로 이동시킵니다.

 

현재 이미지 인덱스가 슬라이더 이미지 개수와 같을 경우

슬라이더 이미지 변경 애니메이션을 없애고, 슬라이더 이미지를 원래 위치로 되돌립니다.

 

다시 인덱스를 0으로 초기화 합니다.

 

 

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, {
            duration: 0.6,
            x: -sliderWidth * currentIndex,
            onComplete: function (){
                if(currentIndex == sliderCount){
                    gsap.to(sliderInner, {
                        duration: 0,
                        x: 0,
                    });
                    currentIndex = 0;
                }
            },
        });
    }
    setInterval(sliderEffect, sliderInterval);
</script>

GSAP 라이브러리의 to()메서드를 사용해 이미지 슬라이더를 제어합니다.

 

to() 메서드는 지속시간 duration과 이동거리 x를 인수로 받아서

sliderInner 요소를 이동시킵니다.

 

이동이 완료될 때마다 onComplete 콜백 함수가 호출되며, 이 함수에서는 currentIndex값이 slidercount와 같아졌는지 확인하여 이미지가 모두 표시되었는지를 확인합니다.

 

이미지가 모두 표시되었다면 sliderInner요소의 x위치를 0으로 초기화 하고 currentIndex 변수를 0으로 재설정합니다.

 

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>
    // 첫번째 이미지를 마지막에 복사하여 붙여넣기
    $(".slider__inner").append(sliderClone);
    function sliderEffect() {
        currentIndex++;
        $(".slider__inner").css({
            "transition": "all 0.6s",
            "transform": "translateX(-" + sliderWidth * currentIndex + "px)"
        });
        // 마지막 이미지에 위치 했을 때
        if (currentIndex === sliderCount) {
            setTimeout(function() {
                $(".slider__inner").css({
                    "transition": "0s",
                    "transform": "translateX(0px)"
                });
            }, 700);
            currentIndex = 0;
        }
    }
    setInterval(sliderEffect, sliderInterval);
</script>

$(".slider__inner").css()메서드를 사용해 슬라이더의 위치를 이동시키는 효과를 구현

transition속성을 사용해

이동하는 동안 애니메이션 효과를 부여

transform  속성을 사용해 이미지를 이동

 

currentIndex값이 sliderCount 값과 같아지면, 마지막 이미지에 위치했다는 것을 의미

 

반응형