参考过的一篇文章:https://blog.csdn.net/gl0ry/article/details/56055414

html实例代码:

缩放的图片需要放在class 为list 的div里面

<!doctype html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" /><title>图片缩放</title><link rel="stylesheet" href="css/scale.css" type="text/css" />
</head>
<body><div class="list"><img src="img/2.jpg" /></div><section class="imgzoom_pack"><div class="imgzoom_x">X</div><div class="imgzoom_img"><img src="" /></div></section><script src="js/scale.js"></script><script>document.addEventListener("DOMContentLoaded", function(event){ImagesZoom.init({"elem": ".list"});}, false);</script>
</body>
</html>

实现缩放 需要导入 scale.css 和 scale.js

scale.css代码:

/**rest**/
body, ul, li, section, div{padding:0;margin:0;
}
body{font-family:Arial,Roboto,'Droid Sans','Hiragino Sans GB',STXihei,'sans-serif';width:100%;-webkit-user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;
}
ul,li{list-style:none;
}
img{border:0;
}.list{width:100%;padding:10px 0;
}
.list li{display:block;margin-bottom:10px;box-shadow:0 1px 2px rgba(0,0,0,.1), 0 -1px 2px rgba(0,0,0,.1);
}
.list li img{width:100%;height:auto;
}/*弹框样式*/
.imgzoom_pack{width:100%;height:100%;position:fixed;left:0;top:0;background:rgba(0,0,0,.7);display:none;
}
.imgzoom_pack .imgzoom_x{color:#fff;height:30px;width:30px;line-height:30px;background:#000;text-align:center;position:absolute;right:5px;top:5px;z-index:10;cursor:pointer;
}
.imgzoom_pack .imgzoom_img{width:100%;height:100%;position:absolute;left:0;top:0;overflow:hidden;
}
.imgzoom_pack .imgzoom_img img{width:100%;position:absolute;top:50%;
}

scale.js的代码:

我对scale.js 做了一点修改 实现了同比例缩放:

