腾讯新闻上用的插件(xw.qq.com)

缩放插件scale.js

  1. (function(window, undefined) {
  2. var document = window.document,
  3. support = {
  4. transform3d: ("WebKitCSSMatrix" in window && "m11" in new WebKitCSSMatrix()),
  5. touch: ("ontouchstart" in window)
  6. };
  7.  
  8. function getTranslate(x, y) {
  9. var distX = x,
  10. distY = y;
  11. return support.transform3d ? "translate3d(" + distX + "px, " + distY + "px, 0)" : "translate(" + distX + "px, " + distY + "px)";
  12. }
  13.  
  14. function getPage(event, page) {
  15. return support.touch ? event.changedTouches[0][page] : event[page];
  16. }
  17.  
  18. var ImagesZoom = function() {};
  19.  
  20. ImagesZoom.prototype = {
  21. // 给初始化数据
  22. init: function(param) {
  23. var self = this,
  24. params = param || {};
  25.  
  26. var imgList = document.querySelectorAll(params.elem + " img"),
  27. zoomMask = document.querySelector(".imgzoom_pack"),
  28. zoomImg = document.querySelector(".imgzoom_pack .imgzoom_img img"),
  29. zoomClose = document.querySelector(".imgzoom_pack .imgzoom_x"),
  30. imgSrc = "";
  31.  
  32. self.buffMove = 3; //缓冲系数
  33. self.buffScale = 2; //放大系数
  34. self.finger = false; //触摸手指的状态 false:单手指 true:多手指
  35.  
  36. self._destroy();
  37.  
  38. zoomClose.addEventListener("click", function() {
  39. zoomMask.style.cssText = "display:none";
  40. zoomImg.src = "";
  41. zoomImg.style.cssText = "";
  42.  
  43. self._destroy();
  44.  
  45. document.removeEventListener("touchmove", self.eventStop, false);
  46. }, false);
  47.  
  48. for (var len = imgList.length, i = 0; i < len; i++) {
  49. imgList[i].addEventListener("click", function() {
  50. imgSrc = this.getAttribute("src");
  51. zoomMask.style.cssText = "display:block";
  52. zoomImg.src = imgSrc;
  53.  
  54. zoomImg.onload = function() {
  55. zoomImg.style.cssText = "margin-top:-" + (zoomImg.offsetHeight / 2) + "px";
  56.  
  57. // 禁止页面滚动
  58. document.addEventListener("touchmove", self.eventStop, false);
  59.  
  60. self.imgBaseWidth = zoomImg.offsetWidth;
  61. self.imgBaseHeight = zoomImg.offsetHeight;
  62.  
  63. self.addEventStart({
  64. wrapX: zoomMask.offsetWidth,
  65. wrapY: zoomMask.offsetHeight,
  66. mapX: zoomImg.width,
  67. mapY: zoomImg.height
  68. });
  69. }
  70. }, false);
  71. }
  72. },
  73. addEventStart: function(param) {
  74. var self = this,
  75. params = param || {};
  76.  
  77. self.element = document.querySelector(".imgzoom_pack img");
  78.  
  79. //config set
  80. self.wrapX = params.wrapX || 0; //可视区域宽度
  81. self.wrapY = params.wrapY || 0; //可视区域高度
  82. self.mapX = params.mapX || 0; //地图宽度
  83. self.mapY = params.mapY || 0; //地图高度
  84.  
  85. self.outDistY = (self.mapY - self.wrapY) / 2; //图片超过一屏的时候有用
  86.  
  87. self.width = self.mapX - self.wrapX; //地图的宽度减去可视区域的宽度
  88. self.height = self.mapY - self.wrapY; //地图的高度减去可视区域的高度
  89.  
  90. self.element.addEventListener("touchstart", function(e) {
  91. self._touchstart(e);
  92. }, false);
  93. self.element.addEventListener("touchmove", function(e) {
  94. self._touchmove(e);
  95. }, false);
  96. self.element.addEventListener("touchend", function(e) {
  97. self._touchend(e);
  98. }, false);
  99. },
  100. // 重置坐标数据
  101. _destroy: function() {
  102. this.distX = 0;
  103. this.distY = 0;
  104. this.newX = 0;
  105. this.newY = 0;
  106.  
  107. },
  108. // 更新地图信息
  109. _changeData: function() {
  110. this.mapX = this.element.offsetWidth; //地图宽度
  111. this.mapY = this.element.offsetHeight; //地图高度
  112. // this.outDistY = (this.mapY - this.wrapY)/2; //当图片高度超过屏幕的高度时候。图片是垂直居中的,这时移动有个高度做为缓冲带
  113. this.width = this.mapX - this.wrapX; //地图的宽度减去可视区域的宽度
  114. this.height = this.mapY - this.wrapY; //地图的高度减去可视区域的高度
  115. },
  116. _touchstart: function(e) {
  117. var self = this;
  118.  
  119. self.tapDefault = false;
  120. // self.tapDefaultY = false;
  121.  
  122. e.preventDefault();
  123.  
  124. var touchTarget = e.targetTouches.length; //获得触控点数
  125.  
  126. self._changeData(); //重新初始化图片、可视区域数据,由于放大会产生新的计算
  127.  
  128. if (touchTarget == 1) {
  129. // 获取开始坐标
  130. self.basePageX = getPage(e, "pageX");
  131. self.basePageY = getPage(e, "pageY");
  132.  
  133. self.finger = false;
  134. } else {
  135. self.finger = true;
  136.  
  137. self.startFingerDist = self.getTouchDist(e).dist;
  138. self.startFingerX = self.getTouchDist(e).x;
  139. self.startFingerY = self.getTouchDist(e).y;
  140. }
  141. /*console.log("pageX: " + getPage(e, "pageX"));
  142. console.log("pageY: " + getPage(e, "pageY"));*/
  143. },
  144. _touchmove: function(e) {
  145. var self = this;
  146. self.tapDefault = true;
  147. e.preventDefault();
  148. e.stopPropagation();
  149.  
  150. // console.log("event.changedTouches[0].pageY: " + event.changedTouches[0].pageY);
  151.  
  152. var touchTarget = e.targetTouches.length; //获得触控点数
  153.  
  154. if (touchTarget == 1 && !self.finger) {
  155.  
  156. self._move(e);
  157. }
  158.  
  159. if (touchTarget >= 2) {
  160. self._zoom(e);
  161. }
  162. },
  163. _touchend: function(e) {
  164. var self = this;
  165. console.log(self.tapDefault)
  166.  
  167. if (!self.finger && !self.tapDefault) {
  168. var zoomMask = document.querySelector(".imgzoom_pack"),
  169. zoomImg = document.querySelector(".imgzoom_pack .imgzoom_img img");
  170. zoomMask.style.cssText = "display:none";
  171. zoomImg.src = "";
  172. zoomImg.style.cssText = "";
  173.  
  174. self._destroy();
  175.  
  176. document.removeEventListener("touchmove", self.eventStop, false);
  177. return
  178. };
  179. self._changeData(); //重新计算数据
  180. if (self.finger) {
  181. self.distX = -self.imgNewX;
  182. self.distY = -self.imgNewY;
  183. }
  184.  
  185. if (self.distX > 0) {
  186. self.newX = 0;
  187. } else if (self.distX <= 0 && self.distX >= -self.width) {
  188. self.newX = self.distX;
  189. self.newY = self.distY;
  190. } else if (self.distX < -self.width) {
  191. self.newX = -self.width;
  192. }
  193.  
  194. self.reset();
  195. },
  196. _move: function(e) {
  197.  
  198. var self = this,
  199. pageX = getPage(e, "pageX"), //获取移动坐标
  200. pageY = getPage(e, "pageY");
  201.  
  202. // 禁止默认事件
  203. // e.preventDefault();
  204. // e.stopPropagation();
  205.  
  206. /*self.tapDefaultX = pageX - self.basePageX;
  207. self.tapDefaultY = pageY - self.basePageY;*/
  208. // 获得移动距离
  209. self.distX = (pageX - self.basePageX) + self.newX;
  210. self.distY = (pageY - self.basePageY) + self.newY;
  211.  
  212. if (self.distX > 0) {
  213. self.moveX = Math.round(self.distX / self.buffMove);
  214. } else if (self.distX <= 0 && self.distX >= -self.width) {
  215. self.moveX = self.distX;
  216. } else if (self.distX < -self.width) {
  217. self.moveX = -self.width + Math.round((self.distX + self.width) / self.buffMove);
  218. }
  219. self.movePos();
  220. self.finger = false;
  221. },
  222. // 图片缩放
  223. _zoom: function(e) {
  224. var self = this;
  225. // e.preventDefault();
  226. // e.stopPropagation();
  227.  
  228. var nowFingerDist = self.getTouchDist(e).dist, //获得当前长度
  229. ratio = nowFingerDist / self.startFingerDist, //计算缩放比
  230. imgWidth = Math.round(self.mapX * ratio), //计算图片宽度
  231. imgHeight = Math.round(self.mapY * ratio); //计算图片高度
  232.  
  233. // 计算图片新的坐标
  234. self.imgNewX = Math.round(self.startFingerX * ratio - self.startFingerX - self.newX * ratio);
  235. self.imgNewY = Math.round((self.startFingerY * ratio - self.startFingerY) / 2 - self.newY * ratio);
  236.  
  237. if (imgWidth >= self.imgBaseWidth) {
  238. self.element.style.width = imgWidth + "px";
  239. self.refresh(-self.imgNewX, -self.imgNewY, "0s", "ease");
  240. self.finger = true;
  241. } else {
  242. if (imgWidth < self.imgBaseWidth) {
  243. self.element.style.width = self.imgBaseWidth + "px";
  244. }
  245. }
  246.  
  247. self.finger = true;
  248. },
  249. // 移动坐标
  250. movePos: function() {
  251. var self = this;
  252.  
  253. if (self.height < 0) {
  254. if (self.element.offsetWidth == self.imgBaseWidth) {
  255. self.moveY = Math.round(self.distY / self.buffMove);
  256. // console.log(self.moveY +"111")
  257. } else {
  258. var moveTop = Math.round((self.element.offsetHeight - self.imgBaseHeight) / 2);
  259. self.moveY = -moveTop + Math.round((self.distY + moveTop) / self.buffMove);
  260. // console.log(self.moveY +"222")
  261. }
  262. } else {
  263. var a = Math.round((self.wrapY - self.imgBaseHeight) / 2),
  264. b = self.element.offsetHeight - self.wrapY + Math.round(self.wrapY - self.imgBaseHeight) / 2;
  265.  
  266. if (self.distY >= -a) {
  267. self.moveY = Math.round((self.distY + a) / self.buffMove) - a;
  268. // console.log(self.moveY +"333")
  269. } else if (self.distY <= -b) {
  270. self.moveY = Math.round((self.distY + b) / self.buffMove) - b;
  271. // console.log(self.moveY +"444")
  272. } else {
  273. self.moveY = self.distY;
  274. // console.log(self.moveY +"555")
  275. }
  276. }
  277. self.refresh(self.moveX, self.moveY, "0s", "ease");
  278. },
  279. // 重置数据
  280. reset: function() {
  281. var self = this,
  282. hideTime = ".2s";
  283. if (self.height < 0) {
  284. self.newY = -Math.round(self.element.offsetHeight - self.imgBaseHeight) / 2;
  285. } else {
  286. var a = Math.round((self.wrapY - self.imgBaseHeight) / 2),
  287. b = self.element.offsetHeight - self.wrapY + Math.round(self.wrapY - self.imgBaseHeight) / 2;
  288.  
  289. if (self.distY >= -a) {
  290. self.newY = -a;
  291. } else if (self.distY <= -b) {
  292. self.newY = -b;
  293. } else {
  294. self.newY = self.distY;
  295. }
  296. }
  297. self.refresh(self.newX, self.newY, hideTime, "ease-in-out");
  298. },
  299. // 执行图片移动
  300. refresh: function(x, y, timer, type) {
  301. this.element.style.webkitTransitionProperty = "-webkit-transform";
  302. this.element.style.webkitTransitionDuration = timer;
  303. this.element.style.webkitTransitionTimingFunction = type;
  304. this.element.style.webkitTransform = getTranslate(x, y);
  305. },
  306. // 获取多点触控
  307. getTouchDist: function(e) {
  308. var x1 = 0,
  309. y1 = 0,
  310. x2 = 0,
  311. y2 = 0,
  312. x3 = 0,
  313. y3 = 0,
  314. result = {};
  315.  
  316. x1 = e.touches[0].pageX;
  317. x2 = e.touches[1].pageX;
  318. y1 = e.touches[0].pageY - document.body.scrollTop;
  319. y2 = e.touches[1].pageY - document.body.scrollTop;
  320.  
  321. if (!x1 || !x2) return;
  322.  
  323. if (x1 <= x2) {
  324. x3 = (x2 - x1) / 2 + x1;
  325. } else {
  326. x3 = (x1 - x2) / 2 + x2;
  327. }
  328. if (y1 <= y2) {
  329. y3 = (y2 - y1) / 2 + y1;
  330. } else {
  331. y3 = (y1 - y2) / 2 + y2;
  332. }
  333.  
  334. result = {
  335. dist: Math.round(Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))),
  336. x: Math.round(x3),
  337. y: Math.round(y3)
  338. };
  339. return result;
  340. },
  341. eventStop: function(e) {
  342. e.preventDefault();
  343. e.stopPropagation();
  344. }
  345. };
  346.  
  347. window.ImagesZoom = new ImagesZoom();
  348. })(this);
  349. /* |xGv00|e265149d8101b256799ca6fa116fac35 */

