滑动图像滑块滑过太多

时间:2016-08-04 20:03:16

标签: javascript jquery css function swipe

我尝试在滑块上添加滑动功能,以允许用户在其可触摸设备上滑动图像。它没有成为最好的。当扫描图像时,它们不会一直滑动,然后当我到达图库的末尾(第四张图像的结尾)时,滑块变为空白(变为白色),然后在一段时间后恢复正常

我已在此问题中添加了重要代码,并添加了Fiddle to try it out

小提琴不会复制这个问题,所以如果你想看看这是做什么的,请go here to see it live。向左滚动一半,然后你会看到滑块。

我使用的示例有三个图像而不是四个,我认为这可能是我的问题,但是当我删除第四个图像(重复第一个图像以便更顺利地转换回第一个图像)时,问题是还在。我99%肯定这个问题存在于javascript中,但我找不到它。

有谁看到我做错了什么或如何改善这个?

请注意。我正在为此函数提供完整的代码,但我相信这个问题存在于此处的移动或结束函数中:

move: function(event) {
          // Continuously return touch position.
          this.touchmovex =  event.originalEvent.touches[0].pageX;
          // Calculate distance to translate figure.
          this.movex = this.index*this.slideWidth + (this.touchstartx - this.touchmovex);
          // Defines the speed the images should move at.
          var panx = 100-this.movex/6; // was /6
          if (this.movex < 600) { // Makes the figure stop moving when there is no more content.
            this.el.figure.css('transform','translate3d(-' + this.movex + 'px,0,0)');
          }
          if (panx < 100) { // Corrects an edge-case problem where the background image moves without the container moving.
            this.el.imgSlide.css('transform','translate3d(-' + panx + 'px,0,0)');
          }
        },

        end: function(event) {
          // Calculate the distance swiped.
          var absMove = Math.abs(this.index*this.slideWidth - this.movex);
          // Calculate the index. All other calculations are based on the index.
          if (absMove > this.slideWidth/2 || this.longTouch === false) {
            if (this.movex > this.index*this.slideWidth && this.index < 2) {
              this.index++;
            } else if (this.movex < this.index*this.slideWidth && this.index > 0) {
              this.index--;
            }
          }      
          // Move and animate the elements.
          this.el.figure.addClass('animate').css('transform', 'translate3d(-' + this.index*this.slideWidth + 'px,0,0)');
          this.el.imgSlide.addClass('animate').css('transform', 'translate3d(-' + 100-this.index*50 + 'px,0,0)');

完整代码:

if (navigator.msMaxTouchPoints) {

  $('#slider').addClass('ms-touch');

  $('#slider').on('scroll', function() {
    $('.slide-image').css('transform','translate3d(-' + (100-$(this).scrollLeft()/6) + 'px,0,0)');
  });

} else {

  var slider = {

    el: {
      slider: $("#slider"),
      figure: $(".figure"),
      imgSlide: $(".slide-image")
    },

    slideWidth: $('#slider').width(),
    touchstartx: undefined,
    touchmovex: undefined,
    movex: undefined,
    index: 0,
    longTouch: undefined,

    init: function() {
      this.bindUIEvents();
    },

    bindUIEvents: function() {

      this.el.figure.on("touchstart", function(event) {
        slider.start(event);
      });

      this.el.figure.on("touchmove", function(event) {
        slider.move(event);
      });

      this.el.figure.on("touchend", function(event) {
        slider.end(event);
      });

    },

    start: function(event) {
      // Test for flick.
      this.longTouch = false;
      setTimeout(function() {
        window.slider.longTouch = true;
      }, 250);

      // Get the original touch position.
      this.touchstartx =  event.originalEvent.touches[0].pageX;

      // The movement gets all janky if there's a transition on the elements.
      $('.animate').removeClass('animate');
    },

    move: function(event) {
      // Continuously return touch position.
      this.touchmovex =  event.originalEvent.touches[0].pageX;
      // Calculate distance to translate figure.
      this.movex = this.index*this.slideWidth + (this.touchstartx - this.touchmovex);
      // Defines the speed the images should move at.
      var panx = 100-this.movex/6; // was /6
      if (this.movex < 600) { // Makes the figure stop moving when there is no more content.
        this.el.figure.css('transform','translate3d(-' + this.movex + 'px,0,0)');
      }
      if (panx < 100) { // Corrects an edge-case problem where the background image moves without the container moving.
        this.el.imgSlide.css('transform','translate3d(-' + panx + 'px,0,0)');
      }
    },

    end: function(event) {
      // Calculate the distance swiped.
      var absMove = Math.abs(this.index*this.slideWidth - this.movex);
      // Calculate the index. All other calculations are based on the index.
      if (absMove > this.slideWidth/2 || this.longTouch === false) {
        if (this.movex > this.index*this.slideWidth && this.index < 2) {
          this.index++;
        } else if (this.movex < this.index*this.slideWidth && this.index > 0) {
          this.index--;
        }
      }      
      // Move and animate the elements.
      this.el.figure.addClass('animate').css('transform', 'translate3d(-' + this.index*this.slideWidth + 'px,0,0)');
      this.el.imgSlide.addClass('animate').css('transform', 'translate3d(-' + 100-this.index*50 + 'px,0,0)');

    }

  };

  slider.init();
}


.animate {
  transition: transform 0.3s ease-out;
}

#company-slider-section {
  width: 100%;
  height: auto;
  position: relative;
}

