如果只有 1 张幻灯片,则禁用 Swiper 滑块

问题描述 投票:0回答:16

我在网站上使用滑动滑块,如果只有一张幻灯片,我希望将其禁用。

目前只有一张幻灯片会出现分页,您可以单击或滑动。理想情况下,如果只有一张幻灯片,则不应有任何交互。

我现在的js是:

  var swiper = new Swiper('.swiper-container', {
    // Optional parameters
    direction: 'horizontal',
    loop: false,
    //autoplay: 6500,
    autoplayDisableOnInteraction: false,

    keyboardControl: true,
    mousewheelControl: true,

    pagination: '.swiper-pagination',
    paginationClickable: true,

  });
swiper.js
16个回答
54
投票

Swiper API 中有一个选项可能有用:

watchOverflow (boolean|false) // When enabled Swiper will be disabled and hide navigation buttons on case there are not enough slides for sliding
    

15
投票
我也在寻找一种方法来做到这一点,但由于我没有找到任何“官方”方法来禁用滑动和隐藏寻呼机,所以我决定即兴发挥一下。

因此,在您的脚本中,您可以在 Swiper 变量之后添加以下内容:

JS:

if($(".slider .slide").length == 1) { $('.swiper-wrapper').addClass( "disabled" ); $('.swiper-pagination').addClass( "disabled" ); }

如果滑块中只有一张幻灯片,这会将

disabled

 类添加到您的包装器和分页中。
您现在可以添加一些 CSS 来绕过 Swiper 效果:

CSS:

.swiper-wrapper.disabled { transform: translate3d(0px, 0, 0) !important; } .swiper-pagination.disabled { display: none; }

请注意,这仅在循环设置为 false 时才有效(就像您的情况一样)。如果循环处于活动状态,Swiper 将在您唯一的幻灯片之前和之后添加幻灯片重复项,总共形成 3 张相同的幻灯片。然后您可以将

length == 1

 更改为 
length == 3

希望这会有所帮助!


6
投票
其中一个选项是有条件地添加选项,如下所示:

let options = {}; if ( $(".swiper-container .swiper-slide").length == 1 ) { options = { direction: 'horizontal', loop: false, autoplayDisableOnInteraction: false, keyboardControl: true, mousewheelControl: true, pagination: '.swiper-pagination', paginationClickable: true, } } else { options = { loop: false, autoplay: false, } } var swiper = new Swiper('.swiper-container', options);
    

5
投票
只需添加一个条件:

