Swiper 3 的特色功能、示例

时间:2022-09-01 07:42:33

  • 无需加载公用库:Swiper无需加载任何公共库(如jquery)即可运行,这保证了Swiper的轻量和运行速度。Swiper也可以在加载了公共库的环境下安全的运行,如jQuery, Zepto, jQuery Mobile等。
  • 1:1的触摸滑动:Swiper默认的触摸比例为1:1,你可以通过修改Swiper的设置来改变这个比例。
  • 监视器:Swiper3 增加了开启监视器的选项,有了这个功能Swiper可以在你动态改变DOM或Swiper的样式时自动重新初始化并计算所需的元素。
  • 丰富的API:Swiper 拥有丰富的API,他允许你建立自己独特的分页器、导航、视差滚动、或其他精彩的效果
  • 真正支持RTL(从右向左)布局:Swiper是唯一一个支持100%RTL布局的滑动插件。
  • 多行slides布局:Swiper允许多行Slides布局,这样每行的slide就会较少。
  • 过渡效果:增加了三种新的过渡效果:淡入、3D方块、3D流。
  • 两种控制方式:现在Swiper可以用来控制其他的Swiper,甚至可以同时控制。
  • 完整的导航控制:Swiper带有所有常用的导航控制器,包括分页器,切换箭头,滚动条。
  • Flexbox布局:Swiper使用流行的flexbox布局,这样就解决了很多计算尺寸方面的问题。这种布局也允许用CSS来设定Slides。
  • Flexbox网格(伸缩布局):你可以在Swiper初始化的时候设定slide的显示,包括每行、每列、每组数量以及他们的间距等。
  • 其他的特性:Swiper3还包含了所有swiper2的牛逼功能,包括自适应、滚动反弹、抵抗反弹、loop模式、嵌套Swiper。

看了这么多Swiper的兼容、独立、可操作性等功能特性,真是移动端(现在也支持PC端的拖放事件了)开发的中利器之一,开始吸星大法学习他。

1. Swiper使用方法

    a) 首先加封swiper.min.js脚本和swiper.min.css文件(废话)

    b) 如果你的页面加载了jQuery.js或者zepto.js,你可以选择使用更轻便的swiper.jquery.min.js。

    c) 加段html代码

    d) 初始化Swiper:最好是挨着</body>标签


上示例,我用swiper.js 和 zepto.js 做了个小的电影图片切换,功能在一点一点儿的加,有缺点请大家指出来,我会虚心向大家学习:

文件有:

  css 文件夹 / index.css

  dist 文件夹 /  css  文件夹 /swiper.min.css

                       /    js 文件夹  / swiper.js、zepto.min.js

                                       /  zepto_lib /touch.js


其中只有 index.html 和 index.css 是自己写的,其他文件是第三方CSS、JS库(版本:Swiper 3.4.0,Zepto v1.1.6)。

        

index.html代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no" />
<title>Swiper Example from henry</title>
    <link href="dist/css/swiper.min.css" rel="stylesheet" />    <link href="css/index.css" rel="stylesheet" />    <style>      .swiper-container {        width: 100%;        height: 100%;      }    </style></head><body>    <div id="wrap">        <div id="header">            <div class="top">
                <!-- 左侧logo -->                <div class="top_logo"></div>
                <!-- 右侧 小导航 或 外链 -->                <div class="top_right">                    <a class="link_text" href="#">APP下载</a>                    <a class="link_text" href="#">关于</a>                    <a class="link_text" href="#">社区</a>                </div>            </div>
            <!--导航栏 tab menu list 可横向拖动,点击tab可切换页面 内容-->            <nav>              <div class="nav_inner">                <div class="nav_list swiper-container-horizontal" id="swiper-container-tab">                  <div class="swiper-wrapper">                      <a href="#" class="slide-a" target="_self"><span class="nav-item active-nav" data-category="-1">最新</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-2">广播</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-3">推荐</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-4">新闻</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-5">综艺</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-6">更多1</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-7">更多2</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-8">更多3</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-9">更多4</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-10">更多5</span></a>                      <a href="#" class="slide-a" target="_self"><span class="nav-item" data-category="-11">END</span></a>                    </div>                </div>              </div>            </nav>        </div>        <!--主体内容-->        <div id="main">            <!--内容页面 1-->            <div class="swiper-container swiper-container-h" id="tab1">              <div class="swiper-wrapper">                <div class="swiper-slide" data-hash="tab1">                  <!-- tab content -->                  <div class="swiper-container swiper-container-v contentFilm">                    <div class="swiper-wrapper" id="contentFilmDiv">                      <!-- 电影图片列表 -->                    </div>                    <div class="swiper-scrollbar"></div>                  </div>                </div>                <!-- tab2 -->                <div class="swiper-slide" data-hash="tab2">                  <!-- tab content -->                  slide2                </div>                <!-- tab3 -->                <div class="swiper-slide" data-hash="tab3">                  slide3                </div>
                <div class="swiper-slide" data-hash="tabN">
                  ......                </div              </div>            </div>        </div>        <div class="downloadTip" id="downloadTip" style="display: block;">            <div class="downloadBG"></div>            <div class="downloadContent">                <div class="download_LO">                    <img src="./images/download_logo.png">                    <div class="downTest">                        <p>安装My APP</p>                        <p>观看VSSS视频更流畅</p>                    </div>                    <a class="downloadBtn" href="#">免费安装</a>                    <div class="downLoadClose" id="downLoadClose"></div>                </div>            </div>        </div>    </div></body></html><script src="dist/js/swiper.js"></script><script src="dist/js/zepto.min.js"></script><script src="dist/js/zepto_lib/touch.js"></script><script type="text/javascript">  document.ontouchmove=function(e){e.preventDefault();};  window.onload = function(){    //-----------------------------------    LoadFilms();    //-----------------------------------
    
    //使用zepto.js里的tap 和 click 事件绑定(保证移动端和桌面端都支持点击). 注: zepto.js 提供基本功能,但tap这种的屏幕事件需要实际使用时另外加载(touch.js)    $('#downloadTip').on('tap click',function(e){e.preventDefault();});    $('.downLoadClose').on('tap click',function(e){      document.querySelector('#downloadTip').style.display = 'none';      e.preventDefault();//避免 点透     });    $('.downloadBtn').on('tap click',function(e){      window.location.href = '#';    });  };
  function handleResponse(response){    var ss_html = new StringBuffer();    var ss_len = 0;    $.each(response,function(index, item){      ss_html.append('<div class=\"swiper-slide\">');      ss_html.append( '<a href=\"'+item.href+'\">');      ss_html.append(   '<img class=\"swiper-lazy\" data-src=\"'+item.img+'\" alt=\"'+item.name+'\" />');      ss_html.append(   '<p class=\"video_title swiper-no-swiping\">'+item.name+'</p>');      ss_html.append(   '<div class=\"swiper-lazy-preloader\"></div>');      ss_html.append( '</a>');      ss_html.append('</div>');      ss_len++;    });    var contentFilmDiv = document.querySelector('#contentFilmDiv');//这里暂时用ID做的动态绑定film list,后期我感觉还得用类名做绑定(根据从服务端读取的电影列表信息,绑定到指定的tab content)    contentFilmDiv.innerHTML = ss_html.toString();    //===================================================================================
 
    //tab menu    var swiper_init_h = {      direction: 'horizontal',      spaceBetween: 0,      speed: 500,      //longSwipesRatio : 0.5,//触发swiper所需要的最小拖动距离比例, 值越大触发Swiper所需距离越大。最大值0.5      touchAngle : 10,//允许触发拖动的角度值。默认45度,即使触摸方向不是完全水平也能拖动slide。      /*swiper可以嵌套。        nested 用于嵌套相同方向的swiper时,当切换到子swiper时停止父swiper的切换。请将子swiper的nested设置为true。由于需要在slideChangeEnd时判断作用块,因此快速滑动时这个选项无效。
        在做 横向swiper 内嵌 纵向swiper 时,发现有横纵向在一起的情况下会有冲突
       
        我这里发现了个BUG, 是有纵向时横向不能拖动了!
最初我自己想通过判断在拖动时(touchstart,touchmove)两个swiper对象的 X, Y 的拖动距离的大小作为对比得出用户是横向 还是纵向拖动,确定好了再屏蔽对应方向的swipe事件,

         试了几次屏蔽总不成功,后用了swiper.js 的nested:true解决了这个问题。
      */      nested: true,      preventClicks: true,//默认为true,当swiping时阻止意外的链接点击      preventClicksPropagation: true,//阻止click冒泡。拖动Swiper时阻止click事件      hashnav: true, //URL hash link      hashnavWatchState: true,      onSlideChangeStart: function(swiper){//切换Tab导航菜单CSS        //var arrNavListItem = $('.nav_list .nav-item')||null; arrNavListItem.eq(swiper.previousIndex).removeClass('nav_on'); arrNavListItem.eq(swiper.activeIndex).addClass('nav_on');        $("#swiper-container-tab .active-nav").removeClass('active-nav');        var activeNav = $("#swiper-container-tab .slide-a").eq(swiper.activeIndex).addClass('active-nav');      }    };
    //film list (tab content 里的 电影列表swiper事件参数设置)    var swiper_init_v = {      scrollbar: '.swiper-scrollbar',      direction: 'vertical',      spaceBetween : 0, //slider 与 slider 之间的间隔距离
      //preventClicks: true,//默认为true,当swiping时阻止意外的链接点击      preventClicksPropagation: true,//阻止click冒泡。拖动Swiper时阻止click事件
      slidesPerView: 'auto',      watchSlidesVisibility: true,      mousewheelControl: true,      grabCursor : true,      freeMode: true,      //autoHeight: true, //高度随内容变化      preloadImages:false,      //updateOnImagesReady: true,//当所有的内嵌图像(img标签)加载完成后Swiper会重新初始化。使用此选项需要先开启preloadImages: true
      //图片延迟加载 功能      lazyLoading: true,// Enable lazy loading      //lazyLoadingInPrevNext: true,      lazyLoadingOnTransitionStart: true, //激发没有加载的图片加载      lazyLoadingInPrevNextAmount: 4, //提前加载图片的数量,没感觉到这里的数量有变化      onLazyImageLoad: function(swiper, slide, image){        //alert('延迟加载图片');        //console.log(swiper);//Swiper实例        //console.log(slide);//哪个slide里面的图片在加载        //console.log(image);//哪个图片在加载
        /*
        //一开始自己计算容器调试了,为了延迟加载图片后更新容器的尺寸,后发现swiper.js有自己的更新方法 swiper.updateSlidesSize();
contentFilmDiv = document.querySelector('#contentFilmDiv'); var ss_h = mCss(contentFilmDiv.querySelectorAll('.swiper-slide')[0],'height'); mCss(contentFilmDiv,'height',ss_h*(ss_len/2+2)); */ }, onLazyImageReady: function(swiper){
        //延迟加载图片后更新容器的尺寸
swiper.updateContainerSize();
swiper.updateSlidesSize();
}
};
var swiperV = new Swiper('.swiper-container-v', swiper_init_v);//创建film list (direction: vertical)的swiper
var swiperH = new Swiper('.swiper-container-h', swiper_init_h);//创建tab content (direction: horizontal)的swiper