self.element.style.height = imgHeight + "px" //实现同比例缩放 需要改变图片width的同时 改变height
self.element.style.height = self.imgBaseHeight + "px" //实现同比例缩放 需要改变图片width的同时 改变height
(function(window, undefined){var document = window.document,support = {transform3d: ("WebKitCSSMatrix" in window && "m11" in new WebKitCSSMatrix()),touch: ("ontouchstart" in window)};function getTranslate(x, y){var distX = x, distY = y;return support.transform3d ? "translate3d("+ distX +"px, "+ distY +"px, 0)" : "translate("+ distX +"px, "+ distY +"px)";}function getPage(event, page) {return support.touch ? event.changedTouches[0][page] : event[page];}var ImagesZoom = function(){};ImagesZoom.prototype = {// 给初始化数据init: function(param){var self   = this,params = param || {};var imgList   = document.querySelectorAll(params.elem + " img"),zoomMask  = document.querySelector(".imgzoom_pack"),zoomImg   = document.querySelector(".imgzoom_pack .imgzoom_img img"),zoomClose = document.querySelector(".imgzoom_pack .imgzoom_x"),imgSrc    = "";self.buffMove   = 3; //缓冲系数self.buffScale  = 1.1; //放大系数self.finger = false; //触摸手指的状态 false:单手指 true:多手指self._destroy();zoomClose.addEventListener("click", function(){zoomMask.style.cssText = "display:none";zoomImg.src = "";zoomImg.style.cssText = "";self._destroy();document.removeEventListener("touchmove", self.eventStop, false);}, false);for(var len=imgList.length,i=0; i<len; i++){imgList[i].addEventListener("click", function(){imgSrc = this.getAttribute("src");zoomMask.style.cssText = "display:block";zoomImg.src = imgSrc;zoomImg.onload = function(){zoomImg.style.cssText = "margin-top:-"+(zoomImg.offsetHeight/2)+"px";// 禁止页面滚动document.addEventListener("touchmove", self.eventStop, false);self.imgBaseWidth  = zoomImg.offsetWidth;self.imgBaseHeight = zoomImg.offsetHeight;self.addEventStart({wrapX: zoomMask.offsetWidth,wrapY: zoomMask.offsetHeight,mapX: zoomImg.width,mapY: zoomImg.height});}}, false);}},addEventStart: function(param){var self   = this,params = param || {};self.element = document.querySelector(".imgzoom_pack img");//config setself.wrapX = params.wrapX || 0;     //可视区域宽度self.wrapY = params.wrapY || 0;     //可视区域高度self.mapX  = params.mapX || 0;      //地图宽度self.mapY  = params.mapY || 0;      //地图高度self.outDistY = (self.mapY - self.wrapY)/2; //图片超过一屏的时候有用self.width  = self.mapX - self.wrapX;   //地图的宽度减去可视区域的宽度self.height = self.mapY - self.wrapY;   //地图的高度减去可视区域的高度self.element.addEventListener("touchstart",function(e){self._touchstart(e);},false);self.element.addEventListener("touchmove",function(e){self._touchmove(e);},false);self.element.addEventListener("touchend",function(e){self._touchend(e);},false);},// 重置坐标数据_destroy: function(){this.distX = 0;this.distY = 0;this.newX  = 0;this.newY  = 0;},// 更新地图信息_changeData: function(){this.mapX     = this.element.offsetWidth;     //地图宽度this.mapY     = this.element.offsetHeight;      //地图高度// this.outDistY = (this.mapY - this.wrapY)/2; //当图片高度超过屏幕的高度时候。图片是垂直居中的,这时移动有个高度做为缓冲带this.width    = this.mapX - this.wrapX;   //地图的宽度减去可视区域的宽度this.height   = this.mapY - this.wrapY;   //地图的高度减去可视区域的高度},_touchstart: function(e){var self = this;e.preventDefault();var touchTarget = e.targetTouches.length; //获得触控点数self._changeData(); //重新初始化图片、可视区域数据,由于放大会产生新的计算if(touchTarget == 1){// 获取开始坐标self.basePageX = getPage(e, "pageX");self.basePageY = getPage(e, "pageY");self.finger = false;}else{self.finger = true;self.startFingerDist = self.getTouchDist(e).dist;self.startFingerX    = self.getTouchDist(e).x;self.startFingerY    = self.getTouchDist(e).y;}console.log("pageX: "+getPage(e, "pageX"));console.log("pageY: "+getPage(e, "pageY"));},_touchmove: function(e){var self = this;e.preventDefault();e.stopPropagation();console.log("event.changedTouches[0].pageY: "+event.changedTouches[0].pageY);var touchTarget = e.targetTouches.length; //获得触控点数if(touchTarget == 1 && !self.finger){self._move(e);}if(touchTarget>=2){self._zoom(e);}},_touchend: function(e){var self = this;self._changeData(); //重新计算数据if(self.finger){self.distX = -self.imgNewX;self.distY = -self.imgNewY;}if( self.distX>0 ){self.newX = 0;}else if( self.distX<=0 && self.distX>=-self.width ){self.newX = self.distX;self.newY = self.distY;}else if( self.distX<-self.width ){self.newX = -self.width;}self.reset();},_move: function(e){var self = this,pageX = getPage(e, "pageX"), //获取移动坐标pageY = getPage(e, "pageY");// 禁止默认事件// e.preventDefault();// e.stopPropagation();// 获得移动距离self.distX = (pageX - self.basePageX) + self.newX;self.distY = (pageY - self.basePageY) + self.newY;if(self.distX > 0){self.moveX = Math.round(self.distX/self.buffMove);}else if( self.distX<=0 && self.distX>=-self.width ){self.moveX = self.distX;}else if(self.distX < -self.width ){self.moveX = -self.width+Math.round((self.distX+self.width)/self.buffMove);}self.movePos();self.finger = false;},// 图片缩放_zoom: function(e){var self = this;// e.preventDefault();// e.stopPropagation();var nowFingerDist = self.getTouchDist(e).dist, //获得当前长度ratio         = nowFingerDist / self.startFingerDist, //计算缩放比imgWidth      = Math.round(self.mapX * ratio), //计算图片宽度imgHeight     = Math.round(self.mapY * ratio); //计算图片高度// 计算图片新的坐标self.imgNewX = Math.round(self.startFingerX * ratio - self.startFingerX - self.newX * ratio);self.imgNewY = Math.round((self.startFingerY * ratio - self.startFingerY)/2 - self.newY * ratio);if(imgWidth >= self.imgBaseWidth){self.element.style.width = imgWidth + "px";self.element.style.height = imgHeight + "px" //实现同比例缩放 需要改变图片width的同时 改变heightself.refresh(-self.imgNewX, -self.imgNewY, "0s", "ease");self.finger = true; }else{if(imgWidth < self.imgBaseWidth){ //缩放时 当前图片的宽度width 小于 原本的图片宽度时self.element.style.width = self.imgBaseWidth + "px";self.element.style.height = self.imgBaseHeight + "px" //实现同比例缩放 需要改变图片width的同时 改变height}}self.finger = true;},// 移动坐标movePos: function(){var self = this;if(self.height<0){if(self.element.offsetWidth == self.imgBaseWidth){self.moveY = Math.round(self.distY/self.buffMove);}else{var moveTop = Math.round((self.element.offsetHeight-self.imgBaseHeight)/2);self.moveY = -moveTop + Math.round((self.distY + moveTop)/self.buffMove);}}else{var a = Math.round((self.wrapY - self.imgBaseHeight)/2),b = self.element.offsetHeight - self.wrapY + Math.round(self.wrapY - self.imgBaseHeight)/2;if(self.distY >= -a){self.moveY = Math.round((self.distY + a)/self.buffMove) - a;}else if(self.distY <= -b){self.moveY = Math.round((self.distY + b)/self.buffMove) - b;}else{self.moveY = self.distY;}}self.refresh(self.moveX, self.moveY, "0s", "ease");},// 重置数据reset: function(){var self = this,hideTime = ".2s";if(self.height<0){self.newY = -Math.round(self.element.offsetHeight - self.imgBaseHeight)/2;}else{var a = Math.round((self.wrapY - self.imgBaseHeight)/2),b = self.element.offsetHeight - self.wrapY + Math.round(self.wrapY - self.imgBaseHeight)/2;if(self.distY >= -a){self.newY = -a;}else if(self.distY <= -b){self.newY = -b;}else{self.newY = self.distY;}}self.refresh(self.newX, self.newY, hideTime, "ease-in-out");},// 执行图片移动refresh: function(x, y, timer, type){this.element.style.webkitTransitionProperty = "-webkit-transform";this.element.style.webkitTransitionDuration = timer;this.element.style.webkitTransitionTimingFunction = type;this.element.style.webkitTransform = getTranslate(x, y);},// 获取多点触控getTouchDist: function(e){var x1 = 0,y1 = 0,x2 = 0,y2 = 0,x3 = 0,y3 = 0,result = {};x1 = e.touches[0].pageX;x2 = e.touches[1].pageX;y1 = e.touches[0].pageY - document.body.scrollTop;y2 = e.touches[1].pageY - document.body.scrollTop;if(!x1 || !x2) return;if(x1<=x2){x3 = (x2-x1)/2+x1;}else{x3 = (x1-x2)/2+x2;}if(y1<=y2){y3 = (y2-y1)/2+y1;}else{y3 = (y1-y2)/2+y2;}result = {dist: Math.round(Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2))),x: Math.round(x3),y: Math.round(y3)};return result;},eventStop: function(e){e.preventDefault();e.stopPropagation();}};window.ImagesZoom = new ImagesZoom();
})(this);

以上代码 可以实现 点击一张图片 出现一个全屏的效果 点击全屏中的图片 可以进行双指 缩放

配合 Swiper 滑动插件时 出现了 点击打开全频 全屏在swiper遮挡在Swiper下面的问题

解决办法:

将 最外两层的 z-index 设置为0

  <!-- Swiper --><div class="swiper-container" style="z-index: 0;"> <!-- 这里需要将 z-index 设置为0 不然会覆盖在下面 --><div class="swiper-wrapper" style="z-index: 0;"> <!-- 这里需要将 z-index 设置为0 不然会覆盖在下面 --><div class="swiper-slide"><div class="list"><img src="img/bg1.jpg" /></div></div><div class="swiper-slide"><div class="list"><img src="img/bg1.jpg" /></div></div><div class="swiper-slide"><div class="list"><img src="img/bg1.jpg" /></div></div><div class="swiper-slide"><div class="list"><img src="img/bg1.jpg" /></div></div></div><!-- Add Pagination --><div class="swiper-pagination"><span class="my-bullet2" tabindex="0" role="button" aria-label="Go to slide 2">2222</span> </div></div>

Web前端_配合swiper滑动插件实现同比例双指缩放图片相关推荐

  1. 开发web前端_移动前端开发和web前端开发的区别?

    如果说非要有区别的话应该就是开发的软件和方式不同,因为他们本来就不属于一端的东西,具体来看看下面: web前端开发 用最简单粗暴的方式来讲,就是用html + css + javascript来构建一 ...

  2. 从零学web前端_从零到前端英雄(第1部分)

    从零学web前端 I remember when I first started learning front-end development. I encountered so many artic ...

  3. 从零学web前端_从零到前端英雄(第2部分)

    从零学web前端 This article is part two of the "From Zero to Front-end Hero" series. In part one ...

  4. 小猿圈web前端之移动端Vue+Vant实现上传压缩旋转图片功能

    小猿圈web前端讲师为了大家更好的学习前端知识决定每天分享一个web前端案例,希望对你与学习前端的你有所帮助,今天分享的是移动端Vue+Vant的Uploader实现上传.压缩.旋转图片等功能的详细介 ...

  5. web前端入门到实战:CSS新属性实现特殊的图片显示效果

    1 概述 1.1 前言 使用一个或多个图像相关的CSS属性(background-blend-mode, mix-blend-mode, or filter)可以实现许多特殊的图片显示效果,共列举了2 ...

  6. web前端基础之Bootstrap(三) - 插件

    模态框 放在body内的直接子元素 弹出方式  1.通过 data 属性 data-toggle="modal" data-target="#myModal" ...

  7. Web前端_项目实践01_萌娃摄影网页(纯HTML+CSS静态页面)

    众所周知,学前端只看不写等于"我没学过",但是我们初学者常常因为找不到合适的网页素材而苦恼.有的太复杂,很多知识没学过:有的太粗糙,没有做的兴趣.正巧,我这儿有份儿合适的,纯HTM ...

  8. Web前端_邮箱的正则表达式

    最正宗的邮箱正则表达式 ^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,5}$ js中代码: <script typ ...

  9. 【web前端】移动端控制台插件,手机端页面查看相关页面控制台信息

    一般调试手机端页面时,基本是在PC端使用手机模式进行断点或console调试.或查看有用的控制台信息的,但依旧有部分功能无法在PC端调试,经常需要使用alert进行断点,然后在手机端看效果,但是这样并 ...