if ($('.swiper-container .swiper-slide').length > 1) { var swiper = new Swiper('.swiper-container', { // Optional parameters direction: 'horizontal', loop: false, //autoplay: 6500, autoplayDisableOnInteraction: false, keyboardControl: true, mousewheelControl: true, pagination: '.swiper-pagination', paginationClickable: true, }); }
    

5
投票
只需检查您有多少张幻灯片:

const numberOfSlides = document.querySelectorAll('.swiper-slide').length;

然后,如果只有一张幻灯片,请将allowSlidePrev/allowSlideNext(或任何你想阻止的内容)设置为 false:

const slider = new Swiper('.swiper-container', { allowSlidePrev:numberOfSlides === 1 ? false:true, allowSlideNext:numberOfSlides === 1 ? false:true });

您还可以访问幻灯片集合,以便您还可以在活动中打开/关闭这些内容。以 init 为例:

on: { init: function () { const numberOfSlides = this.slides.length; ... } }
    

2
投票
由于提供的一些解决方案似乎已经过时或与

autoplay

loop
 设置的某些组合发生冲突,因此这里解决了这个问题,将所有内容都保留在初始化调用中:

const heroSlider = new Swiper('#hero-slider .swiper', { loop: true, watchOverflow: true, autoplay: { delay: 4000, }, speed: 500, navigation: { nextEl: '#hero-slider .swiper-button-next', prevEl: '#hero-slider .swiper-button-prev', }, on: { beforeInit() { const slides = this.el.querySelectorAll('.swiper-slide'); if (slides) { this.params.loop = slides.length > 1; this.params.autoplay.enabled = slides.length > 1; } }, }, });
如果我们只有一张幻灯片,上面显示没有导航控件并禁用自动循环,从而有效地禁用滑动器 - 否则显示控件并自动循环像往常一样启动。我们在这里使用绕过 DOM 的方式来计算幻灯片数,而不是通过 Swiper-API,因为后者此时并不可靠 - 也不是在 

init

 上(对于单个幻灯片,
this.slides.length
 提供 
0
)在 
beforeInit
(毫不奇怪)和 
3
 onInit 上,因为 
loop: true
 的初始默认设置似乎会在我们只有 1 张幻灯片时产生幻灯片重复项等)。

长话短说:对我有用!


2
投票
基于

文档

swiper.allowTouchMove = false;
    

1
投票
简洁的解决方案:

var swiper = new Swiper('.swiper-container', { navigation: { prevEl: '.swiper-button-prev', nextEl: '.swiper-button-next', }, on: { init: function () { if (this.slides.length <= 1) { // First way: this.allowSlidePrev = this.allowSlideNext = false; // disabling swiping this.el.querySelector(".swiper-button-prev").setAttribute('hidden', ''); // hiding arrows prev&next this.el.querySelector(".swiper-button-next").setAttribute('hidden', ''); // Second way: // this.el.classList.add('swiper-no-swiping'); } } } });
    

0
投票
我建议使用更新刷卡功能和这样的新选项:

params.loop = false; params.pagination = null; swiper.update();

Params 是用于 swiper 初始化的对象。

谢谢!


0
投票
您可以检查幻灯片的数量,并添加

swiper-no-swiping

 类以禁用滑动。这假设 
noSwiping
 保持为 true(默认设置)
[文档]

// 1. Initialize Swiper var swiper = new Swiper('.swiper-container', { // Sample parameters direction: 'horizontal', loop: false, autoplayDisableOnInteraction: false, keyboardControl: true, mousewheelControl: true, pagination: '.swiper-pagination', paginationClickable: true, }); swiper.on('init', function() { // 2. Get Slide count if (slider.slides.length <= 1) { // 3. Add swiper-no-swiping class document.querySelector('.swiper-container').classList.add('swiper-no-swiping') } });
    

0
投票
导航按钮禁用时添加到导航按钮的 CSS 类名称

disabledClass: 'disabled_swiper_button'
参考请点击

https://swiperjs.com/swiper-api#navigation


0
投票
使用最新的 swiper.js 版本,您可以将

enabled: false

 添加到选项中。当禁用时,这将隐藏所有导航元素并且不会响应任何事件和交互

在 API 文档

文档中找到。

使用

v6.6.1

 进行测试

这里有一个例子

var items = ['slide1'] var options = { enabled: items.length > 1 }
    

0
投票
    可以通过
  1. 参数https://swiperjs.com/swiper-api#param-watchOverflow:
watchOverflow (boolean|false) // When enabled Swiper will be disabled and hide navigation buttons on case there are not enough slides for sliding

    另一种方式,使用
  1. method https://swiperjs.com/swiper-api#method-swiper-disable:
// detect sliders if (swiper.slides.length === 1) { // Disable Swiper (if it was enabled). When Swiper is disabled, it will hide all navigation elements and won't respond to any events and interactions swiper.disable(); }
    

0
投票
on: { slideChange: function () { if (this.slides.length === 1) { this.allowSlidePrev = false; this.allowSlideNext = false; } else { this.allowSlidePrev = true; this.allowSlideNext = true; } } }
    

0
投票
我使用了

init

,因为它不能与
beforeInit
一起使用。

非常有用,否则我们不知道如何修改选项:您可以使用

console.log(this.params);

 查看所有选项及其结构

这是一个例子:

var swiper2 = new Swiper(".slider-large", { spaceBetween: 30, pagination: { el: '.swiper-pagination', clickable: true, }, keyboard: { enabled: true, }, thumbs: { swiper: swiper, }, loop: false, lazy: true, watchOverflow: true, on: { init() { // check number of slides const slides_length = this.slides.length; // check parameters before change console.log(this.params); if (slides_length === 1) { // examples, do what what you want, some examples this.params.allowTouchMove = false; this.params.keyboard.enabled = false; this.params.watchOverflow = false; this.params.enabled = false; } // check if parameters has been modified console.log(this.params); }, // not asked : if you want to know the current index slideChange: function () { swiper2activeIndex = this.activeIndex; // get current slide's index console.log(swiper2activeIndex); }, } });
    

-2
投票
对我来说,使用 $ionicSlides 可以很好地询问数组的长度,如果是 1 或更少,则获取 Swiper 实例并调用这些函数:

$scope.$on("$ionicSlides.sliderInitialized", function (event, data) { $scope.slider2 = data.slider; $scope.slider2.activeIndex = 0; if (vm.slidetext && vm.slidetext.length <= 1) { $scope.slider2.destroyLoop(); $scope.slider2.stopAutoplay(); $scope.slider2.lockSwipes(); } }

但是这些功能是针对原生 Swiper 的,所以应该可以正常工作

© www.soinside.com 2019 - 2024. All rights reserved.