Swiper 3 的特色功能、示例

13 篇文章 0 订阅
5 篇文章 0 订阅

  • 无需加载公用库: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;
}


    


















































































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值