| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 | (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 || {},				imgIndex = 0;							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"),				zoomDel   = document.querySelector(".imgzoom-pack .imgzoom-del"),				imgSrc    = "";			self.buffMove   = 3; //缓冲系数			self.buffScale  = 2; //放大系数			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);						zoomDel.addEventListener("click", function(){				zoomMask.style.cssText = "display:none";				zoomImg.src = "";				zoomImg.style.cssText = "";								var imgLi=document.querySelectorAll(params.elem + " li");				if(params.delBack){					params.delBack(imgIndex);				};							self._destroy();				document.removeEventListener("touchmove", self.eventStop, false);			}, false);			for(var len=imgList.length,i=0; i<len; i++){				imgList[i].addEventListener("click", function(){					imgIndex=$(this).parent().index();					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 set			self.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.refresh(-self.imgNewX, -self.imgNewY, "0s", "ease");				self.finger = true;				}else{				if(imgWidth < self.imgBaseWidth){					self.element.style.width = self.imgBaseWidth + "px";				}			}			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);
 |