Jquery Div 슬라이더 루프

Nov 03 2020

작은 문제가 있습니다. Div 슬라이드 및 끝에 도달하면 일시 중지없이 div 1이 빠르게 표시됩니다. Div 5는 볼 수 없습니다.

$(function(){ var width = '100vw'; var speed = 1500; var pause = 3000; var current = 1; var $slider = $('.slider'); var $slides = $slider.find('.slides'); var $slide = $slides.find('.slide'); setInterval(function(){ $slides.animate({'margin-left': '-='+width}, speed, function(){
        current++;
        if(current == $slide.length){ $slides.css('margin-left', 0); 
            current = 1;
        }
    });
}, pause);
});

하지만 지연을 추가하면

   if(current == $slide.length){ $(this).delay(pause).queue(function(){
                $slides.css('margin-left', 0); 
            });
            current = 1;
        }

$(function(){

    var width = '100vw';
    var speed = 1500;
    var pause = 3000;
    var current = 1;

    var $slider = $('.slider');
    var $slides = $slider.find('.slides');
    var $slide = $slides.find('.slide');

    setInterval(function(){
        $slides.animate({'margin-left': '-='+width}, speed, function(){ current++; if(current == $slide.length){
                $(this).delay(pause).queue(function(){ $slides.css('margin-left', 0); 
                });
                current = 1;
            }
        });
    }, pause);

});
.slider {
    width: 100%;
    height:auto;
    text-align: center;
    overflow: hidden;
  }
  .slides {
    display: flex;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    -webkit-overflow-scrolling: touch;
    /*
    scroll-snap-points-x: repeat(300px);
    scroll-snap-type: mandatory;
    */
  }
  .slides::-webkit-scrollbar {
    width: 1px;
    height: 10px;
  }
  .slides::-webkit-scrollbar-thumb {
    background: #bbb;
  }
  .slides::-webkit-scrollbar-track {
    background: transparent;
  }
  .slides > div {
    scroll-snap-align: start;
    flex-shrink: 0;
    width: 100vw;
    height: 100vh;
    background: #eee;
    transform-origin: center center;
    transform: scale(1);
    transition: transform 0.5s;
    position: relative; 
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 100px;
  }
  .slides > div:target {
  /*   transform: scale(0.8); */
  }
  .author-info {
    background: rgba(0, 0, 0, 0.75);
    color: white;
    padding: 0.75rem;
    text-align: center;
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    margin: 0;
  }
  .author-info a {
    color: white;
  }
  img {
    object-fit: cover;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }
  .slider > a {
    display: inline-flex;
    width: 1.5rem;
    height: 1.5rem;
    background: white;
    text-decoration: none;
    align-items: center;
    justify-content: center;
    margin: 0 0 0.5rem 0;
    position: relative;
    border:1px solid green;
  }
  .slider > a:active {
    top: 1px;
  }
  .slider > a:focus {
    background: #666;
  }
  /* Don't need button navigation */
  @supports (scroll-snap-type) {
    .slider > a {
      display: none;
    }
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="slider">  
  <div class="slides">
    <div id="slide-1" class="slide">Slide 1</div>
    <div id="slide-2" class="slide">Slide 2</div>
    <div id="slide-3" class="slide">Slide 3</div>
    <div id="slide-4" class="slide">Slide 4</div>
    <div id="slide-5" class="slide">Slide 5</div>
   </div>
</div>

필요한 것처럼 Div 5가 표시되지만 div 1을 표시 한 후에는 더 이상 슬라이딩되지 않습니다.

그래서 반복을 계속하고 주어진 시간에 각 div를 보여주기 위해 무엇을 할 수 있습니까?

누군가 마지막 div에 도달 한 후 슬라이더를 뒤로 슬라이드하고 div 1로 다시 슬라이드하는 방법을 보여줄 수 있습니까?

답변

1 Spring Nov 06 2020 at 04:16

첫 번째 : 문제에 대한 나쁜 해결책 : (두 번째로 이동)

애니메이션 코드가 큐에 멈춰 있으면 큐 calback의 current == $slide.length인수로 다음 함수를 전달한 다음 next()다른 함수를 트리거 하는 데 사용해야 합니다. 아래 :

if(current == $slide.length){
    $(this).delay(pause).queue(function(next){ //<--- here next argument $slides.css('margin-left', 0); 
        next(); // <----- next call 
    });
    current = 1;
}

하지만 애니메이션이 예상대로 작동하지 않습니다.

둘째 : 적절한 간단한 해결책

내가 제안하는 것은 애니메이션 왼쪽 값을 변수로 설정 한 다음 마지막인지 확인하여 0으로 슬라이드하십시오. 그렇지 않으면 왼쪽 뷰 너비 슬라이딩을 계속하십시오.

작업 스 니펫 참조 :

$(function(){ var width = '100vw'; var speed = 1500; var pause = 3000; var current = 1; var $slider = $('.slider'); var $slides = $slider.find('.slides'); var $slide = $slides.find('.slide'); var leftAnnime = '-='+width; setInterval(function(){ $slides.animate({'margin-left': leftAnnime }, speed, function(){
            current++;
            if( current == $slide.length ) {
              leftAnnime = 0;
              current = 0;
            } else {
              leftAnnime = '-='+width;
            }
        });
    }, pause);

});
.slider {
    width: 100%;
    height:auto;
    text-align: center;
    overflow: hidden;
  }
  .slides {
    display: flex;
    overflow-x: hidden;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    -webkit-overflow-scrolling: touch;
    /*
    scroll-snap-points-x: repeat(300px);
    scroll-snap-type: mandatory;
    */
  }
  .slides::-webkit-scrollbar {
    width: 1px;
    height: 10px;
  }
  .slides::-webkit-scrollbar-thumb {
    background: #bbb;
  }
  .slides::-webkit-scrollbar-track {
    background: transparent;
  }
  .slides > div {
    scroll-snap-align: start;
    flex-shrink: 0;
    width: 100vw;
    height: 100vh;
    background: #eee;
    transform-origin: center center;
    transform: scale(1);
    transition: transform 0.5s;
    position: relative; 
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 100px;
  }
  .slides > div:target {
  /*   transform: scale(0.8); */
  }
  .author-info {
    background: rgba(0, 0, 0, 0.75);
    color: white;
    padding: 0.75rem;
    text-align: center;
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    margin: 0;
  }
  .author-info a {
    color: white;
  }
  img {
    object-fit: cover;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }
  .slider > a {
    display: inline-flex;
    width: 1.5rem;
    height: 1.5rem;
    background: white;
    text-decoration: none;
    align-items: center;
    justify-content: center;
    margin: 0 0 0.5rem 0;
    position: relative;
    border:1px solid green;
  }
  .slider > a:active {
    top: 1px;
  }
  .slider > a:focus {
    background: #666;
  }
  /* Don't need button navigation */
  @supports (scroll-snap-type) {
    .slider > a {
      display: none;
    }
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="slider">  
  <div class="slides">
    <div id="slide-1" class="slide">Slide 1</div>
    <div id="slide-2" class="slide">Slide 2</div>
    <div id="slide-3" class="slide">Slide 3</div>
    <div id="slide-4" class="slide">Slide 4</div>
    <div id="slide-5" class="slide">Slide 5</div>
   </div>
</div>