Html代码

  1. <div class="content">
      <img src='图片URL'/>
    </div>
    <div class="imgzoom_pack" style="display: none;">
  2. <div class="imgzoom_x">X</div>
  3. <div class="imgzoom_img"><img class="pp" src=""></div>
  4. </div>

Css代码

  1. .imgzoom_pack {
  2. width: 100%;
  3. height: 100%;
  4. position: fixed;
  5. top: 0px;
  6. bottom: 0px;
  7. left: 0px;
  8. right: 0px;
  9. background: rgba(0, 0, 0, .7);
  10. }
  11.  
  12. .imgzoom_pack .imgzoom_x {
  13. color: #fff;
  14. height: 30px;
  15. width: 30px;
  16. line-height: 30px;
  17. background: #000;
  18. text-align: center;
  19. position: absolute;
  20. right: 5px;
  21. top: 5px;
  22. z-index:;
  23. cursor: pointer;
  24. }
  25.  
  26. .imgzoom_pack .imgzoom_img {
  27. width: 100%;
  28. height: 100%;
  29. position: absolute;
  30. left:;
  31. top:;
  32. overflow: hidden;
  33. }
  34.  
  35. .imgzoom_pack .imgzoom_img img {
  36. width: 100%;
  37. position: absolute;
  38. top: 50%;
  39. }

