【问题标题】:Slider animations滑块动画
【发布时间】:2021-02-26 08:59:31
【问题描述】:

我有一个问题。如何使该滑块循环移动,以及如何使其向后移动,在到达最后一张幻灯片后,以与向前移动相同的速度移动?

$(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>

【问题讨论】:

    标签: javascript jquery animation slider


    【解决方案1】:

    这很简单,只需使用一个变量来检查您滑动的方向,然后在加号或minus 之间切换left 宽度方向

    请参阅下面的工作 sn-p :

    $(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 leftMargin = '-='+width;
        var direction = "left";
    
        setInterval(function(){
            $slides.animate({'margin-left': leftMargin }, speed, function(){
                direction === "left" ? current++ : current--;
                if(current == $slide.length){
                    direction = "right"
                    leftMargin = '+='+width
                }
                else if (current == 1){
                   direction = "left";
                   leftMargin = '-='+width
                }
            });
        }, 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>

    【讨论】:

    • 太棒了!完美运行!试图弄清楚如何只能在循环中运行它! 'setInterval(function(){ $slides.animate({'margin-left': leftMargin}, speed, function(){ current++; if(current == $slide.length){ current = 1; } }); } , 暂停);'像这样,它在到达最后一张幻灯片后滑动空白幻灯片
    • @aidron ,你能解释一下吗,我没明白到底是什么问题
    • 这段代码很好用!我只想要更多的动画选项,比如第一个,现在这个和第三个:滑块只是循环播放,比如 1、2、3、4、5、1、2、3、4...等
    • 我明白你的意思是,codepen.io/fcalderan/pen/bGbjZdz
    • 杰斯,但只有一项,并且自动播放
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多