您现在的位置:首页 >> 前端 >> 内容

Swiper自动滚屏错位问题的解决办法

时间:2018/6/26 11:10:49 点击:

  核心提示:起因:Swiper由于设置了autoplay,会自己滚动,怎么解决呐,我先升级到了4.3.2发现,默认调用没有解决这个问题,查看了Swiper API发现了个解决方式,分享给大家。PS: 查看了3.X...

起因:

Swiper由于设置了autoplay,会自己滚动,怎么解决呐,我先升级到了4.3.2发现,默认调用没有解决这个问题,查看了Swiper API发现了个解决方式,分享给大家。

PS: 查看了3.X.X 的API 感觉没办法解决,建议升级到4.X.X版本 , 不能完全兼容,但是改动成本不大

解题思路:

1.分析原因

滚动错位原因我分析有两个

A.前后创建了两首尾个元素, 导致获取的不是真正的元素,下图是 4个页面 + 两个 红框的首尾

Swiper自动滚屏错位问题的解决办法

B.手势操作时,没有暂停当前滚动中的循环,导致滚动和切换同步操作最后错位

2.尝试解决方法

问题A 由于实现机制问题,解决起来不方便,所以主要 解决问题B

问题B 解决思路(划重点):

A. 监听滚动事件,查找是否有相关封装的API

解决:API 中找到 touchStart 和 touchEnd 两个滚动事件

B. 如何调用滚动监听

解决:API 中找到 监听事件方法on

C.如何暂停和开启循环

解决:API中找到autoplay.stop和autoplay.stop()两个方法

D.如何串联使用

解决:

1.在 touchStart 的时候 暂停 循环

2.在 touchEnd 的时候 开启 循环

3.优化:设置全局变量,避免过快操作导致的问题

具体代码:

JS代码很简单啦,给大家参考下

    // 全局变量
    let meetingSwiper;
    let touchnow = false;

    // 设置Swiper
    meetingSwiper = new Swiper('.main_meeting', {
      pagination: {
        el: '.swiper-pagination-meeting',
        clickable: true,
      },
      loop: true,
      autoplay: {
        disableOnInteraction: true,
      },
      observer: true,
    });
    
    // 关闭循环
    meetingSwiper.on("touchStart", function() {
      // console.log('Swiper touchStart');
      meetingSwiper.autoplay.stop();
    });

    // 开启循环
    meetingSwiper.on("touchEnd", function() {
      // alert('Swiper touchend');
      // console.log('Swiper touchEnd');
      if (!touchnow) {
        touchnow = true;
        window.setTimeout(function() {
          meetingSwiper.autoplay.start();
          touchnow = false;
          // console.log('Swiper touchEnd');
        }, 100);
      }
    });

惯例Demo

Codepen demo

Tags:SW WI IP PE 
作者:网络 来源:Candy_home