zhiqim_magic_zoom.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /*
  2. * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。
  3. *
  4. * 指定登记&发行网站: https://www.zhiqim.com/ 欢迎加盟知启蒙,[编程有你,知启蒙一路随行]。
  5. *
  6. * 本文采用《知启蒙登记发行许可证》,除非符合许可证,否则不可使用该文件!
  7. * 1、您可以免费使用、修改、合并、出版发行和分发,再授权软件、软件副本及衍生软件;
  8. * 2、您用于商业用途时,必须在原作者指定的登记网站,按原作者要求进行登记;
  9. * 3、您在使用、修改、合并、出版发行和分发时,必须包含版权声明、许可声明,及保留原作者的著作权、商标和专利等知识产权;
  10. * 4、您在互联网、移动互联网等大众网络下发行和分发再授权软件、软件副本及衍生软件时,必须在原作者指定的发行网站进行发行和分发;
  11. * 5、您可以在以下链接获取一个完整的许可证副本。
  12. *
  13. * 许可证链接:http://zhiqim.org/licenses/zhiqim_register_publish_license.htm
  14. *
  15. * 除非法律需要或书面同意,软件由原始码方式提供,无任何明示或暗示的保证和条件。详见完整许可证的权限和限制。
  16. */
  17. +(function(Z)
  18. {
  19. /****************************************/
  20. //“图片放大镜”
  21. /****************************************/
  22. // 1、配置举例:
  23. // <ul id="zoomList">
  24. // <li><img src="https://www.zhiqim.com/document/inc/www/tutorial/guest.jpg"></li>
  25. // <li><img src="https://www.zhiqim.com/document/inc/www/tutorial/guest.jpg"></li>
  26. // <li><img src="https://www.zhiqim.com/document/inc/www/tutorial/guest.jpg"></li>
  27. // <li><img src="https://www.zhiqim.com/document/inc/www/tutorial/guest.jpg"></li>
  28. // </ul>
  29. //
  30. // <script>
  31. // var newMagicZoom = new Z.MagicZoom();
  32. // newMagicZoom.elem = Z("#zoomList"); // 列表对象
  33. // newMagicZoom.width = 400; // 自定义宽度
  34. // newMagicZoom.listShow = 5; // 自定义小图显示个数
  35. // newMagicZoom.zoomRatio = 2; // 自定义缩放倍数
  36. // newMagicZoom.execute();
  37. // </script>
  38. /************************************************************************/
  39. /********************************************/
  40. Z.MagicZoom = Z.Class.newInstance();
  41. Z.MagicZoom.prototype =
  42. {
  43. //start of Z.MagicZoom.prototype
  44. defaults:
  45. {//定义
  46. elem: null, // 列表对象
  47. width: -1, // 容器宽度,默认为 -1,动态计算
  48. listShow: 5, // 导航最多展示图片数量
  49. zoomRatio: 2, // 缩放倍数,默认两倍
  50. },
  51. init: function()
  52. {//初始化
  53. },
  54. execute: function()
  55. {//执行
  56. this.$elem = Z.$elem(this.elem, "Z.MagicZoom");
  57. if (this.width < 0){
  58. this.width = this.$elem.offsetWidth();
  59. }
  60. //重新组装排版
  61. var wrapHtml = '<div class="z-magicZoom z-relative" style="width:'+this.width+'px;">';
  62. wrapHtml += '<div class="z-zoomImg z-w100p z-bd z-relative" style="height:'+this.width+'px;">';
  63. wrapHtml += '<img class="z-absolute-center-middle" src="">';
  64. wrapHtml += '<i class="z-font z-query z-absolute z-r0 z-b0 z-w30 z-h30 z-px20 z-lh30 z-text-center"></i>';
  65. wrapHtml += '<div class="z-zoomCover z-absolute z-bd z-hide"></div>';
  66. wrapHtml += '</div>';
  67. wrapHtml += '<div class="z-zoomList z-w100p z-mg-t3 z-relative"><div class="z-relative z-overflow-hidden"></div></div>';
  68. wrapHtml += '<div class="z-zoomShow z-absolute z-overflow-hidden z-hide"><img class="z-absolute z-l0 z-t0" src=""></div>';
  69. wrapHtml += '</div>';
  70. this.$wrap = Z(wrapHtml).insertAfter(this.$elem);
  71. this.$zoom = this.$wrap.find(".z-zoomImg");
  72. this.$zoomImg = this.$zoom.find("img");
  73. this.$zoomIcon = this.$zoom.find(".z-font");
  74. this.$list = this.$wrap.children(".z-zoomList");
  75. this.$listUl = this.$list.find("div").append(this.$elem);
  76. this.$lis = this.$elem.find("li").css("opacity",.5);
  77. //常量
  78. this.length = this.$lis.length;
  79. this.zoomWidth = this.$zoom.offsetWidth()-2;
  80. this.zoomHeight = this.$zoom.offsetHeight()-2;
  81. this.coverWidth = this.zoomWidth / this.zoomRatio;
  82. this.coverHeight = this.zoomHeight / this.zoomRatio;
  83. this.maxX = this.zoomWidth - this.coverWidth;
  84. this.maxY = this.zoomHeight - this.coverHeight;
  85. this.minCx = this.coverWidth/2;
  86. this.minCy = this.coverHeight/2;
  87. this.maxCx = this.maxX + this.coverWidth/2;
  88. this.maxCy = this.maxY + this.coverHeight/2;
  89. //遮罩层、展示层
  90. this.$zoomCover = this.$wrap.find(".z-zoomCover").css("width",this.coverWidth).css("height",this.coverHeight);
  91. this.$zoomShow = this.$wrap.find(".z-zoomShow").css("width",this.zoomWidth).css("height",this.zoomHeight)
  92. .css("left",this.zoomWidth + 10).css("top",0);
  93. this.$showImg = this.$zoomShow.find("img");
  94. if (this.length > this.listShow){
  95. this.hasBtn = true;
  96. this.$btnPrev = Z('<div class="z-absolute z-l0 z-t0 z-b0 z-w20 z-h100p z-bd z-text-center z-pointer z-event-none z-text-gray"><i class="z-font z-arrowhead-left z-absolute-center-middle z-w20 z-h20"></i></div>').appendTo(this.$list);
  97. this.$btnNext = Z('<div class="z-absolute z-r0 z-t0 z-b0 z-w20 z-h100p z-bd z-text-center z-pointer"><i class="z-font z-arrowhead-right z-absolute-center-middle z-w20 z-h20"></i></div>').appendTo(this.$list);
  98. this.$listUl.addClass("z-mg-l20 z-mg-r20");
  99. this.$btnPrev.on("click", this.prevList, this);
  100. this.$btnNext.on("click", this.nextList, this);
  101. }
  102. //计算每个小图大小
  103. var ulWidth = this.$listUl.offsetWidth() - 6;
  104. this.liWidth = Math.round(ulWidth/this.listShow);
  105. this.$listUl.css("height",this.liWidth);
  106. this.$list.css("height",this.liWidth);
  107. this.$elem.css("width",this.liWidth * this.length).css("height",this.liWidth);
  108. this.$lis.css("width",this.liWidth - 6).css("height",this.liWidth - 6);
  109. this.ulShow = ulWidth;
  110. this.ulWidth = this.$elem.offsetWidth();
  111. //第一张图
  112. this.setImgSrc(0);
  113. //绑定事件
  114. this.$zoom.on("mouseenter", this.zoomEnter, this).on("mousemove", this.zoomMove, this).on("mouseleave", this.zoomLeave, this);
  115. this.$lis.on("mouseenter", this.lisEnter, this);
  116. },
  117. setImgSrc: function(index)
  118. {
  119. var $li = Z(this.$lis[index]);
  120. $li.css("opacity",1).siblings("li").css("opacity",.5);
  121. var imgSrc = $li.find("img").attr("src");
  122. this.$zoomImg.attr("src", imgSrc);
  123. this.$showImg.attr("src", imgSrc);
  124. },
  125. zoomEnter: function(ev)
  126. {//进入 zoom ,显示放大镜
  127. Z.E.forbidden(ev);
  128. this.$zoomCover.show();
  129. this.$zoomShow.show();
  130. //设置位置
  131. var mX = ev.clientX;
  132. var mY = ev.clientY;
  133. var rect = this.$zoom[0].getBoundingClientRect();
  134. var cX = rect.left + rect.width/2;
  135. var cy = rect.top + rect.height/2;
  136. this.$zoomCover.css("left", (mX > cX)?this.maxX:0)
  137. .css("top", (mY > cy)?this.maxY:0);
  138. this.$showImg.css("width",this.$zoomImg.offsetWidth() * this.zoomRatio)
  139. .css("height",this.$zoomImg.offsetHeight() * this.zoomRatio)
  140. .css("margin-left",parseInt(this.$zoomImg.css("margin-left")) * this.zoomRatio)
  141. .css("margin-top",parseInt(this.$zoomImg.css("margin-top")) * this.zoomRatio);
  142. },
  143. zoomMove: function(ev)
  144. {//移动放大镜
  145. Z.E.forbidden(ev);
  146. // cover 位置计算
  147. var mX = ev.clientX;
  148. var mY = ev.clientY;
  149. var rect = this.$zoom[0].getBoundingClientRect();
  150. mX -= rect.left;
  151. mY -= rect.top;
  152. var setX, setY;
  153. if (mX < this.minCx){
  154. setX = 0;
  155. } else if (mX > this.maxCx){
  156. setX = this.maxX;
  157. } else {
  158. setX = mX - this.minCx;
  159. }
  160. if (mY < this.minCy){
  161. setY = 0;
  162. } else if (mY > this.maxCy){
  163. setY = this.maxY;
  164. } else {
  165. setY = mY - this.minCy;
  166. }
  167. //cover 位置定义
  168. this.$zoomCover.css("left", setX).css("top", setY);
  169. //show 位置计算
  170. setX = -(setX * this.zoomRatio);
  171. setY = -(setY * this.zoomRatio);
  172. this.$showImg.css("left", setX).css("top", setY);
  173. },
  174. zoomLeave: function(ev)
  175. {//离开 zoom ,隐藏放大镜
  176. Z.E.forbidden(ev);
  177. this.$zoomCover.hide();
  178. this.$zoomShow.hide();
  179. },
  180. lisEnter: function(ev)
  181. {//hover 小图片,切换图片显示
  182. Z.E.forbidden(ev);
  183. var $li = Z(Z.E.current(ev));
  184. if ($li.css("opacity") == "1")
  185. return;
  186. var liIndex = this.getParentIndex($li[0]);
  187. this.setImgSrc(liIndex)
  188. },
  189. prevList: function(ev)
  190. {//向前切换图片列表
  191. Z.E.forbidden(ev);
  192. var nLeft = parseInt(this.$elem.css("left"));
  193. nLeft += this.ulWidth;
  194. nLeft = nLeft > 0 ? 0 : nLeft;
  195. this.$elem.css("left", nLeft);
  196. //按钮状态
  197. this.$btnNext.removeClass("z-event-none").removeClass("z-text-gray");
  198. if (nLeft == 0){
  199. this.$btnPrev.addClass("z-event-none z-text-gray");
  200. }
  201. },
  202. nextList: function(ev)
  203. {//向后切换图片列表
  204. Z.E.forbidden(ev);
  205. var nLeft = parseInt(this.$elem.css("left"));
  206. nLeft -= this.ulShow;
  207. if ((this.ulShow - nLeft)> this.ulWidth){
  208. nLeft = this.ulShow - this.ulWidth;
  209. }
  210. this.$elem.css("left", nLeft);
  211. //按钮状态
  212. this.$btnPrev.removeClass("z-event-none").removeClass("z-text-gray");
  213. if (nLeft == (this.ulShow - this.ulWidth)){
  214. this.$btnNext.addClass("z-event-none z-text-gray");
  215. }
  216. },
  217. getParentIndex: function(elem)
  218. {//获取 elem 在父级的 索引值
  219. var ind = 0;
  220. while (elem = elem.previousSibling) {
  221. if (elem.nodeType == 1)
  222. ind++
  223. }
  224. return ind;
  225. },
  226. //end of Z.MagicZoom.prototype
  227. }
  228. //END
  229. })(zhiqim);