Picture.js 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. Namespace.register("U.MT.UI.Picture");
  2. /**
  3. * 起始函数
  4. */
  5. U.MT.UI.Picture = U.MT.UI.picture = function (arr, choosenum) {
  6. if (!!arr || typeof arr != 'array') {
  7. return;
  8. }
  9. //设置全局属性
  10. U.MT.UI.Picture.ATTR = {
  11. "start": [], /*手势缩放,获取双指触碰屏幕的数据*/
  12. "now": [], /*双指移动时,双指的数据*/
  13. "startX": 0 /*手指触碰屏幕是记录手指到屏幕边的距离*/
  14. }
  15. /*模拟数据*/
  16. U.MT.UI.Picture.USERPICS = arr;
  17. //创建控件
  18. U.MT.UI.Picture.create(choosenum);
  19. };
  20. U.MT.UI.Picture.MTW = document.documentElement.clientWidth/*获取当前手机的长度*/
  21. U.MT.UI.Picture.MTH = document.documentElement.clientHeight /*获取当前手机的宽度*/
  22. U.MT.UI.Picture.currentnum = 0 /*手机当前显示图片的位置*/
  23. U.MT.UI.Picture.lastnum = 0 /*手机上一次显示图片的位置*/
  24. U.MT.UI.Picture.rotatenum = 0 /*旋转角度*/
  25. U.MT.UI.Picture.scalenum = 1 /*缩放大小*/
  26. U.MT.UI.Picture.picmovedis = [0, 0] /*图片放大后拖动距离,【x,y】*/
  27. U.MT.UI.Picture.conpicbox = null /*选择图片组的大div*/
  28. U.MT.UI.Picture.header = null /*头部*/
  29. U.MT.UI.Picture.showstage = null /*展示图片的大div*/
  30. U.MT.UI.Picture.showpicplace = null /*图片的父元素*/
  31. U.MT.UI.Picture.download = null /*下载按钮*/
  32. U.MT.UI.Picture.pics = null /*所有图片存放位置*/
  33. U.MT.UI.Picture.picarr = null /*组图片存放位置*/
  34. U.MT.UI.Picture.disx = 0 /*点击屏幕的X距离*/
  35. U.MT.UI.Picture.disy = 0 /*点击屏幕的Y距离*/
  36. U.MT.UI.Picture.touchstartx = 0 /*点击屏幕的Y距离*/
  37. U.MT.UI.Picture.timer = null /*定时器,为实现双击事件*/
  38. U.MT.UI.Picture.dbclicktimes = 0 /*点击次数*/
  39. U.MT.UI.Picture.checkscale = true /*是否缩放,true没有缩放,false放大了*/
  40. U.MT.UI.Picture.scalew = 0 /*缩放后图片的长*/
  41. U.MT.UI.Picture.scaleh = 0 /*缩放后图片的宽*/
  42. U.MT.UI.Picture.touchmovedisx = 0 /*在放大的状态,进行图片的拖动,因为使用的css属性,以图片的中点为原点,图片中心点的距离*/
  43. U.MT.UI.Picture.touchmovedisy = 0 /*图片中心点的Y距离*/
  44. U.MT.UI.Picture.start = 0 /*手势缩放,获取双指触碰屏幕的数据*/
  45. U.MT.UI.Picture.now = 0 /*双指移动时,双指的数据*/
  46. U.MT.UI.Picture.startx = 0 /*手指触碰屏幕是记录手指到屏幕边的距离*/
  47. U.MT.UI.Picture.picUrl = ''
  48. /*图片控件HTML模板*/
  49. U.MT.UI.Picture.TEMPLATE = [
  50. '<header class="U_MT_UI_Picture_header" id="U_MT_UI_Picture_header">' +
  51. ' <div class="U_MT_UI_Picture_header_a">' +
  52. ' <p>' +
  53. ' <i class="U_MT_UI_Picture_icon" id="U_MT_UI_Picture_back"></i>' +
  54. ' <span class="U_MT_UI_Picture_title">图片及视频</span>' +
  55. ' <span style="position: absolute;right: 1.25rem;" id="U_MT_UI_Picture_close" onclick="U.MT.UI.Picture.close()">关闭</span>' +
  56. ' </p>' +
  57. ' </div>' +
  58. ' </header>' +
  59. ' <section class="U_MT_UI_Picture_content" id="U_MT_UI_Picture_content">' +
  60. ' </section>',
  61. '<section class="U_MT_UI_Picture_show_stage" id="U_MT_UI_Picture_showStage">' +
  62. '<span style="position: absolute;left: 1rem; top: 1rem; color:#fff; z-index:1; border: 1px solid white;padding: 2px 4px;box-shadow: 0 0 5px #fff;" id="U_MT_UI_Picture_close" onclick="U.MT.UI.Picture.close()">关闭</span>' +
  63. '<span class="U_MT_UI_Picture_moreIcon" id="U_MT_UI_Picture_moreIcon"></span>' +
  64. '<div class="U_MT_UI_Picture_stage_bottom">' +
  65. '<span class="U_MT_UI_Picture_stage_turnRight" id="U_MT_UI_Picture_turnRight"></span>' +
  66. '<span class="U_MT_UI_Picture_stage_turnLeft" id="U_MT_UI_Picture_turnLeft"></span>' +
  67. '<a class="U_MT_UI_Picture_download" id="U_MT_UI_Picture_download"></a>' +
  68. '</div>' +
  69. '<div class="U_MT_UI_Picture_show_pic" id="U_MT_UI_Picture_showPic">' +
  70. '<div class="U_MT_UI_Picture_showPicPlace" id="U_MT_UI_Picture_showPicPlace">' +
  71. '</div>' +
  72. '</div>' +
  73. '</section>'
  74. ];
  75. /**
  76. * 控件初始化
  77. * @param this 简写命名空间
  78. */
  79. U.MT.UI.Picture.create = function (choosenum) {
  80. if (U.MT.UI.Picture.conpicbox) {
  81. U.MT.UI.Picture.conpicbox.innerHTML = "";
  82. U.MT.UI.Picture.picUrl = '';
  83. U.MT.UI.Picture.addPic(U.MT.UI.Picture.USERPICS, choosenum);
  84. U.selectEl('#U_MT_UI_Picture_picBox')[0].style.display = 'block';
  85. return;
  86. }
  87. var _box = $$('div', { id: 'U_MT_UI_Picture_picBox', className: 'U_MT_UI_Picture_pic_box' }, document.body); /*创建出最外层div*/
  88. _box.innerHTML = this.TEMPLATE[0] + this.TEMPLATE[1]; /*把打好的模板丢进去*/
  89. var _showPic = U.selectEl('#U_MT_UI_Picture_showPic')[0]; /*图片的父父元素*/
  90. U.MT.UI.Picture.conpicbox = U.selectEl('#U_MT_UI_Picture_content')[0]; /*获取选择图片组的大div*/
  91. U.MT.UI.Picture.header = U.selectEl('#U_MT_UI_Picture_header')[0]; /*头部*/
  92. U.MT.UI.Picture.showstage = U.selectEl('#U_MT_UI_Picture_showStage')[0]; /*展示图片的大div*/
  93. U.MT.UI.Picture.showpicplace = U.selectEl('#U_MT_UI_Picture_showPicPlace')[0]; /*图片的父元素*/
  94. U.MT.UI.Picture.download = U.selectEl('#U_MT_UI_Picture_download')[0]; /*下载按钮*/
  95. this.addPic(this.USERPICS, choosenum); /*创建图片展示列表*/
  96. U.MT.UI.Picture.loadbind();
  97. U.MT.UI.Picture.touchDrag(_showPic, U.MT.UI.Picture.showpicplace); /*激活拖拽切换图片*/
  98. }
  99. U.MT.UI.Picture.loadbind = function () {
  100. /*给返回图片组一个点击事件*/
  101. U.selectEl('#U_MT_UI_Picture_moreIcon')[0].addEventListener('click', U.UF.C.apply(this, function () {
  102. this.header.style.display = 'block'; /*头部显示*/
  103. this.conpicbox.style.display = 'block'; /*图片列表显示*/
  104. this.showstage.style.display = 'none'; /*图片展示区隐藏*/
  105. }), false);
  106. /*给返回展示图片一个点击事件*/
  107. U.selectEl('#U_MT_UI_Picture_back')[0].addEventListener('click', U.UF.C.apply(this, function () {
  108. if (this.pics) { /*判断图片展示区是否有图片*/
  109. this.header.style.display = 'none'; /*头部隐藏*/
  110. this.conpicbox.style.display = 'none'; /*图片列表有隐藏*/
  111. this.showstage.style.display = 'block'; /*图片展示区显示*/
  112. } else {
  113. U.alert('请先选择图片', 2000); /*提示*/
  114. }
  115. }), false);
  116. /*给右旋转一个点击事件*/
  117. U.selectEl('#U_MT_UI_Picture_turnRight')[0].addEventListener('click', U.UF.C.apply(this, function () {
  118. this.rotatenum -= 90; /*逆时针旋转90°*/
  119. this.transformControl(U.MT.UI.Picture.pics[this.currentnum], 'rotate(' + this.rotatenum + 'deg)'); /*替换该图片的transform属性进行旋转*/
  120. }), false);
  121. /*给左旋转一个点击事件*/
  122. U.selectEl('#U_MT_UI_Picture_turnLeft')[0].addEventListener('click', U.UF.C.apply(this, function () {
  123. this.rotatenum += 90; /*顺时针旋转90°*/
  124. this.transformControl(U.MT.UI.Picture.pics[this.currentnum], 'rotate(' + this.rotatenum + 'deg)'); /*替换该图片的transform属性进行旋转*/
  125. }), false);
  126. var _closes = U.selectEl('.U_MT_UI_Picture_close')
  127. }
  128. U.MT.UI.Picture.close = function () {
  129. if (_el = U.selectEl('#U_MT_UI_Picture_picBox')[0]) /*是否创建此控件*/
  130. _el.style.display = 'none'; /*隐藏控件*/
  131. }
  132. /**
  133. * 循环创建图片
  134. * @param arr 对象数组
  135. * @param _margin 一排图片排满后剩余的边距大小
  136. */
  137. U.MT.UI.Picture.addPic = function (arr, choosenum) {
  138. if (typeof arr[0] === 'string') {
  139. var _cbox = $$('div', { className: 'U_MT_UI_Picture_content_a' }, U.MT.UI.Picture.conpicbox), /*创建大div来包住图片*/
  140. _s;
  141. for (var i = 0; i < arr.length; i++) {
  142. _s = $$('span', { /*创建图片*/className: 'U_MT_UI_Picture_divPic', style: { "background-image": "url(" + arr[i] + ")"} }, _cbox);
  143. U.MT.UI.Picture.picUrl += arr[i] + ((arr.length - 1 !== i) ? ',' : ''); /*绑上当前循环的数组*/
  144. }
  145. if (arr.length === 1) {
  146. U.selectEl('#U_MT_UI_Picture_moreIcon')[0].style.display = 'none';
  147. }
  148. U.MT.UI.Picture.showPic(U.MT.UI.Picture.picUrl + ',' + (choosenum || 0));
  149. return;
  150. }
  151. for (var a in arr) { /*循环对象数组*/
  152. if (a === 'date') { /*若键名是date,说明是日期*/
  153. $$('p', { style: { 'padding': '.8rem' }, innerText: arr[a] }, U.MT.UI.Picture.conpicbox);
  154. continue; /*跳过本次循环*/
  155. }
  156. if (a === 'pic' && Array.isArray(arr[a])) { /*若键名是pic同时pic又是数组*/
  157. var _cbox = $$('div', { className: 'U_MT_UI_Picture_content_a' }, U.MT.UI.Picture.conpicbox); /*创建大div来包住图片*/
  158. for (var i = 0; i < arr[a].length; i++) { /*循环里面的数组*/
  159. var _s = $$('span', { /*创建图片*/className: 'U_MT_UI_Picture_divPic', style: { "background-image": "url(" + arr[a][i] + ")"} }, _cbox);
  160. _s.arr = arr[a] + "," + i; /*绑上当前循环的数组*/
  161. _s.onclick = function () { /*给上点击事件*/
  162. U.MT.UI.Picture.showPic(this.arr);
  163. }
  164. }
  165. continue; /*跳过本次循环*/
  166. }
  167. if (typeof arr[a] == 'object') /*若键值是对象*/
  168. U.MT.UI.Picture.addPic(arr[a]); /*进行回掉*/
  169. }
  170. }
  171. /**
  172. * 展示图片组里面的图片
  173. * @param picSource 由图片组的图片链接组成的字符串,最后一个数字是用户点击图片组的第几张图片
  174. */
  175. U.MT.UI.Picture.showPic = function (picSource) {
  176. U.MT.UI.Picture.picarr = picSource.split(','); /*用逗号切割数组*/
  177. U.MT.UI.Picture.currentnum = parseInt(U.MT.UI.Picture.picarr.pop()); /*获取切割好的数组的最后一个,也就是用户选择的第几张*/
  178. U.MT.UI.Picture.showpicplace.innerHTML = ""; /*清空图片展示区*/
  179. U.MT.UI.Picture.header.style.display = 'none'; /*隐藏头部*/
  180. U.MT.UI.Picture.conpicbox.style.display = 'none'; /*隐藏所有资源*/
  181. U.MT.UI.Picture.showstage.style.display = 'block'; /*显示展示图片组的div*/
  182. for (var i = 0; i < U.MT.UI.Picture.picarr.length; i++) { /*循环切割好的数组*/
  183. var _div = $$('div', { style: { display: "inline-block", width: U.MT.UI.Picture.MTW + 'px', height: '100%'} }, U.MT.UI.Picture.showpicplace); /*创建一个div*/
  184. var _img = $$('img', { "onerror": U.MD.C.imgError, src: U.MT.UI.Picture.picarr[i], className: "U_MT_UI_Picture_showImage", style: { transition: 'transform .25s'} }, _div); /*把图片丢到div里面去*/
  185. }
  186. U.MT.UI.Picture.pics = U.selectEl('.U_MT_UI_Picture_showImage'); /*刚才创建好的图片*/
  187. U.MT.UI.Picture.pics[0].onload = U.UF.C.apply(this, function () { /*判断图片是否加载完成*/
  188. for (var i = 0; i < U.MT.UI.Picture.pics.length; i++) {
  189. U.MT.UI.Picture.pics[i].style.marginTop = (U.MT.UI.Picture.MTH - U.MT.UI.Picture.pics[i].clientHeight) / 2 + 'px';
  190. }
  191. this.showpicplace.style.width = this.picarr.length * 100 + '%'; /*给适宜的长*/
  192. this.transformControl(this.showpicplace, 'translate(' + (-this.MTW * this.currentnum) + 'px)');
  193. this.downloadPic(U.MT.UI.Picture.download); /*切换下载图片的地址*/
  194. });
  195. }
  196. /**
  197. * 图片展示区的拖拽切换图片
  198. * @param dragEl 拖拽的元素
  199. * @param moveEl 拖拽后需要移动的元素
  200. */
  201. U.MT.UI.Picture.touchDrag = function (dragEl, moveEl) {
  202. dragEl.addEventListener('touchstart', function (event) { /*手指触碰屏幕*/
  203. U.MT.UI.Picture.touchStart(moveEl, event);
  204. });
  205. dragEl.addEventListener('touchmove', function (event) { /*手指在屏幕滑动*/
  206. U.MT.UI.Picture.touchMove(moveEl, event);
  207. });
  208. dragEl.addEventListener('touchend', function (event) { /*手指从屏幕移开*/
  209. U.MT.UI.Picture.touchEnd(moveEl);
  210. });
  211. moveEl.addEventListener('transitionend', U.UF.C.apply(this, function () { /*切换动画结束后*/
  212. if (this.currentnum != this.lastnum) { /*当上一张图片的位置数为等于当前图片的位置数是*/
  213. this.pics[this.lastnum].style.transform = ''; /*还原*/
  214. this.pics[this.lastnum].style.webkitTransform = ''; /*兼容*/
  215. };
  216. }))
  217. }
  218. /**
  219. * 手指接触了屏幕后触发的事件
  220. * @param moveEl 拖拽后需要移动的元素
  221. * @param event 事件的状态
  222. */
  223. U.MT.UI.Picture.touchStart = function (moveEl, event) {
  224. var _mElTransform = moveEl.style.transform === "" ? 0 : parseInt(moveEl.style.transform.match(new RegExp(/[0-9-.]/ig)).join('')); /*获取移动元素的移动距离*/
  225. event.preventDefault(); /*阻止默认事件*/
  226. if (event.touches.length == 1) { /*点击屏幕手指数量为1时*/
  227. var _touch = event.targetTouches[0]; /*获取手指的位置*/
  228. U.MT.UI.Picture.disx = _touch.clientX - _mElTransform; /*获取点击屏幕的X距离*/
  229. U.MT.UI.Picture.disy = _touch.clientY; /*获取点击屏幕的Y距离*/
  230. U.MT.UI.Picture.startx = _touch.clientX; /*获取点击屏幕的X距离*/
  231. U.MT.UI.Picture.touchstartx = _mElTransform; /*获取点击屏幕时,拖动元素的偏移量*/
  232. moveEl.style.transition = null; /*阻止拖动时产生的动画*/
  233. moveEl.style.webkitTransition = null; /*兼容处理*/
  234. U.MT.UI.Picture.fingernum = 1; /*赋值一根手指*/
  235. U.MT.UI.Picture.dbclicktimes++; /*点击数++*/
  236. U.MT.UI.Picture.timer = setTimeout(function () { /*生成一个定时器*/
  237. clearTimeout(this.timer); /*若200毫秒内没有连续点击屏幕2次,将刷新点击数*/
  238. this.dbclicktimes = 0; /*刷新点击数*/
  239. } .bind(this), 200); /*200毫秒后执行里面的内容*/
  240. if (U.MT.UI.Picture.dbclicktimes === 2) { /*当双击屏幕后*/
  241. clearTimeout(U.MT.UI.Picture.timer); /*清除定时器*/
  242. U.MT.UI.Picture.dbclicktimes = 0; /*刷新点击数*/
  243. if (U.MT.UI.Picture.checkscale) { //双击放大
  244. var _multipleSize = parseInt(U.MT.UI.Picture.MTH / U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].clientHeight * 100) / 100; /*计算图片缩放的倍数*/
  245. U.MT.UI.Picture.scalenum = _multipleSize; /*把缩放倍数给上全局*/
  246. U.MT.UI.Picture.scalew = U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].clientWidth * _multipleSize; /*赋值放大后的图片长*/
  247. U.MT.UI.Picture.scaleh = U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].clientHeight * _multipleSize; /*赋值放大后䣌图片宽*/
  248. U.MT.UI.Picture.transformControl(U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum], 'scale(' + U.MT.UI.Picture.scalenum + ')'); /*给当前图片一个transform的属性*/
  249. U.MT.UI.Picture.checkscale = false; /*给上false,以表示放大了*/
  250. } else { //双击缩小
  251. U.MT.UI.Picture.transformControl(U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum], 'translate(0,0)', 'scale'); /*给当前图片一个transform的属性*/
  252. U.MT.UI.Picture.picmovedis[0] = 0; /*清除*/
  253. U.MT.UI.Picture.picmovedis[1] = 0; /*清除*/
  254. U.MT.UI.Picture.scalenum = 1; /*恢复默认这*/
  255. U.MT.UI.Picture.checkscale = true; /*给上true,以表示缩小了*/
  256. }
  257. }
  258. } else if (event.touches.length === 2) { /*点击屏幕手指的数量为2*/
  259. U.MT.UI.Picture.fingernum = 2; /*赋值点击屏幕手指的数量2*/
  260. U.MT.UI.Picture.start = U.MT.UI.Picture.getDistance(event.touches[0], event.touches[1]); /*计算出两个手指的直线距离*/
  261. }
  262. }
  263. /**
  264. * 手指在屏幕中滑动
  265. * @param moveEl 拖拽后需要移动的元素
  266. * @param event 事件的状态
  267. */
  268. U.MT.UI.Picture.touchMove = function (moveEl, event) {
  269. var event = event || window.event, _touch = event.targetTouches[0]; /*获取手指事件状态*/
  270. event.stopPropagation(); /*阻止冒泡事件*/
  271. if (U.MT.UI.Picture.fingernum === 2) { /*当点击屏幕手指的数量为2时*/
  272. U.MT.UI.Picture.now = U.MT.UI.Picture.getDistance(event.touches[0], event.touches[1]); /*计算移动时两个手指的直线距离*/
  273. var _magnification = (U.MT.UI.Picture.now / U.MT.UI.Picture.start - 1); /*计算出缩放倍数*/
  274. U.MT.UI.Picture.scalew = U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].clientWidth * (_magnification + U.MT.UI.Picture.scalenum); /*刷新图片缩放后的长*/
  275. U.MT.UI.Picture.scaleh = U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].clientHeight * (_magnification + U.MT.UI.Picture.scalenum); /*涮新图片缩放后的宽*/
  276. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.transition = null; /*阻止拖动时产生的动画*/
  277. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.webkitTransition = null; /*兼容*/
  278. U.MT.UI.Picture.transformControl(U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum], 'scale(' + (_magnification + U.MT.UI.Picture.scalenum) + ')'); /*给当前图片一个transform的属性*/
  279. U.MT.UI.Picture.checkscale = false; /*给上缩放检测false,以表示放大了,或缩小了*/
  280. } else if (U.MT.UI.Picture.fingernum === 1 && U.MT.UI.Picture.checkscale) { //没放大执行的内容
  281. U.MT.UI.Picture.slide(moveEl, U.MT.UI.Picture.disx, U.MT.UI.Picture.startx, event); /*左右切换图片*/
  282. } else if (U.MT.UI.Picture.fingernum === 1 && !U.MT.UI.Picture.checkscale) {//放大执行的内容
  283. var _mElTransform = moveEl.style.transform === "" ? 0 : parseInt(moveEl.style.transform.match(new RegExp(/[0-9-.]/ig)).join('')); /*获取移动元素的移动距离*/
  284. U.MT.UI.Picture.touchmovedisx = _touch.clientX - _mElTransform + U.MT.UI.Picture.picmovedis[0] - U.MT.UI.Picture.disx; /*X轴图片中心距*/
  285. U.MT.UI.Picture.touchmovedisy = _touch.clientY + U.MT.UI.Picture.picmovedis[1] - U.MT.UI.Picture.disy; /*Y轴图片中心距*/
  286. if (
  287. (Math.abs(U.MT.UI.Picture.touchmovedisx) > Math.abs((U.MT.UI.Picture.MTW - U.MT.UI.Picture.scalew) / 2) + U.MT.UI.Picture.MTW / 3) ||
  288. (U.MT.UI.Picture.rotatenum % 180 != 0 && Math.abs(U.MT.UI.Picture.touchmovedisx) > (Math.abs(U.MT.UI.Picture.MTW - U.MT.UI.Picture.scaleh) / 2) + U.MT.UI.Picture.MTW / 3) ||
  289. Math.abs(U.MT.UI.Picture.touchmovedisy) > U.MT.UI.Picture.scaleh / 1.5
  290. ) { /*若在横向把图片拖出屏幕的一半时,在纵向把图片拖出屏幕的3/2时*/
  291. U.MT.UI.Picture.checkscale = true; /*给上false,以表示缩小到正常的大小*/
  292. U.MT.UI.Picture.disx = U.MT.UI.Picture.currentnum * U.MT.UI.Picture.MTW + _touch.clientX; /*移动框X偏移量+点击屏幕的X距离*/
  293. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.transform = ''; /*清空transform属性*/
  294. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.webkitTransform = ''; /*清空transform属性*/
  295. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.transition = 'transform .25s'; /*给上过渡动画属性*/
  296. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.webkitTransition = 'transform .25s'; /*兼容*/
  297. U.MT.UI.Picture.rotatenum = 0; /*旋转数恢复成默认值*/
  298. U.MT.UI.Picture.scalenum = 1; /*缩放值恢复成默认值*/
  299. U.MT.UI.Picture.startx = _touch.clientX; /*重置点击屏幕的X距离*/
  300. } else {
  301. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.transition = null; /*防止拖动图片时的过度动画*/
  302. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.webkitTransition = null; /*兼容*/
  303. U.MT.UI.Picture.transformControl(U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum], 'translate(' + U.MT.UI.Picture.touchmovedisx + 'px,' + U.MT.UI.Picture.touchmovedisy + 'px)'); /*给当前图片一个transform的属性*/
  304. }
  305. }
  306. }
  307. /**
  308. * 手指离开屏幕后触发
  309. * @param moveEl拖拽后需要移动的书信
  310. */
  311. U.MT.UI.Picture.touchEnd = function (moveEl) {
  312. var _mElTransform = moveEl.style.transform === "" ? 0 : parseInt(moveEl.style.transform.match(new RegExp(/[0-9-.]/ig)).join('')), /*获取移动元素的移动距离*/
  313. _diffX = U.MT.UI.Picture.touchstartx - _mElTransform, /*手指移动的距离*/
  314. _magnification = (U.MT.UI.Picture.now / U.MT.UI.Picture.start - 1); /*计算出缩放倍数*/
  315. U.MT.UI.Picture.touchMoveCheck(_diffX, moveEl); /*判断图片的中心局*/
  316. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.transition = 'transform .25s'; /*给当前图片一个的过渡动画*/
  317. U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].style.webkitTransition = 'transform .25s'; /*兼容*/
  318. if (U.MT.UI.Picture.fingernum === 2) { /*点击屏幕手指的数量为2*/
  319. U.MT.UI.Picture.scalenum += _magnification; /*记录缩放倍数*/
  320. if (U.MT.UI.Picture.scalenum < 0.8) /*缩放倍数最小0.8*/
  321. U.MT.UI.Picture.scalenum = 0.8;
  322. else if (U.MT.UI.Picture.scalenum > 2.5) /*缩放倍数最大2.5*/
  323. U.MT.UI.Picture.scalenum = 2.5;
  324. U.MT.UI.Picture.transformControl(U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum], 'scale(' + U.MT.UI.Picture.scalenum + ')'); /*给当前图片一个transform的属性*/
  325. U.MT.UI.Picture.scalew = U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].clientWidth * U.MT.UI.Picture.scalenum; /*刷新图片缩放的长*/
  326. U.MT.UI.Picture.scaleh = U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].clientHeight * U.MT.UI.Picture.scalenum; /*刷新图片缩放的宽*/
  327. }
  328. if (!U.MT.UI.Picture.checkscale) { /*放大了*/
  329. U.MT.UI.Picture.picmovedis[0] = U.MT.UI.Picture.touchmovedisx; /*X图片中心距*/
  330. U.MT.UI.Picture.picmovedis[1] = U.MT.UI.Picture.touchmovedisy; /*Y图片中心距*/
  331. U.MT.UI.Picture.dragImgBoundary(U.MT.UI.Picture.picmovedis, U.MT.UI.Picture.scalew, U.MT.UI.Picture.scaleh); /*改变图片的位置*/
  332. } else { /*缩小了*/
  333. U.MT.UI.Picture.touchmovedisx = 0; /*恢复到初始*/
  334. U.MT.UI.Picture.touchmovedisy = 0; /*恢复到初始*/
  335. }
  336. }
  337. /**
  338. * 图片拖动超过范围归为
  339. * @param picMoveDis 图片相对中心移动
  340. * @param scaleW 可移动的X范围
  341. * @param scaleH 可移动的Y范围
  342. */
  343. U.MT.UI.Picture.dragImgBoundary = function (picMoveDis, scaleW, scaleH) {
  344. /* 可移动的X范围 可移动的Y范围*/
  345. var _outDisX = scaleW / 2 - U.MT.UI.Picture.MTW / 2, _outDisY = scaleH / 2 - U.MT.UI.Picture.MTH / 2;
  346. if (U.MT.UI.Picture.rotatenum % 180 == 0) { //图片横着的
  347. if (scaleW < U.MT.UI.Picture.MTW) { /*当图片的长小于屏幕的长时*/
  348. picMoveDis[0] = 0; /*图片位置恢复到中心*/
  349. } else {
  350. if (Math.abs(picMoveDis[0]) > Math.abs(_outDisX)) /*判断图片拖动是否超过可移动范围*/
  351. picMoveDis[0] = picMoveDis[0] > 0 ? _outDisX : -_outDisX; /*把图片拉回来*/
  352. }
  353. if (scaleH < U.MT.UI.Picture.MTH) { /*当图片的宽小于屏幕的宽时*/
  354. picMoveDis[1] = 0; /*图片位置恢复到中心*/
  355. } else {
  356. if (Math.abs(picMoveDis[1]) > Math.abs(_outDisY)) /*判断图片拖动是否超过可移动范围*/
  357. picMoveDis[1] = picMoveDis[1] > 0 ? _outDisY : -_outDisY; /*图片位置恢复到中心*/
  358. }
  359. } else { //图片竖着的
  360. if (scaleH < U.MT.UI.Picture.MTW) { /*当图片的宽小于屏幕的长*/
  361. picMoveDis[0] = 0; /*图片位置恢复到中心*/
  362. } else {
  363. if (Math.abs(picMoveDis[0]) > Math.abs(scaleH / 2 - U.MT.UI.Picture.MTW / 2)) /*判断图片拖动是否超过可移动范围*/
  364. picMoveDis[0] = picMoveDis[0] > 0 ? scaleH / 2 - U.MT.UI.Picture.MTW / 2 : -(scaleH / 2 - U.MT.UI.Picture.MTW / 2); /*图片位置恢复到中心*/
  365. }
  366. if (scaleW < U.MT.UI.Picture.MTH) {/*当图片的长小于屏幕的宽*/
  367. picMoveDis[1] = 0; /*图片位置恢复到中心*/
  368. } else {
  369. if (Math.abs(picMoveDis[1]) > Math.abs(scaleW / 2 - U.MT.UI.Picture.MTH / 2)) /*判断图片拖动是否超过可移动范围*/
  370. picMoveDis[1] = picMoveDis[1] > 0 ? scaleW / 2 - U.MT.UI.Picture.MTH / 2 : -(scaleW / 2 - U.MT.UI.Picture.MTH / 2); /*图片位置恢复到中心*/
  371. }
  372. }
  373. U.MT.UI.Picture.transformControl(U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum], 'translate(' + picMoveDis[0] + 'px,' + picMoveDis[1] + 'px)'); /*给当前图片一个transform的属性*/
  374. }
  375. /**
  376. * 计算两点之间的距离
  377. * @param p1 一个手指的数据
  378. * @param p2 另一个手指的数据
  379. * @returns {number} 返回出两个手指之间直线的距离
  380. */
  381. U.MT.UI.Picture.getDistance = function (p1, p2) {
  382. var x = p2.pageX - p1.pageX, /*两个手指横坐标上的距离*/
  383. y = p2.pageY - p1.pageY; /*两个手指纵坐标上的距离*/
  384. return Math.sqrt((x * x) + (y * y)); /*勾股定理*/
  385. }
  386. /**
  387. * 滑动切换
  388. * @param moveEl 移动的元素
  389. * @param _disX
  390. * @param _slowDownX
  391. */
  392. U.MT.UI.Picture.slide = function (moveEl, disX, startX, event) {
  393. var event = event || window.event, _touch = event.targetTouches[0], _mElX = moveEl.style.transform === "" ? 0 : parseInt(moveEl.style.transform.match(new RegExp(/[0-9-.]/ig)).join(''));
  394. if (0 > _mElX) /*判断在第一张图片是否向右滑动*/
  395. if (_mElX < -(moveEl.clientWidth - U.MT.UI.Picture.MTW)) { /*判断在最后一张图片是否向左滑动*/
  396. var _slowDownX = (startX - _touch.clientX) / 1.5 + (_touch.clientX - disX); /*每次滑动的距离少个 3/1 */
  397. U.MT.UI.Picture.transformControl(moveEl, 'translate(' + _slowDownX + 'px)');
  398. } else {
  399. U.MT.UI.Picture.transformControl(moveEl, 'translate(' + (_touch.clientX - disX) + 'px)'); /*默认移动*/
  400. }
  401. else {
  402. U.MT.UI.Picture.transformControl(moveEl, 'translate(' + (_touch.clientX - disX) / 3 + 'px)'); /*每次滑动的距离少个 3/1*/
  403. }
  404. event.stopImmediatePropagation(); /*阻止冒泡事件*/
  405. }
  406. /**
  407. * 移动距离检测
  408. * @param _diffX 手指移动的距离
  409. * @param moveEl 移动的元素
  410. */
  411. U.MT.UI.Picture.touchMoveCheck = function (diffX, moveEl) {
  412. var _pageNum = Math.round(diffX / U.MT.UI.Picture.MTW); /*跨几张图片数*/
  413. U.MT.UI.Picture.lastnum = U.MT.UI.Picture.currentnum; /*定义图片组的上一次的图片位置*/
  414. if (diffX >= 100 && _pageNum === 0) { /*移动距离大于100px,同时跨0张图片*/
  415. U.MT.UI.Picture.currentnum++; /*向右移动一张图片*/
  416. U.MT.UI.Picture.rotatenum = 0; /*恢复旋转数值*/
  417. U.MT.UI.Picture.scalenum = 1; /*恢复缩放值*/
  418. } else if (diffX <= -100 && _pageNum === 0) { /*移动距离小于-100px,同时跨0张图片*/
  419. U.MT.UI.Picture.currentnum--; /*向左移动一张图片*/
  420. U.MT.UI.Picture.rotatenum = 0; /*恢复旋转数值*/
  421. U.MT.UI.Picture.scalenum = 1; /*恢复缩放值*/
  422. } else if (Math.abs(_pageNum) > 0) {
  423. U.MT.UI.Picture.rotatenum = 0; /*恢复旋转数值*/
  424. U.MT.UI.Picture.scalenum = 1; /*恢复缩放值*/
  425. }
  426. U.MT.UI.Picture.currentnum = U.MT.UI.Picture.currentnum + _pageNum >= U.MT.UI.Picture.picarr.length - 1 ? U.MT.UI.Picture.picarr.length - 1 : U.MT.UI.Picture.currentnum + _pageNum; /*判断是否是最后一张图片*/
  427. U.MT.UI.Picture.currentnum = U.MT.UI.Picture.currentnum <= 0 ? 0 : U.MT.UI.Picture.currentnum; /*判断是否是第一张图片*/
  428. moveEl.style.transition = 'transform .25s'; /*给上动画过度属性*/
  429. moveEl.style.webkitTransition = 'transform .25s'; /*给上兼容*/
  430. U.MT.UI.Picture.transformControl(moveEl, 'translate(' + (-U.MT.UI.Picture.currentnum * U.MT.UI.Picture.MTW) + 'px)')
  431. U.MT.UI.Picture.downloadPic(U.MT.UI.Picture.download); /*更新下载图片的地址*/
  432. }
  433. /**
  434. * 图片下载
  435. * @param downLoadPic 下载图标元素
  436. */
  437. U.MT.UI.Picture.downloadPic = function (downLoadPic) {
  438. /*获取图片的地址*/
  439. var imgSrc = U.MT.UI.Picture.pics[U.MT.UI.Picture.currentnum].getAttribute('src');
  440. if (U.MT.UI.Picture.browserIsIe()) {
  441. U.MT.UI.Picture.DownLoadReportIMG(imgSrc);
  442. } else {
  443. /*在给上href*/
  444. downLoadPic.setAttribute("href", imgSrc);
  445. /*给上下载按钮download H5属性,over!*/
  446. downLoadPic.setAttribute('download', imgSrc.toLowerCase().split('/').splice(-1)[0]);
  447. downLoadPic.setAttribute('target', 'view_window')
  448. }
  449. }
  450. /**
  451. * 不支持donwload属性的下载兼容
  452. * @param imgPathURL 图片地hi
  453. * @constructor
  454. */
  455. U.MT.UI.Picture.DownLoadReportIMG = function (imgPathURL) {
  456. //如果隐藏IFRAME不存在,则添加
  457. if (!document.getElementById("IframeReportImg"))
  458. $$('iframe', { style: { display: 'none' }, id: "IframeReportImg", name: "IframeReportImg", onload: "DoSaveAsIMG()", width: 0, height: 0, src: 'about:blank' }, document.body);
  459. if (document.all.IframeReportImg.src != imgPathURL) {
  460. //加载图片
  461. document.all.IframeReportImg.src = imgPathURL;
  462. } else {
  463. //图片直接另存为
  464. U.MT.UI.Picture.DoSaveAsIMG();
  465. }
  466. }
  467. /**
  468. * 不支持donwload属性的下载兼容
  469. * @constructor
  470. */
  471. U.MT.UI.Picture.DoSaveAsIMG = function () {
  472. if (document.all.IframeReportImg.src != "about:blank")
  473. window.frames["IframeReportImg"].document.execCommand("SaveAs");
  474. }
  475. /**
  476. * 判断是否为ie浏览器
  477. * @returns {boolean}
  478. */
  479. U.MT.UI.Picture.browserIsIe = function () {
  480. if (!!window.ActiveXObject || "ActiveXObject" in window)
  481. return true;
  482. else
  483. return false;
  484. }
  485. /**
  486. * transform控制器
  487. * @param _el 需要添加transform的元素
  488. * @param _addAttr 添加的属性
  489. * @param _delAttr 删除的属性
  490. */
  491. U.MT.UI.Picture.transformControl = function (el, addAttr, delAttr) {
  492. var _attrArr = el.style.transform && el.style.transform.split(')'), /*获取该元素的transform属性值用')'分割成数组*/
  493. _addAttr = addAttr || null, /*若没有值给上null*/
  494. _delAttr = delAttr || null, /*若没有值给上null*/
  495. addAttrStr = (el.style.transform && _addAttr) && ((c = el.style.transform.match(new RegExp(_addAttr.split('(')[0]))) && c[0]), /*得到添加属性的名称*/
  496. str = '',
  497. _isinT; /*定义一个字符串*/
  498. if (!_attrArr) { /*若该元素没有transform属性*/
  499. el.style.transform = _addAttr; /*赋值*/
  500. el.style.webkitTransform = _addAttr; /*兼容*/
  501. } else {
  502. _attrArr.pop(); /*删除数组的最后一个元素*/
  503. if (!addAttrStr && _addAttr) /*若没有添加属性的名称 同时 有添加属性*/
  504. _attrArr.push(_addAttr); /*在属性数组加上添加的属性*/
  505. if (_addAttr && addAttrStr == 'translate') /*判断有添加属性 同时 添加属性的名称是translate, 在css3的transform中,一定先做移动,再干别的事情*/
  506. _attrArr.unshift(_addAttr); /*把属性丢到数组的最前面*/
  507. for (var _i = 0; _i < _attrArr.length; _i++) { /*循环数组*/
  508. _isinT = !str.match(new RegExp(_attrArr[_i].split('(')[0].trim())); /*判断准备添加的属性是否在字符串里面,trim()清除字符串里面的空格字符*/
  509. if (_attrArr[_i].match(new RegExp(addAttrStr)) && _isinT) { /*判断添加的属性在字符串里面出现了,则跳过,也称替换掉了*/
  510. str += _addAttr + ' ';
  511. } else if (!_attrArr[_i].match(new RegExp(_delAttr)) && _isinT) { /*判断删除的属性是否在字符串里面*/
  512. if (_attrArr[_i].substr(_attrArr[_i].length - 1, 1) != ")") { /*若属性最后一个字符不是')'则添加上')'*/
  513. str += _attrArr[_i] + ') ';
  514. } else {
  515. str += _attrArr[_i] + ' ';
  516. }
  517. }
  518. }
  519. el.style.transform = str; /*给上属性*/
  520. el.style.webkitTransform = str; /*兼容*/
  521. }
  522. }