用法

  1. $(function () {
  2. $(".content img").on("click", function () {
  3. $(".imgzoom_img>img").attr("src", $(this).attr("src"));
  4. $(".imgzoom_img>img").css("marginTop", "-" + ($(this).height() / 2) + "px");
  5. $(".imgzoom_pack").show();
  6.  
  7. });
  8. $(".imgzoom_x").on("click", function () {
  9. $(".imgzoom_pack").hide();
  10. $(".imgzoom_img>img").attr("src", "");
  11. });
  12.  
  13. window.ImagesZoom.init({
  14. "elem": ".content"
  15. })
  16. })

HTML5 图片缩放功能的更多相关文章

  1. iOS开发UI篇—UIScrollView控件实现图片缩放功能

    iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...

  2. UIScrollView控件实现图片缩放功能

    转发自:http://www.cnblogs.com/wendingding/p/3754268.html 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScr ...

  3. iOS UI-UIScrollView控件实现图片缩放功能

    一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对其内容进行缩放处理.也就是说,要完成缩放功能的话,只需要将需要缩 ...

  4. WP8图片缩放功能实现

    最近在学习WP8,想实现WP微信中查看图片时的放大缩小功能. 网上找了两个解决方案: 1 利用GestureListener 这个类在Microsoft.Phone.Controls.Toolkit中 ...

  5. php实现图片缩放功能类

    http://www.poluoluo.com/jzxy/201312/255447.html <?php /** * Images类是一个图片处理类 * @package applicatio ...

  6. Python之图片缩放功能实现

    这几天由于有项目在做,自己的学习部分然后没有很充足的时间,但是这些零碎的时间也是很宝贵的,所以还是继续学我的python,我很喜欢这个语言,因为简洁,开发环境简单,更多的事,功能灰常的强大,所以好多有 ...

  7. iOS开发基础-UIScrollView实现图片缩放

    当用户在 UIScrollView 上使用捏合手势时, UIScrollView 会给 UIScrollViewDelegate 协议发送一条消息,并调用代理的 viewForZoomingInScr ...

  8. 分享10款效果惊艳的HTML5图片特效

    在HTML5的世界里,图片特效都十分绚丽,我们在网站上也分享过很多不错的HTML5图片特效,现在我们精选10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特 ...

  9. 使用Martix来实现缩放图片的功能

    使用Martix(android.graphics.Matrix)类中的postScale()方法结合Bitmap来实现缩放图片的功能 Bitmap bmp = BitmapFactory.decod ...