div#slider {
  width: 100%;
  overflow: hidden;
  position: relative;
}

div#slider .figure {
  position: relative;
  width: 400%;
  margin: 0;
  padding: 0;
  font-size: 0;
  text-align: left;
}

.ms-touch.slider {
  overflow-x: scroll;
  overflow-y: hidden;

  -ms-overflow-style: none;
  /* Hides the scrollbar. */

  -ms-scroll-chaining: none;
  /* Prevents Metro from swiping to the next tab or app. */

  -ms-scroll-snap-type: mandatory;
  /* Forces a snap scroll behavior on your images. */

  -ms-scroll-snap-points-x: snapInterval(0%, 100%);
  /* Defines the y and x intervals to snap to when scrolling. */
}

.figure2 {
  animation: 20s company-slider infinite;
  margin: 0;
}

@keyframes company-slider {
  0% {
    left: 0%;
  }
  30% {
    left: 0%;
  }
  35% {
    left: -100%;
  }
  55% {
    left: -100%;
  }
  60% {
    left: -200%;
  }
  90% {
    left: -200%;
  }
  95% {
    left: -300%;
  }
  100% {
    left: -300%;
  }
}

.slide-wrapper img {
  width: 25%;
  min-height: 100%;
  float: left;
  position: relative;
  overflow: hidden;
}
.slide {
  height: 100%;
  position: relative;
}
.slide:before {
  content: "";
  position: absolute;
  z-index: 1;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 40%;
  background: linear-gradient(transparent, black);
}


<div id="company-slider-section">
            <div class="section-blocks left">
            <div id="slider" class="slider">
              <figure class="figure figure2">
                <div class="slide-wrapper">
                  <div class="slide"><img src="/images/work/projects/eslich/es-test1.jpg" alt class="slide-image"></div>
                </div>
                <div class="slide-wrapper">
                  <div class="slide"><img src="/images/work/projects//desktop-service.jpg" alt class="slide-image"></div>
                </div>
                <div class="slide-wrapper">
                  <div class="slide"><img src="/images/work/projects//es-test2.jpg" alt class="slide-image"></div>
                </div>
                <div class="slide-wrapper">
                  <div class="slide"><img src="/images/work/projects//es-test1.jpg" alt class="slide-image"></div>
                </div>
              </figure>
            </div>
        </div>
    </div>

0 个答案:

没有答案