| var startTouchs = []; | 
| var touchType = '' | 
| var startDistance = 0; | 
| var touchCenter = []; | 
| var cropperRect = null; | 
| var imageRect = null; | 
| var directionX = 0; | 
| var directionY = 0; | 
| var ratio = 0; | 
| // 操作时改变的对象 | 
| var changes = { | 
|     imageRect: null, | 
|     cropperRect: null | 
| } | 
| // 计算旋转后真实的图片大小 | 
| function getRealSize(){ | 
|     var w = changes.imageRect.width | 
|     var h = changes.imageRect.height | 
|     var l =  changes.imageRect.left | 
|     var t =  changes.imageRect.top | 
|     // 内斜边 | 
|     var R = Math.sqrt(w*w+h*h) | 
|     var angle = Math.atan(h/w) / Math.PI * 180 | 
|     var rorate = rotateAngle%90 | 
|     var direct = Math.floor(rotateAngle/90) | 
|     var width = R*Math.cos(ang2deg(angle-rorate)) | 
|     var height = R*Math.sin(ang2deg(angle+rorate)) | 
|     if(direct % 2 === 1){ | 
|         var temp = width | 
|         width = height | 
|         height = temp | 
|     } | 
|     return { | 
|         width: width, | 
|         height: height, | 
|         left: l - (width - w)/2, | 
|         top: t - (height - h)/2, | 
|         dw: width - w, | 
|         dh: height - h | 
|     } | 
| } | 
| export default { | 
|     computed: { | 
|         imageStyle() { | 
|             const imageRect = this.imageRect | 
|             if (imageRect) { | 
|                 return { | 
|                     left: imageRect.left + 'px', | 
|                     top: imageRect.top + 'px', | 
|                     width: imageRect.width + 'px', | 
|                     height: imageRect.height + 'px' | 
|                 } | 
|             } else { | 
|                 return {} | 
|             } | 
|         }, | 
|         cropperStyle() { | 
|             const cropperRect = this.cropperRect | 
|             if (cropperRect) { | 
|                 return { | 
|                     left: cropperRect.left + 'px', | 
|                     top: cropperRect.top + 'px', | 
|                     width: cropperRect.width + 'px', | 
|                     height: cropperRect.height + 'px' | 
|                 } | 
|             } else { | 
|                 return {} | 
|             } | 
|         } | 
|     }, | 
|     methods: { | 
|         touchStart() { | 
|             let ev; | 
|             if (arguments.length == 3) { | 
|                 directionX = arguments[0]; | 
|                 directionY = arguments[1]; | 
|                 ev = arguments[2]; | 
|                 touchType = "controller"; | 
|             } else { | 
|                 touchType = "image"; | 
|                 ev = arguments[0]; | 
|             } | 
|             startTouchs = ev.touches; | 
|             changes = { | 
|                 imageRect: this.imageRect, | 
|                 cropperRect: this.cropperRect | 
|             }; | 
|             ratio = this.ratio; | 
|             cropperRect = { | 
|                 ...changes.cropperRect | 
|             } | 
|             imageRect = { | 
|                 ...changes.imageRect | 
|             } | 
|             if (startTouchs.length == 2) { | 
|                 const imageRect = this.imageRect | 
|                 var x1 = startTouchs[0].clientX | 
|                 var y1 = startTouchs[0].clientY | 
|                 var x2 = startTouchs[1].clientX | 
|                 var y2 = startTouchs[1].clientY | 
|                 var distance = Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2) | 
|                 startDistance = Math.sqrt(distance) | 
|                 var leftPercent = ((x1 + x2) / 2 - imageRect.left) / imageRect.width | 
|                 var topPercent = ((y1 + y2) / 2 - imageRect.top) / imageRect.height | 
|                 touchCenter = [leftPercent, topPercent] | 
|             } | 
|         }, | 
|         touchMove(ev) { | 
|             if(startTouchs.length!==ev.touches.length) return | 
|             var touches = ev.touches; | 
|             var changeX1 = touches[0].clientX - startTouchs[0].clientX; | 
|             var changeY1 = touches[0].clientY - startTouchs[0].clientY; | 
|             if (startTouchs.length == 1) { | 
|                 if (touchType === 'image') { | 
|                     changes.imageRect.left = imageRect.left + changeX1; | 
|                     changes.imageRect.top = imageRect.top + changeY1; | 
|                     // console.log(startTouchs.length,ev.touches.length) | 
|                 } else if (touchType === 'controller') { | 
|                     var changeX = changeX1 * directionX; | 
|                     var changeY = changeY1 * directionY; | 
|                     // 比例缩放控制 | 
|                     if (ratio !== 0) { | 
|                         if (directionX * directionY !== 0) { | 
|                             if (changeX / ratio > changeY) { | 
|                                 changeY = changeX / ratio | 
|                                 changeX = changeY * ratio | 
|                             } else { | 
|                                 changeX = changeY * ratio | 
|                                 changeY = changeX / ratio | 
|                             } | 
|                         } else { | 
|                             if (directionX == 0) { | 
|                                 changeX = changeY * ratio | 
|                             } else { | 
|                                 changeY = changeX / ratio | 
|                             } | 
|                         } | 
|                     } | 
|                     var realSize = getRealSize() | 
|                     var width = cropperRect.width + changeX | 
|                     var height = cropperRect.height + changeY | 
|                     var imageRight = realSize.left+realSize.width | 
|                     var imageBottom = realSize.top+realSize.height | 
|                     if (directionX != -1) { | 
|                         if (cropperRect.left + width > imageRight) { | 
|                             width = imageRight - cropperRect.left | 
|                             if (ratio !== 0) { | 
|                                 height = width / ratio | 
|                             } | 
|                         } | 
|                     } else { | 
|                         var cLeft = cropperRect.left - changeX | 
|                         if (cLeft < realSize.left) { | 
|                             width = cropperRect.left + cropperRect.width - realSize.left | 
|                             if (ratio !== 0) { | 
|                                 height = width / ratio | 
|                             } | 
|                         } | 
|                     } | 
|                     // 判断是否触底 | 
|                     if (directionY != -1) { | 
|                         if (cropperRect.top + height > imageBottom) { | 
|                             height = imageBottom - cropperRect.top | 
|                             if (ratio !== 0) { | 
|                                 width = height * ratio | 
|                             } | 
|                         } | 
|                     } else { | 
|                         var cTop = cropperRect.top - changeY | 
|                         if (cTop < realSize.top) { | 
|                             height = cropperRect.top + cropperRect.height - realSize.top | 
|                             if (ratio !== 0) { | 
|                                 width = height * ratio | 
|                             } | 
|                         } | 
|                     } | 
|                     if (directionX == -1) { | 
|                         changes.cropperRect.left = cropperRect.left + cropperRect.width - width | 
|                     } | 
|                     if (directionY == -1) { | 
|                         changes.cropperRect.top = cropperRect.top + cropperRect.height - height | 
|                     } | 
|                     // 边界控制 | 
|                     changes.cropperRect.width = width | 
|                     changes.cropperRect.height = height | 
|                 } | 
|             } else if (touches.length == 2 && startTouchs.length == 2) { | 
|                 var changeX2 = touches[0].clientX - touches[1].clientX; | 
|                 var changeY2 = touches[0].clientY - touches[1].clientY; | 
|                 var distance = Math.pow(changeX2, 2) + Math.pow(changeY2, 2) | 
|                 distance = Math.sqrt(distance) | 
|                 // 放大比例 | 
|                 var scaleRate = distance / startDistance | 
|                 this.imageScale(scaleRate) | 
|             } | 
|         }, | 
|         touchEnd(ev) { | 
|             // console.log('end',ev) | 
|             if(ev.touches.length!==0) return | 
|             if (touchType === "image") { | 
|                 var cropperLeft = cropperRect.left | 
|                 var cropperRight = cropperRect.left + cropperRect.width | 
|                 var cropperTop = cropperRect.top | 
|                 var cropperBottom = cropperTop + cropperRect.height | 
|                 var cropperRate = cropperRect.width / cropperRect.height | 
|                 var realSize = getRealSize() | 
|                 var rate = realSize.width / realSize.height | 
|                 if (realSize.width < cropperRect.width || realSize.height < cropperRect.height) { | 
|                     var scale = 1 | 
|                     if (rate < cropperRate) { | 
|                         scale = cropperRect.width / realSize.width | 
|                     } else { | 
|                         scale = cropperRect.height / realSize.height | 
|                     } | 
|                     imageRect.width = changes.imageRect.width | 
|                     imageRect.height = changes.imageRect.height | 
|                     this.imageScale(scale) | 
|                 } | 
|                 // 边界控制start | 
|                 if (cropperLeft < realSize.left) { | 
|                     changes.imageRect.left = cropperLeft + realSize.dw/2 | 
|                 } | 
|                 if (cropperRight > realSize.left + realSize.width) { | 
|                     changes.imageRect.left = cropperRight - realSize.width + realSize.dw/2 | 
|                 } | 
|                 if (cropperTop < realSize.top) { | 
|                     changes.imageRect.top = cropperTop + realSize.dh/2 | 
|                 } | 
|                 if (cropperBottom > realSize.top + realSize.height) { | 
|                     changes.imageRect.top = cropperBottom - realSize.height + realSize.dh/2 | 
|                 } | 
|                 // 边界控制end | 
|             } | 
|             this.updateData({ | 
|                 cropperRect: changes.cropperRect, | 
|                 imageRect: changes.imageRect, | 
|             }) | 
|             touchType = "" | 
|             startTouchs = [] | 
|             return false; | 
|         }, | 
|         imageScale(scaleRate) { | 
|             var cw = imageRect.width * (scaleRate - 1) | 
|             var ch = imageRect.height * (scaleRate - 1) | 
|             changes.imageRect = { | 
|                 width: imageRect.width + cw, | 
|                 height: imageRect.height + ch, | 
|                 left: imageRect.left - cw * (touchCenter[0]), | 
|                 top: imageRect.top - ch * (touchCenter[1]) | 
|             } | 
|         } | 
|     } | 
| } |