随机推荐

  1. WordPress建站和搭独立博客

    之前有帮外面的公司建站的经历 不去管html css js 服务器脚本等 对于菜鸟新手而言, 一个WAMP + WordPress(博客程序)就够了 都弄好了再部署到云端服务器上 其实整个过程只是安装 ...

  2. truncate 、delete与drop区别

    原博文地址:http://www.cnblogs.com/8765h/archive/2011/11/25/2374167.html 相同点: 1.truncate和不带where子句的delete. ...

  3. Java通过几种经典的算法来实现数组排序

    Java实现数组排序 package com.souvc.hibernate.exp; public class MySort { /** * 方法名:main</br> * 详述:Jav ...

  4. x01.Weiqi.12: 定式布局

    定式 下一步当将定式保存到数据库中,如布局中的代码所示,但其初始的代码更有利于理解.以小飞挂为例: // 0 // + 0 0 // + // // + List<Pos> P_LuSta ...

  5. STM32 KEIL不能输入仿真引脚端口error 65: access violation at 0x40021000 : no 'read' permission

    使用MDK自己创建一个STM32F103ZE核的项目 加入源码后编译,正常,在线仿真单步执行出现如下问题 error 65: access violation at 0x40021000 : no ' ...

  6. Shell编程和Vim操作

    其实一直不懂什么是shell,安卓adb调试时会使用一些简单的shell命令,总结一下 1.adb调试命令 全称:Android Debug Bridge 设置: export PATH=${PATH ...

  7. 【原】HTML5 新增的结构元素——能用并不代表对了

    做移动端有一段时间,今天有同事问了我 article 和 section 标签的使用,模模糊糊的解释了下,他似懂非懂,有点小尴尬.忽然间觉得自己有必要再翻翻书籍,重温下 html5 的新元素.html ...

  8. Linux Kernel 代码艺术——编译时断言

    本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码片段(不关注OS的各个模块的设计思想,此部分我准备写在“深入理解Linux Kernel” 系列文章中),一来通过内核 ...

  9. 【2016-11-7】【坚持学习】【Day22】【Oracle 递归查询】

    直接在oracle 递归查询语句 select * from groups start with id=:DeptId connect by prior superiorid =id 往下找 sele ...

  10. OpenStack 企业私有云的若干需求(2):自动扩展(Auto-scaling) 支持

    本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...