基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)


Posted in Javascript onNovember 17, 2016

最近由于公司项目需要图片查看器,网上搜了一圈,感觉资料很少,所以决定基于百度的touch.js手势库+zepto.js自己写了一个小插件,实现了左右滑动,双指缩放,双击缩放功能,基本使用还行,但是有时候还是不太顺畅,后续会慢慢完善;写的不好的地方望各位能够给出好的建议,谢谢!

源码地址:https://github.com/GLwen/molong_photoSwipe.git

演示:http://runjs.cn/detail/iceaaogh

molong.css

*{padding:0;margin: 0;list-style: none;}
.syswin-swipe-show{display: block;}
.syswin-swipe-hide{display: none;}
/***大图****/
.molong-swiper{ position: fixed; top:0; left: 0; border: 1px solid #777e8c; overflow: hidden; z-index: 999; }
.molong-swiper-item{ float: left; overflow: scroll; background: #333333; text-align: center; }
.molong-swiper-item .img-div{ background-size: contain; background-position: center; background-repeat: no-repeat; }

.molong-img-list { list-style: none; padding: 0; margin: 0;}
.molong-img-list li { float: left; position: relative;margin-right: 10px;}
.molong-img-list li .img-bg { display: block; width: 100%; height: 100%;border: none;background-size:cover;background-position: center;background-repeat: no-repeat;}

molong.js

var molong=molong?molong:{};
molong.photoSwipe=function(options){
  //给大图查看器添加一个独立的容器
  var bigContainerString="<div class=\"molong-swiper syswin-swipe-hide\">"+
    "<ul id=\"bigImg\"></ul>"+
    "</div>";
  $("body").append(bigContainerString);
  var swipeSelf=this;
  var screenHeight=window.innerHeight;
  var screenWidth=window.innerWidth;
  var minImageWidth=screenWidth*0.25;//显示小图的宽高
  var bigIndex=0;     //大图索引
  var bigImgOffset=0;    //大图滑动的位置
  var bigImgLength=0;  //大图数量
  //缩放设置
  var initialScale = 1;  //初始缩放比例
  var currentScale=1;   //当前缩放比例
  var pinchSelf;     //当前缩放比例的对象
  var dragSelf;     //当前拖拽的对象
  //解析参数
  swipeSelf.options=$.extend({
    listContainer:$("ul"),
    swipeRigth:true,
    swipeLeft:true,
    pinch:true
  },options);
  //容器
  swipeSelf.listContainer=options.listContainer; //小图容器

  swipeSelf.swipeContainer=$("#bigImg"); //大图容器
  //阻止touchstart默认事件
  touch.on(this.swipeContainer, 'touchstart', function(ev){
    ev.preventDefault();
  });
  swipeSelf.swipeContainer.css("-webkit-transition","all ease 0.3s");//设置动画事件
  //显示大图
  swipeSelf.showBigImg=function(){
    var imgs=swipeSelf.listContainer.find("li");
    var bigImgsUrl=[];
    var bigImgString="";
    bigImgLength=imgs.length;
    bigImgOffset=-screenWidth*bigIndex;
    for(var i=0;i<bigImgLength;i++){
      var bigImgUrl=$(imgs[i]).attr("big-url");
      bigImgsUrl.push(bigImgUrl);
      bigImgString+='<li class="molong-swiper-item"><div class="img-div" style="background-image: url('+bigImgUrl+')"></div></li>';
    }
    swipeSelf.swipeContainer.html(bigImgString);
    swipeSelf.swipeContainer.height(screenHeight);
    swipeSelf.swipeContainer.width(screenWidth*bigImgLength);
    $(".molong-swiper-item").height(screenHeight);
    $(".molong-swiper-item").width(screenWidth);
    $(".img-div").height(screenHeight);
    $(".img-div").width(screenWidth);
    swipeSelf.swipeContainer.css("-webkit-transform","translate3d("+bigImgOffset+"px,0,0)");
    $(".molong-swiper").show();
    //添加事件监听,监听查看大图
    if(swipeSelf.listenShow){
      swipeSelf.listenShow();
    }
  }
  //隐藏大图
  swipeSelf.hideBigImg=function() {
    $(".molong-swiper").hide();
    swipeSelf.swipeContainer.html("");
    if(swipeSelf.listenHide){
      swipeSelf.listenHide();
    }
  }
  //右滑动
  swipeSelf.swipeRight=function(){
    touch.on(swipeSelf.swipeContainer, 'swiperight',"li", function(ev){
      console.log("swiperight");
      if(swipeSelf.options.swipeRigth){
        //$(".img-div").css("-webkit-transform","translate3d(0px, 0px, 0px)");//元素移动复位
        swipeSelf.dx=0;
        swipeSelf.dy=0;
        console.log("向右滑动.");
        if(pinchSelf){
          pinchSelf.style.webkitTransform = 'scale(1)';
          currentScale=1;
        }
        bigImgOffset+=screenWidth;
        bigImgOffset=bigImgOffset>=0?0:bigImgOffset;
        swipeSelf.swipeContainer.css("-webkit-transition","all ease 0.5s");//设置动画事件
        swipeSelf.swipeContainer.css("-webkit-transform","translate3d("+bigImgOffset+"px,0,0)");
      }
    });
  }
  //左滑动
  swipeSelf.swipeLeft=function(){
    touch.on(swipeSelf.swipeContainer, 'swipeleft','li', function(ev){
      console.log("swipeleft");
      if(swipeSelf.options.swipeLeft){
        console.log("向左滑动.");
        // $(".img-div").css("-webkit-transform","translate3d(0px, 0px, 0px)");//元素移动复位
        swipeSelf.dx=0;
        swipeSelf.dy=0;
        if(pinchSelf){
          pinchSelf.style.webkitTransform = 'scale(1)';
          currentScale=1;
        }
        bigImgOffset-=screenWidth;
        bigImgOffset=Math.abs(bigImgOffset)>=(screenWidth*bigImgLength)?(-screenWidth*(bigImgLength-1)):bigImgOffset;
        swipeSelf.swipeContainer.css("-webkit-transition","all ease 0.5s");//设置动画事件
        swipeSelf.swipeContainer.css("-webkit-transform","translate3d("+bigImgOffset+"px,0,0)");
      }
    });
  }
  //缩放
  swipeSelf.pinche=function(){
    touch.on(swipeSelf.swipeContainer, 'pinchend',".img-div", function(ev){
      console.log("pinchend");
      if(swipeSelf.options.pinch){
        pinchSelf=this;
        currentScale = ev.scale - 1;
        currentScale = initialScale + currentScale;
        currentScale = currentScale > 2 ? 2 : currentScale;
        currentScale = currentScale < 1 ? 1 : currentScale;
        swipeSelf.swipeContainer.css("-webkit-transition","all ease 0.1s");//设置动画事件
        this.style.webkitTransform = 'scale(' + currentScale + ')';
        console.log("当前缩放比例为:" + currentScale + ".");
      }
    });
  }
  //双击放大缩小
  swipeSelf.doubletap=function(){
    touch.on(swipeSelf.swipeContainer, 'doubletap','.img-div', function(ev){
      //console.log(ev.type);
      pinchSelf=this;
      currentScale=currentScale>1?2:1;
      if(currentScale==1){
        currentScale=2;
        swipeSelf.swipeContainer.css("-webkit-transition","all ease 0.1s");//设置动画事件
        this.style.webkitTransform = 'scale(' + currentScale + ')';
      }else{
        currentScale=1;
        swipeSelf.swipeContainer.css("-webkit-transition","all ease 0.1s");//设置动画事件
        this.style.webkitTransform = 'scale(' + currentScale + ')';
      }
    });
  }
  //拖拽
  swipeSelf.dx=0;
  swipeSelf.dy=0;
  swipeSelf.drag=function(){
    touch.on(swipeSelf.swipeContainer, 'drag','.img-div', function(ev){
      if(currentScale>1){
        console.log("drag");
        dragSelf=this;
        swipeSelf.options.swipeLeft=false;
        swipeSelf.options.swipeRigth=false;
        swipeSelf.dx = swipeSelf.dx || 0;
        swipeSelf.dy = swipeSelf.dy || 0;
        console.log("当前x值为:" + swipeSelf.dx + ", 当前y值为:" + swipeSelf.dy +".");
        var offx = swipeSelf.dx + ev.x + "px";
        var offy = swipeSelf.dy + ev.y + "px";
        this.style.webkitTransform = "translate3d(" + offx + "," + offy + ",0)"+" scale(" +currentScale +")";
      }
    });
    touch.on(swipeSelf.swipeContainer, 'dragend','.img-div', function(ev){
      console.log("dragend");
      swipeSelf.dx += ev.x;
      swipeSelf.dy += ev.y;
      swipeSelf.options.swipeLeft=true;
      swipeSelf.options.swipeRigth=true;
    });
  }
  //触发,查看大图
  swipeSelf.init=function(){
    //设置小图
    swipeSelf.listContainer.find(".img-bg").width(minImageWidth);
    swipeSelf.listContainer.find(".img-bg").height(minImageWidth);
    //添加绑定查看大图事件
    swipeSelf.listContainer.on("tap","li",function(){
      bigIndex=$(this).index();
      swipeSelf.showBigImg();
    });
    swipeSelf.swipeRight();//右滑动
    swipeSelf.swipeLeft();//左滑动
    swipeSelf.pinche();//缩放
    swipeSelf.drag();//拖拽
    swipeSelf.doubletap();//双击放大缩小
  }
  //事件监听
  swipeSelf.listen=function(type,callback){
    swipeSelf[type]=callback;
  }
}

index.html

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>图片查看器</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
  <meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
  <meta name="format-detection" content="telephone=no,email=no,adress=no">
  <link rel="stylesheet" href="css/molong.css">
</head>
<body>
<ul id="imgList" class="molong-img-list">
  <li big-url="imges/1.jpg"><div class='img-bg' style="background-image:url(imges/1.jpg);"></div></li>
  <li big-url="imges/2.jpg"><div class='img-bg' style="background-image:url(imges/2.jpg);"></div></li>
  <li big-url="imges/3.jpg"><div class='img-bg' style="background-image:url(imges/3.jpg);"></div></li>
</ul>
<ul style="position: absolute;top:300px;left:0;z-index: 9999999;">
  <li><input style="height: 40px;width: 90px;text-align: center;" type="button" value="addImg" id="addBtn"/></li>
  <li style="margin-top: 30px;"><input style="height: 40px;width: 90px;text-align: center;" type="button" value="closeImg" id="addClose"/></li>
</ul>
<script src="js/zepto.min.js"></script>
<script src="js/touch.min.js"></script>
<script src="js/molong.js"></script>
<script>
  $(function(){
    //添加大图容器
    var screenHeight=window.innerHeight;
    var screenWidth=window.innerWidth;
    var minImageWidth=screenWidth*0.25;//显示小图的宽高
    var mySwipe=new molong.photoSwipe({listContainer:$("#imgList")});
    mySwipe.init();
    //关闭图片查看器
    $("#addClose").on("tap",function(){
      mySwipe.hideBigImg();
    });
    $("#addBtn").on("click",function(){
      console.log(this);
      var addImg1='<li big-url="imges/4.jpg"><div class="img-bg" style="background-image:url(imges/4.jpg);"></div></li>';
      mySwipe.listContainer.append(addImg1);
      mySwipe.listContainer.find(".img-bg").width(minImageWidth);
      mySwipe.listContainer.find(".img-bg").height(minImageWidth);
    })
    //显示大图监听
    mySwipe.listen("listenShow",function(){
      alert("打开大图");
    });
    //关闭大图监听
    mySwipe.listen("listenHide",function(){
      alert("关闭大图");
    });
  });
</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
超级简单的图片防盗(HTML),好用
Apr 08 Javascript
fix-ie5.js扩展在IE5下不能使用的几个方法
Aug 20 Javascript
jQuery.buildFragment使用方法及思路分析
Jan 07 Javascript
jquery提交form表单时禁止重复提交的方法
Feb 13 Javascript
js的window.showModalDialog及window.open用法实例分析
Jan 29 Javascript
JavaScript的Vue.js库入门学习教程
May 23 Javascript
jQuery基础知识点总结(DOM操作)
Jun 01 Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 Javascript
JavaScript 隐性类型转换步骤浅析
Mar 15 Javascript
基于vue cli 通过命令行传参实现多环境配置
Jul 12 Javascript
vue.js实现简单的计算器功能
Feb 22 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
Nov 07 Javascript
移动端js图片查看器
Nov 17 #Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
Nov 17 #Javascript
JavaScript实现解析INI文件内容的方法
Nov 17 #Javascript
详解AngularJS中的表单验证(推荐)
Nov 17 #Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
Nov 17 #Javascript
用Vue.js实现监听属性的变化
Nov 17 #Javascript
JS实现类似51job上的地区选择效果示例
Nov 17 #Javascript
You might like
php邮箱地址正则表达式验证
2015/11/13 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
javascript 获取表单file全路径
2009/12/31 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
javascript定时器完整实例
2015/02/10 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
Node.js JSON模块用法实例分析
2019/01/04 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
Python类装饰器实现方法详解
2018/12/21 Python
Python元组知识点总结
2019/02/18 Python
Python常用的json标准库
2019/02/19 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
django中related_name的用法说明
2020/05/20 Python
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
什么是.net
2015/08/03 面试题
网络维护管理员的自我评价分享
2013/11/11 职场文书
大学运动会通讯稿
2014/01/28 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
2015年商场工作总结
2015/04/27 职场文书
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers