scale.js 10 KB

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