最新文章

  1. 永远不要在代码中使用「User」这个单词
  2. ACL 2019 | 面向远程监督关系抽取的模式诊断技术
  3. Kafka淘汰倒计时!这个新一代消息中间件,腾讯、华为都用疯了?
  4. window环境变量
  5. vue引入全局less实现全局变量的控制
  6. 像程序员一样思考_如何像程序员一样思考-解决问题的经验教训
  7. JAVA日期查询:季度、月份、星期等时间信息
  8. MySQL知识树 集合操作
  9. 对超级计算机的认识有关论文,计算机科与技术专业的认识与思考.docx
  10. 1.1.3开启线程(Starting a Thread)
  11. matlab插值法计算根号,怎么用matlab利用拉格朗日插值计算法的原理编写并计算函数所在节点的近似值....
  12. 冲刺倒计时,复习核心是什么?
  13. 只需两步,让你的iPhone日历显示国家节假日安排
  14. 智慧屏鸿蒙,荣耀智慧屏体验评测:鸿蒙OS首款产品,真正的智慧中心
  15. python opencv 剪切图片
  16. 技术总监.部门经理.程序员
  17. [填坑]Ubuntu18.04无法使用chrome浏览器共享屏幕解决方案
  18. layout_weight如何计算比例?
  19. wx图片的相机相册获取,预览图片,图片保存,图片的信息
  20. linux下qt编程小游戏,Demo_2:Qt实现猜字小游戏

热门文章

  1. 分享几张大佬程序员常用壁纸,你值得拥有!
  2. 上交计算机考研科目,2020上海交通大学计算机考研大纲
  3. nginx 的配置介绍:http块
  4. linux服务器离线安装autoconf
  5. swift Locale
  6. 机器学习入门例子--预测浏览量
  7. 绿豆pro前端APP源码v5.1.7编译教程,后端配置全开源安装搭建全图文操作萝卜白菜app通用说明带视频教程_多啦咪
  8. ElasticSearch教程——创建索引、类型、文档
  9. 简单了解下 TCP,学习握手和挥手以及各种状态到底是怎么样的
  10. Python中通过索引名称提取数据loc()函数Python中通过行和列下标提取数据iloc()函数