//tab menu
var swiperTab = new Swiper('#swiper-container-tab', {
watchSlidesProgress: true, //这两个属性是为了与 tab menu 同步切换用的
watchSlidesVisibility: true,
slideClass: 'slide-a', //这里用自定义的类 slide-a 取代了 slide的默认类 .slide (swiper.js还是挺人性化的
slidesPerView: 1, //一次显示一个slide content 这是针对 tab content (direction: horizontal)的
grabCursor : true,
freeMode: true, //tab menu 电影分类 横向列表,分类多了超宽时,可*拖动
      onTap: function(swiper, e){//swiper 自己定义的tap事件
if(swiper.clickedIndex!=swiperH.activeIndex) {//加个判断,避免重复点击同一tab menu
swiperH.slideTo(swiper.clickedIndex);//根据当前点击有Tab index切换 内容显示区
}
else {
return;
}
}
}); }
  //用JSONP方式从其它网站获取JSON数据信息
function hInitJSONP(src){
var script = document.createElement("script");
script.src = src;
document.body.insertBefore(script, document.body.firstChild);
}
  function LoadFilms(){
    //从远程、非同域的服务器 加载 b.json 文件    hInitJSONP("http://www.xxx.com/json/b.json?callback=handleResponse"); //注:这里的URL是假的,我是想试一试JSONP的,想要真的自己找个服务器和域名/IP 试
    /*我在服务端加了个静态的json文件保存film list的内容信息,内容大致如下:(内容不多,挺简单的)
    handleResponse([
    { name:'足球专辑', img:'./images/1.jpg', href:"m-video.html" },    { name:'流星时代', img:'./images/2.jpg', href:"m-video.html" },    { name:'电视热剧', img:'./images/3.jpg', href:"m-video.html" },    { name:'最新影片', img:'./images/4.jpg', href:"m-video.html" },    { name:'2016中国', img:'./images/5.jpg', href:"m-video.html" },    { name:'LiveShow', img:'./images/6.jpg', href:"m-video.html" },    { name:'美少女', img:'./images/7.jpg', href:"m-video.html" },
     { ...... }
    ]);
    */
  }//end function</script><script>
//用于拼接string串的,比用 加号 "+" 拼接string串效率要高function StringBuffer(){this._string = new Array;}StringBuffer.prototype.append = function(str){this._string.push(str);};StringBuffer.prototype.toString = function(){return this._string.join("");};/*用于处理CSS属性的读 和 写 的通用函数  读:两个参数mCss(element,attr) 获取当前元素对应的attr样式 返回值 number  写:三个参数mCss(element,attr,val) 设置当前元素对应的attr样式,不用加单位(px、deg、无单位)*/function mCss(element, attr , val){if(attr=='scale'|| attr=='rotate'|| attr=='rotateX'|| attr=='rotateY'|| attr=='rotateZ'|| attr=='scaleX'|| attr=='scaleY'|| attr=='translateY'|| attr=='translateX'|| attr=='translateZ'){return setTransform(element, attr , val);}if(arguments.length == 2){var val = element.currentStyle?element.currentStyle[attr]:getComputedStyle(element)[attr];if(attr=='opacity'){val = Math.round(val*100);}return parseFloat(val);} else {switch(attr){case 'width':case 'height':case 'paddingLeft':case 'paddingTop':case 'paddingRight':case 'paddingBottom':case 'borderWidth':case 'borderLeftWidth':case 'borderRightWidth':case 'borderTopWidth':case 'borderBottomWidth':val = val < 0 ? 0 : val;case 'left':case 'top':case 'marginLeft':case 'marginTop':case 'marginRight':case 'marginBottom':element.style[attr] = val +"px";break;case 'opacity':element.style.filter= "alpha(opacity:"+val+")";element.style.opacity= val/100;break;default:element.style[attr]=val;}}}function setTransform(element,attr,val){if(!element["transform"]){element["transform"] = {};}if(typeof val == "undefined"){val = element["transform"][attr];if(typeof val == "undefined"){val = 0;element["transform"][attr] = 0;}return val;} else {var str = "";element["transform"][attr] = val;for(var s in element["transform"]) {switch(s){case 'rotate':case 'rotateX':case 'rotateY':case 'rotateZ':str += s+"("+element["transform"][s]+"deg) ";break;case 'translateX':case 'translateY':case 'translateZ':str += s+"("+element["transform"][s]+"px) ";break;default:str += s+"("+element["transform"][s]+") ";}}element.style.MozTransform = element.style.msTransform  = element.style.WebkitTransform = element.style.transform = str;}}</script>

index.css的代码:

@-ms-viewport {
width: device-width;
}

address, caption, cite, code, dfn, em, strong, th, var {
font-style: normal;
font-weight: normal;
}
/* clearfix */
.clearfix:before, .clearfix:after {
content:"";
display:table;
}
.clearfix:after{
clear:both;
overflow:hidden;
}
.clearfix{
zoom:1;
}

img {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
}

ol, ul {
list-style: none;
}

html {
height: 100%;
font-size: 100%; background:#f7f7f7;
}

body {
position: relative;
background-color: #fff;
margin: 0;
width: 100%;
height: 100%;

overflow: hidden;
-ms-touch-action: none;
font-family: Arial, Helvetica, sans-serif;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
font-size: 14px;
}

#wrap{
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}

#header {
position: absolute;
top: 0;
left: 0;
right: 0;
width: 100%;

}

