美文网首页
swiper插件的使用,安卓兼容性和修改分页器样式

swiper插件的使用,安卓兼容性和修改分页器样式

作者: 愿你如夏日清凉的风 | 来源:发表于2017-05-03 18:56 被阅读2629次

Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件。使用的次数越多,遇到的问题就会越多,有的时候需求也会发生变化。

到目前止我遇到两种情况:

第一种是:要求swiper-pagination(分页器)的长度按百分比划分,而不是我们平常使用的圆点或小方块,每一页(swiper-slide)分页器宽度占总长度的N分之一。

第二种是:在部分安卓手机上不能滑屏或者出现卡顿。

针对这两种情况,下面我会列出三组代码,从最基本的例子开始,了解最简单的情况下我们如何写,遇到第一种情况下如何改,遇到第二种情况下需要做哪些修改,下面开始分解。

先看最简单的例子:

<body>
<!-- 头部banner轮播 -->
<div class="swiper-container">
    <div class="swiper-wrapper">
        <div class="swiper-slide" style="background-image:url(img/swiper01.jpg)">
            <a href="#"></a>
        </div>
        <div class="swiper-slide" style="background-image:url(img/swiper02.jpg)">
            <a href="#"></a>
        </div>
        <div class="swiper-slide" style="background-image:url(img/swiper03.jpg)">
            <a href="#"></a>
        </div>
    </div>
    <div class="swiper-button-prev swiper-button-white"></div>  <!-- 白色 -->
    <div class="swiper-button-next swiper-button-white"></div>
    <div class="swiper-pagination swiper-pagination-white"></div>
</div>
<script src="js/jquery-3.1.1.min.js"></script>
<script src="js/swiper.min.js"></script>
<script>
    var swiper = new Swiper('.swiper-container', {
        pagination: '.swiper-pagination',
        loop: true,
        paginationClickable: true, 
        nextButton: '.swiper-button-next',
        prevButton: '.swiper-button-prev',
        spaceBetween: 30,
        autoplay: 3000,
        effect: 'fade'
    });
</script>
</body>

这里我们来看看上面这些配制选项分别代表什么意思,以及他们有什么用:

pagination: '.swiper-pagination',   // 分页器容器的css选择器或HTML标签。

loop: true,    // 设置为true 则开启loop模式。让Swiper看起来是循环的。

paginationClickable: true,   // 此参数设置为true时,点击分页器的指示点分页器会控制Swiper切换。

nextButton: '.swiper-button-next',   // 前进按钮的css选择器或HTML元素。

prevButton: '.swiper-button-prev',  // 后退按钮的css选择器或HTML元素。
spaceBetween: 30,  // slide之间的距离(单位px)。
autoplay: 3000, //  自动切换的时间间隔
/*
或者可以像下面这样写。
autoplay: ture,   //设置为true启动自动切换,并使用默认的切换设置。
//等同于以下设置
autoplay: {
    delay: 3000,  // 自动切换的时间间隔,单位ms
    stopOnLastSlide: false, // 如果设置为true,当切换到最后一个slide时停止自动切换。(loop模式下无效)。
    disableOnInteraction: true,  //用户操作swiper之后,是否禁止autoplay。默认为true:停止。如果设置为false,用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay。操作包括触碰,拖动,点击pagination等。
},
*/

effect: 'fade'  // slide的切换效果,默认为"slide"(位移切换),可设置为'slide'(普通切换、默认),"fade"(淡入)"cube"(方块)"coverflow"(3d流)"flip"(3d翻转)。

下面我们来看看其余的常用配制选项有哪些:

direction:'vertical,  // Slides的滑动方向,可设置水平(horizontal)或垂直(vertical)。
delay: 3000,  // 自动切换的时间间隔,单位ms,滑动速度,即slider自动滑动开始到结束的时间(单位ms),也是触摸滑动时释放至贴合的时间。 
grabCursor : true,  // 设置为true时,鼠标覆盖Swiper时指针会变成手掌形状,拖动时指针会变成抓手形状。
autoHeight: true,  // 高度随内容变化
preventClicks : false,  //默认true 当swiper在触摸时阻止默认事件(preventDefault),用于防止触摸时触发链接跳转
preventLinksPropagation : false,  //默认true,阻止click冒泡。拖动Swiper时阻止click事件。

官网上这个地址 配置选项 列出了所有,我这里只是把这个页面中用到的以及比较常用的说明了一下。

注:刚刚把官网上列出来的配置选项一一对了一下,不知道是不是引用的版本不同还是别的什么原因,有些官网的配制选项的写法不一样,测试后还会出问题,反而是自己上面写的demo没有问题。后面慢慢补充原因吧。

下面是样式代码:

/* ==============
   头部banner图
   ============== */
.swiper-container {
    width: 100%;
    height: 3.32rem;
    border-bottom: 1px solid #d3d3d3;
}

.swiper-slide {
    background-position: center;
    background-size: cover;
}

.swiper-slide a {
    display: block;
    width: 100%;
    height: 3.30667rem;
}

我这里也帖出官网的使用方法:Swiper使用方法 ,实际使用过程中遇到了问题也可以直接去官网查看。

平常工作中可能直接像上面这样写也能满足要求。但如果你也在工作中遇到了上面我提两种问题,可以来看看下面的代码。

下面,我们来看第一个情况:

这个例子我用的是swiper-3.4.2的版本,引用的代码大家可以从官网上直接下载到。

相信看过官方文档的人都知道,swiper中有pagination参数——分页导航,其中有分页器样式类型——type,它有四个参数,分别为‘bullets’ 圆点(默认),‘fraction’ 分式 ,‘progressbar’ 进度条,‘custom’ 自定义。刚刚也测试了一下这个配制,发现并不是我想要的效果,我想要的效果如下图:


百分比分页器1.jpeg 百分比分页器1.jpeg

研究了一阵子之后,还是想通过自己的方式去解决,所以就有了下面的代码:
先给大家看一下我的html代码,为方便查看,删掉了大部分无用的代码。

<div class="wrap">
    <div class="swiper-container">
        <div class="swiper-wrapper">
            <div class="swiper-slide">
                <div class="tickets">
                    <div class="ticket-code">
                        <p class="code-number">123456</p>
                        <p class="code-img"></p>
                        <span class="code-status">待参与</span>
                    </div>
                </div>
            </div>
            <div class="swiper-slide">
                <div class="tickets">
                    <div class="ticket-code">
                        <p class="code-number">7891011</p>
                        <p class="code-img"></p>
                        <span class="code-status">待参与</span>
                    </div>
                </div>
            </div>
            <div class="swiper-slide">
                <div class="tickets">
                    <div class="ticket-code">
                        <p class="code-number">123456</p>
                        <p class="code-img"></p>
                        <span class="code-status">待参与</span>
                    </div>
                </div>
            </div>
            <div class="swiper-slide">
                <div class="tickets">
                    <div class="ticket-code">
                        <p class="code-number">123456</p>
                        <p class="code-img"></p>
                        <span class="code-status">待参与</span>
                    </div>
                </div>
            </div>
        </div>
        <div class="swiper-pagination swiper-pagination-white"></div>
    </div>
</div>

先说明一下,这个页面上swiper-slide的个数是不限定的,根据获取到的数据进行循环,所以下面的js代码是先获取swiper-slide的个数,然后整个.swiper-wrapper宽度是100%,用100%除以个数就是每个swiper-slide的分页器所占的宽度。

下面是js代码:

<script type="text/javascript">
    $(function () {
        var ChildLength = $(".swiper-wrapper").children("div.swiper-slide").length;
        if (ChildLength <= 1) {
            $(".swiper-pagination").css({"display": "none"});
        } else if (ChildLength == 0) {
            $(".swiper-container").css({"display": "none"});
        }
        $(".swiper-pagination-bullet").css({"margin": "0", "borderRadius": "0", "width": 100 / ChildLength + "%"});
    });
</script>

当然,css代码也是要做一些修改的:

.wrap .swiper-container {
    overflow: visible;
}

.wrap .swiper-pagination {
    position: absolute;
    left: 0 ;
    bottom: -1rem !important;
    width: 100%;
}

.wrap .swiper-pagination-white .swiper-pagination-bullet {
    display: inline-block;
    height: 1px;
    background: #E6E6E6;
    opacity: 1;
}

.wrap .swiper-pagination-white .swiper-pagination-bullet-active {
    display: inline-block;
    height: 1px;
    opacity: 1;
    background: #F73B42;
}

有了上面这些代码以后,这个功能就实现了,实测有效。

最后,我们来看第二种情况

一开始遇到这个问题,有点蒙,还以为是很难解决的问题,好在经过简单的搜索就找到了解决办法,移动端swiper.js中的坑------你怎能错过!!!!

简而言之就是我们上面的代码只引用了swiper.js,而没有引入swiper.css和swiper.animate.js;重新引入后,问题就解决了;

根据这位作者给出的解决办法,我进行了简单的修改,同时,对所有的配制选项又做了一番了解,最终明白他这样写的原因了,废话不多说,直接看代码:
html中需要引入以下这些文件:

<head>
    <link rel="stylesheet" href="css/swiper-3.4.2.min.css">
</head>
<body>
<script src="js/jquery-3.1.1.min.js"></script>
<script src="js/swiper-3.4.2.min.js"></script>
<script src="js/swiper.animate1.0.2.min.js"></script>
</body>

其他html的结构还是上面的。下面是配制选项的写法:

<script type="text/javascript">
    var mySwiper = new Swiper('.swiper-container',{
       pagination: '.swiper-pagination',
       loop: false,
       mode: 'horizontal',
       freeMode:false, 
       touchRatio:0.5,  
       longSwipesRatio:0.1,  
       threshold:50,  
       followFinger:false, 
       observer: true,
       observeParents: true
   });
</script>

下面,一一来看这些配制选项的作用:

pagination: '.swiper-pagination',
loop: false,
mode: 'horizontal',   // 横向滑屏

freeMode:false, // 默认为false,普通模式:slide滑动时只滑动一格,并自动贴合wrapper,设置为true则变为free模式,slide会根据惯性滑动且不会贴合。

touchRatio:0.5,  // 触摸距离与slide滑动距离的比率。

longSwipesRatio:0.1,  // Swiper 中到上/下滑块的触发率,进行longSwipes时触发swiper所需要的最小拖动距离比例,即定义longSwipes距离比例。值越大触发Swiper所需距离越大。最大值0.5。

threshold:50,  //滑动的临界值,临界值单位为px,如果触屏距离小于该值滑块不会运动。

followFinger:false,  // 值为false时,仅当你释放slide时才会滑动,当你用手指按住滑块它不会动。

observer: true, //修改swiper自己或子元素时,自动初始化swiper,启动动态检查器(OB/观众/观看者),当改变swiper的样式(例如隐藏/显示)或者修改swiper的子元素时,自动初始化swiper。默认false,不开启,可以使用update()方法更新。

observeParents: true //将observe应用于Swiper的父元素,修改swiper的父元素时,自动初始化swiper

加上这些配制,就解决了我的问题。以上,就是我目前遇到的情况了。如果您有更好的解决办法,还望多多指教,谢谢了。

相关文章

网友评论

      本文标题:swiper插件的使用,安卓兼容性和修改分页器样式

      本文链接:https://www.haomeiwen.com/subject/unrltxtx.html