当 centeredSlides 设置为 false 时,Swiper 缩略图滑块表现奇怪

Swiper thumbnail slider behaving odd when centeredSlides is set to false

我有两个滑块:左侧的主滑块和用作主滑块缩略图视图的缩略图滑块。然而,缩略图滑块的行为不正确:在第六张或第七张幻灯片周围,缩略图滑块选择了当前一张之前的缩略图,而不是下一张,之后它仍然存在错误。

我尝试将 centeredSlides 选项设置为 true。然后缩略图滑块的行为正确。但是,我需要 centeredSlidesfalse,并且当前活动的缩略图幻灯片必须位于顶部。

你可能会用脚本更好地理解我的观点,所以这里是:

$(document).ready(function() {
  var productSlider = new Swiper('.product-slider', {
    nextButton: '.swiper-button-next',
    prevButton: '.swiper-button-prev',
    spaceBetween: 10
  });
  var productThumbs = new Swiper('.product-thumbs', {
    spaceBetween: 5,
    centeredSlides: false,
    slidesPerView: 4,
    touchRatio: 0.2,
    slideToClickedSlide: true,
    direction: 'vertical'
  });
  productSlider.params.control = productThumbs;
  productThumbs.params.control = productSlider;
});
body {
  margin-top: 30px;
}
.product-slider {
  height: 430px;
  box-shadow: 0 0 15px #ECECEC;
 }
 
.product-slider .swiper-slide {
  display: flex;
  justify-content: center;
  align-items: center;
}

.product-thumbs {
  height: 430px;
}

.product-thumbs .swiper-slide {
  width: auto;
  padding: 0;
  display: flex;
  justify-content: center;
  align-items: center;
}

.product-thumbs .swiper-slide-active {
  border: solid 2px #ECECEC;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/js/swiper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/js/swiper.jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/css/swiper.min.css" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet"/>

<div class="container">
  <div class="row">
    <div class="col-10">
      <div class="swiper-container product-slider">
        <div class="swiper-wrapper">
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
        </div>
        <div class="swiper-button-next">
          <i class="fa fa-chevron-right"></i>
        </div>
        <div class="swiper-button-prev">
          <i class="fa fa-chevron-left"></i>
        </div>
      </div>
    </div>
    <div class="col-2">
      <div class="swiper-container product-thumbs">
        <div class="swiper-wrapper">
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

有人对此有任何解决方案吗?

我找到了解决方案,只是不知道是否可以做得更好。首先,我将 centeredSlides 选项设置为 true,如下所示:

var productThumbs = new Swiper('.product-thumbs', {
  spaceBetween: 5,
  centeredSlides: true, // changed this from false to true
  slidesPerView: 4,
  touchRatio: 0.2,
  slideToClickedSlide: true,
  direction: 'vertical'
});

然后我给 .swiper-wrapper class 一个负边距顶部,像这样:

.product-thumbs .swiper-wrapper {
  margin-top: calc(-100% + 5px); /* Added this... adjust to your needs */
}

现在滑块可以正常工作了。 .swiper-wrapper 的负边距似乎取决于您的其他样式。我的项目的边距是正确的(因此最上面的缩略图图像与主滑块的顶部边缘对齐),在下面的示例中,您可以使用 margin-top 值!

$(document).ready(function() {
  var productSlider = new Swiper('.product-slider', {
    nextButton: '.swiper-button-next',
    prevButton: '.swiper-button-prev',
    spaceBetween: 10
  });
  var productThumbs = new Swiper('.product-thumbs', {
    spaceBetween: 5,
    centeredSlides: true,
    slidesPerView: 4,
    touchRatio: 0.2,
    slideToClickedSlide: true,
    direction: 'vertical'
  });
  productSlider.params.control = productThumbs;
  productThumbs.params.control = productSlider;
});
body {
  margin-top: 30px;
}
.product-slider {
  height: 430px;
  box-shadow: 0 0 15px #ECECEC;
 }
 
.product-slider .swiper-slide {
  display: flex;
  justify-content: center;
  align-items: center;
}

.product-thumbs {
  height: 430px;
}

/* Play around with this. Maybe your project does not use a vertical
thumbnail slider, but instead a horizontal one. You'd have to change the
margin-left values for this */
.product-thumbs .swiper-wrapper {
  margin-top: calc(-100% + 5px);
}

.product-thumbs .swiper-slide {
  width: auto;
  padding: 0;
  display: flex;
  justify-content: center;
  align-items: center;
}

.product-thumbs .swiper-slide-active {
  border: solid 2px #ECECEC;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/js/swiper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/js/swiper.jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.1/css/swiper.min.css" rel="stylesheet"/>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet"/>

<div class="container">
  <div class="row">
    <div class="col-10">
      <div class="swiper-container product-slider">
        <div class="swiper-wrapper">
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/300/300/nature/10">
          </div>
        </div>
        <div class="swiper-button-next">
          <i class="fa fa-chevron-right"></i>
        </div>
        <div class="swiper-button-prev">
          <i class="fa fa-chevron-left"></i>
        </div>
      </div>
    </div>
    <div class="col-2">
      <div class="swiper-container product-thumbs">
        <div class="swiper-wrapper">
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
          <div class="swiper-slide">
            <img src="http://lorempixel.com/90/90/nature/10">
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

您可以将'width'设置为您的拇指图库来解决问题:

var datesSwiper = new Swiper('[data-name="history-years"]', {
    width: 100,
    slidesPerView: 'auto',
    slideToClickedSlide: true,
    slideActiveClass: 'history__year_active'
});