#header .top {
position: relative;
background: #68c5ff;
color: #fff;
line-height: 2.75rem;
height: 2.75rem;
width: 100%;
display: -webkit-box;
display: box;
-webkit-box-pack: start;
box-pack: start;
-webkit-box-orient: horizontal;
box-orient: horizontal;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
#header .top_logo {
width: 79.5px;
height: 100%;
margin-left: 10px;
background-image: url("../images/header_logo.png");
background-repeat: no-repeat;
background-position: center;
background-size: contain;
}
#header .top_right {
position: absolute;
right: 0;
top: 0;
}
#header .top_center {
-webkit-box-flex: 1;
}
#header .link_text {
margin-right: 10px;
font-size: 14px;
font-weight: bold;
color: white;
}
#header .nav_inner {
overflow: hidden;
/*
overflow-x: scroll;
overflow-y: hidden;
*/
-webkit-overflow-scrolling: touch;
-moz-overflow-scrolling: touch;
background-color: #f7f7f7;
border-bottom: 1px solid #d2d2d2;
height: 34px;
}
#header .nav_list {
white-space: nowrap;
}
#header .nav_list a.slide-a {
white-space: nowrap;
display: inline-block;
padding: 0 10px;
color: #6a7989;
text-decoration: none;
font-size: 13px;
height: 27px;
line-height: 26px;
margin: 5px 0px 5px 5px;
}
#header .nav_list .nav_on, #header .nav_list .active-nav {
border-bottom: 2px solid #1daffc;
color: #1daffc;
}

.selected {
color: #68c5ff;
}
.selected:after {
position: absolute;
bottom: 0px;
left: 0px;
content: "";
width: 100%;
height: 2px;
margin: auto;
/*border-radius: 2px;*/
background-color: #68c5ff;
background-repeat: repeat-x;
}

#main {
position: absolute;
top: 79px;
right: 0;
left: 0;
bottom: 0;
overflow: hidden;
}

.contentFilm{ /*swiper-container*/
position:absolute;
top: 5px;
right: 0px;
left: 0;
bottom: 0; /*50px;*/
}
.contentFilm>.swiper-wrapper{
position: relative;
display: -webkit-block;
display: -moz-block;
display: -ms-block;
display: -webkit-block;
display: block;
width: 100%; max-width:100%;
height: auto;

}
.contentFilm .swiper-slide{
width: 50%;
height: auto;
float: left;
box-sizing: border-box;
margin-bottom: 5px;
}
.contentFilm .swiper-slide a {
display: block;
margin-left: 2px;
}
.contentFilm .swiper-slide img {
display: inline-block;
width: 100%;
background-position:center center;
background-size: cover;
}

.contentFilm>.loading {
display: none;
text-align: center;
line-height: 24px;
color: #999;
padding: 10px 0;
}

#footer {
position: absolute;
right; 0;
bottom: 0;
left: 0;
width:100%;
overflow: auto;
}
#footer .copyright {
position: relative;
border-top: 1px solid #d2d2d2;
background-color: #f7f7f7;
height: 50px;
width: 100%;
text-align: center;
font-size: 10px;
color: #5b5b5b;
}
#footer .crt {
margin: 6px auto;
}

#downloadTip {
position: fixed;
bottom: 0px;
width: 100%;
height: 45px;
display: none;
max-width: 640px;
z-index: 999;
}
#downloadTip .downloadBG {
position: absolute;
width: 100%;
height: 100%;
opacity: 0.6;
background-color: black;
}
#downloadTip .downloadContent {
position: relative;
height: 45px;
line-height: 45px;
vertical-align: middle;
width: 100%;
}
#downloadTip .downLoadClose {
float: left;
width: 12px;
height: 20px;
margin-left: 10px;
background-repeat: no-repeat;
background-position: center;
background-size: contain;
background-image: url("../images/close_btn.png");
position: absolute;
right: 5px;
top: 1px;
}
#downloadTip .downloadLogo {
width: 158.5px;
float: left;
height: 100%;
margin-left: 10px;
background-repeat: no-repeat;
background-position: center;
background-size: contain;
background-image: url("../images/download_logo.png");
}
#downloadTip .downloadBtn {
position: absolute;
right: 33px;
top: 9.5px;
width: 75px;
height: 26px;
line-height: 26px;
text-align: center;
border-radius: 20px;
background-color: white;
font-size: 12px;
color: #5b5b5b;
}
#downloadTip .download_LO img {
WIDTH: 38px;
float: left;
}
#downloadTip .download_LO {
padding: 7px;
color: #fff;
display: inline-block;
}
#downloadTip .downTest {
float: left;
font-size: 0.75rem;
line-height: 17px;
}