经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
基于JS实现点击图片在弹出层显示大图效果
来源:jb51  时间:2022/8/1 11:08:53  对本文有异议

Javascript是个好东西。

Jquery是基于这个好东西的一个强大的库。

今天要实现的功能是基于这两个玩意儿的。

点击图片,在弹出层显示原图。

大概效果是这样的:

上代码:

先是html部分:

  1. <div style="text-align:center;margin-top:200px;">
  2. <img src="https://guanchao.site/uploads/atricle/5db3a72e49efd.jpeg" alt="" style="width:100px;" id="plus">
  3. </div>
  4. <!-- 弹窗部分代码 -->
  5. <div id="outerdiv" style="position:fixed;top:0;left:0;background:rgba(0,0,0,0.7);z-index:2;width:100%;height:100%;display:none;">
  6. <div id="innerdiv" style="position:absolute;">
  7. <img id="bigimg" style="border:5px solid #fff;" src="" />
  8. </div>
  9. </div>
  10. <!-- 弹窗部分代码 -->

Js部分:

  1. $(function(){
  2. $("#plus").click(function(){
  3. var _this = $(this);//将当前的pimg元素作为_this传入函数
  4. imgShow("#outerdiv", "#innerdiv", "#bigimg", _this);
  5. });
  6. });
  7. function imgShow(outerdiv, innerdiv, bigimg, _this){
  8. var src = _this.attr("src");//获取当前点击的pimg元素中的src属性
  9. $(bigimg).attr("src", src);//设置#bigimg元素的src属性
  10. /*获取当前点击图片的真实大小,并显示弹出层及大图*/
  11. $("<img/>").attr("src", src).load(function(){
  12. var windowW = $(window).width();//获取当前窗口宽度
  13. var windowH = $(window).height();//获取当前窗口高度
  14. var realWidth = this.width;//获取图片真实宽度
  15. var realHeight = this.height;//获取图片真实高度
  16. var imgWidth, imgHeight;
  17. var scale = 0.8;//缩放尺寸,当图片真实宽度和高度大于窗口宽度和高度时进行缩放
  18. if(realHeight>windowH*scale) {//判断图片高度
  19. imgHeight = windowH*scale;//如大于窗口高度,图片高度进行缩放
  20. imgWidth = imgHeight/realHeight*realWidth;//等比例缩放宽度
  21. if(imgWidth>windowW*scale) {//如宽度扔大于窗口宽度
  22. imgWidth = windowW*scale;//再对宽度进行缩放
  23. }
  24. } else if(realWidth>windowW*scale) {//如图片高度合适,判断图片宽度
  25. imgWidth = windowW*scale;//如大于窗口宽度,图片宽度进行缩放
  26. imgHeight = imgWidth/realWidth*realHeight;//等比例缩放高度
  27. } else {//如果图片真实高度和宽度都符合要求,高宽不变
  28. imgWidth = realWidth;
  29. imgHeight = realHeight;
  30. }
  31. $(bigimg).css("width",imgWidth);//以最终的宽度对图片缩放
  32. var w = (windowW-imgWidth)/2;//计算图片与窗口左边距
  33. var h = (windowH-imgHeight)/2;//计算图片与窗口上边距
  34. $(innerdiv).css({"top":h, "left":w});//设置#innerdiv的top和left属性
  35. $(outerdiv).fadeIn("fast");//淡入显示#outerdiv及.pimg
  36. });
  37. $(outerdiv).click(function(){//再次点击淡出消失弹出层
  38. $(this).fadeOut("fast");
  39. });
  40. }

20220617补充:

PC端的图片放大使用上边的代码即可,但是在移动端的时候我们就需要用到两指放大缩小功能,然后还要加上单指移动的功能,

基础代码还是与上边一样,我就不废话了,直接上完整的代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/2.2.0/jquery.min.js"
  9. type="application/javascript"></script>
  10. </head>
  11. <body>
  12. <div style="text-align:center;margin-top:200px;">
  13. <img src="https://resource.guanchao.site/uploads/atricle/5db513ccbe77f.png" alt="" style="width:100px;" class="plus">
  14. </div>
  15. <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
  16. <div style="text-align:center;margin-top:200px;">
  17. <img src="https://resource.guanchao.site/uploads/atricle/5db513ccbe77f.png" alt="" style="width:100px;"
  18. class="plus">
  19. </div>
  20. <!-- 弹窗部分代码 -->
  21. <div id="outerdiv"
  22. style="position:fixed;top:0;left:0;background:rgba(0,0,0,0.7);z-index:2;width:100%;height:100%;display:none;">
  23. <div id="innerdiv" style="position:absolute;">
  24. <img id="bigimg" style="border:5px solid #fff;" src="" />
  25. </div>
  26. </div>
  27. <!-- 弹窗部分代码 -->
  28. </body>
  29. </html>
  30. <script src="https://dev.mools.net/lims/web/common/js/vconsole.min.js"></script>
  31. <script>
  32. // 初始化
  33. var vConsole = new VConsole();
  34. $(function () {
  35. $(".plus").click(
  36. function () {
  37. var _this = $(this);//将当前的pimg元素作为_this传入函数
  38. imgShow("#outerdiv", "#innerdiv", "#bigimg", _this);
  39. //移动端手指移动事件,如果不需要移动端手指事件,这一部分内容可以不加,只要上面两行代码以及imgShow()事件
  40. var eleImg = document.querySelector('#innerdiv');
  41. var store = {
  42. scale: 1
  43. };
  44. //定义移动端的初始位置
  45. var position_top, position_left, pageX, pageY;
  46. // 缩放事件的处理
  47. //事件开始
  48. eleImg.addEventListener('touchstart', function (event) {
  49. event.preventDefault();//阻止默认事件,防止底部内容滚动
  50. //在触屏设备下,要判断是单指还是多指操作,可以通过event.touches数组对象的长度判断。
  51. var touches = event.touches;
  52. var events = touches[0];//单指
  53. var events2 = touches[1];//双指
  54. if (touches.length == 1) { //单指操作
  55. pageX = Number(events.pageX);
  56. pageY = Number(events.pageY);
  57. store.moveable = true;
  58. var _obj = $('#innerdiv');
  59. // .css获取的值是字符串
  60. position_left = parseFloat(_obj.css('left')
  61. .split('px'));
  62. position_top = parseFloat(_obj.css('top')
  63. .split('px'));
  64. } else {
  65. // 第一个触摸点的坐标
  66. store.pageX = events.pageX;
  67. store.pageY = events.pageY;
  68. store.moveable = true;
  69. if (events2) {
  70. store.pageX2 = events2.pageX;
  71. store.pageY2 = events2.pageY;
  72. }
  73. store.originScale = store.scale || 1;
  74. }
  75. }, { passive: false }); //passive: false必须加上,否则控制台报错
  76. //开始移动
  77. document.addEventListener('touchmove', function (event) {
  78. // event.preventDefault();//阻止默认事件,防止底部滚动
  79. if (!store.moveable) {
  80. return;
  81. }
  82. var touches = event.touches;
  83. var events = touches[0];
  84. var events2 = touches[1];
  85. if (touches.length == 1)
  86. {
  87. var pageX2 = Number(events.pageX);
  88. var pageY2 = Number(events.pageY);
  89. //控制图片移动
  90. $('#innerdiv').css({
  91. 'top': position_top + pageY2 - pageY + 'px',
  92. "left": position_left + pageX2 - pageX + 'px'
  93. })
  94. }
  95. else
  96. {
  97. // 双指移动
  98. if (events2) {
  99. // 第2个指头坐标在touchmove时候获取
  100. if (!store.pageX2) {
  101. store.pageX2 = events2.pageX;
  102. }
  103. if (!store.pageY2) {
  104. store.pageY2 = events2.pageY;
  105. }
  106. // 获取坐标之间的距离
  107. var getDistance = function (start, stop) {
  108. //用到三角函数
  109. return Math.hypot(stop.x - start.x,
  110. stop.y - start.y);
  111. };
  112. // 双指缩放比例计算
  113. var zoom = getDistance({
  114. x: events.pageX,
  115. y: events.pageY
  116. }, {
  117. x: events2.pageX,
  118. y: events2.pageY
  119. }) / getDistance({
  120. x: store.pageX,
  121. y: store.pageY
  122. }, {
  123. x: store.pageX2,
  124. y: store.pageY2
  125. });
  126. // 应用在元素上的缩放比例
  127. var newScale = store.originScale * zoom;
  128. // 最大缩放比例限制
  129. if (newScale > 3)
  130. {
  131. newScale = 3;
  132. }
  133. // 记住使用的缩放值
  134. store.scale = newScale;
  135. // 图像应用缩放效果
  136. eleImg.style.transform = 'scale('
  137. + newScale + ')';
  138. }
  139. }
  140. }, { passive: false });//*/
  141. document.addEventListener('touchend', function () {
  142. store.moveable = false;
  143. delete store.pageX2;
  144. delete store.pageY2;
  145. });
  146. document.addEventListener('touchcancel', function () {
  147. store.moveable = false;
  148. delete store.pageX2;
  149. delete store.pageY2;
  150. });
  151. });
  152. //移动端手指页面结束
  153. });
  154. //遮罩层图片位置
  155. function imgShow(outerdiv, innerdiv, bigimg, _this) {
  156. //这是刚才判断是否PC端的函数事件
  157. var flag = IsPC();
  158. console.log(flag);
  159. var src = _this.attr("src");//获取当前点击的pimg元素中的src属性
  160. $(bigimg).attr("src", src);//设置#bigimg元素的src属性
  161. /*获取当前点击图片的真实大小,并显示弹出层及大图*/
  162. $("<img/>").attr("src", src).load(function () {
  163. //注意在使用这种方法获取窗口高度和宽度的时候,
  164. //务必在html页面最上方加上一句<!DOCTYPE html>,否则获取屏幕高度时会出问题
  165. var windowW = $(window).width();//获取当前窗口宽度
  166. var windowH = $(window).height();//获取当前窗口高度
  167. var realWidth = this.width;//获取图片真实宽度
  168. var realHeight = this.height;//获取图片真实高度
  169. var imgWidth, imgHeight;
  170. var scale = 0.8;//缩放尺寸,当图片真实宽度和高度大于窗口宽度和高度时进行缩放
  171. if (realHeight > windowH * scale) {//判断图片高度
  172. imgHeight = windowH * scale;//如大于窗口高度,图片高度进行缩放
  173. imgWidth = imgHeight / realHeight * realWidth;//等比例缩放宽度
  174. if (imgWidth > windowW * scale) {//如宽度扔大于窗口宽度
  175. imgWidth = windowW * scale;//再对宽度进行缩放
  176. }
  177. } else if (realWidth > windowW * scale) {//如图片高度合适,判断图片宽度
  178. imgWidth = windowW * scale;//如大于窗口宽度,图片宽度进行缩放
  179. imgHeight = imgWidth / realWidth * realHeight;//等比例缩放高度
  180. } else {//如果图片真实高度和宽度都符合要求,高宽不变
  181. if (flag == false) {
  182. imgWidth = realWidth;
  183. imgHeight = realHeight;
  184. } else if (realWidth >= 1000) { //这里我怕图片太大又做了个判断
  185. imgWidth = realWidth;
  186. imgHeight = realHeight;
  187. } else {
  188. imgWidth = realWidth * 2;
  189. imgHeight = realHeight * 2;
  190. }
  191. }
  192. $(bigimg).css("width", imgWidth);//以最终的宽度对图片缩放
  193. var w = (windowW - imgWidth) / 2;//计算图片与窗口左边距
  194. var h = (windowH - imgHeight) / 2;//计算图片与窗口上边距
  195. $(innerdiv).css({
  196. "top": h,
  197. "left": w
  198. });//设置#innerdiv的top和left属性
  199. $(outerdiv).fadeIn("fast");//淡入显示#outerdiv及.pimg
  200. });
  201. $(outerdiv).click(function () {//再次点击淡出消失弹出层
  202. $(this).fadeOut("fast");
  203. });
  204. };
  205. function IsPC()
  206. {
  207. var sUserAgent = navigator.userAgent;
  208. if (sUserAgent.indexOf('Android') > -1 || sUserAgent.indexOf('iPhone') > -1 || sUserAgent.indexOf('iPad') > -1 || sUserAgent.indexOf('iPod') > -1 || sUserAgent.indexOf('Symbian') > -1) {
  209. return false;
  210. }
  211. else {
  212. return true;
  213. }
  214. }
  215. </script>

效果如下图所示:

到此这篇关于基于JS实现点击图片在弹出层显示大图效果的文章就介绍到这了,更多相关JS弹出层显示大图内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号