js实现图片放大镜效果——简单方法

女爷i 2022-08-29 05:45 355阅读 0赞

之前写过一篇关于电商项目商品详情页面的图片放大镜效果:电商项目商品详情页的图片放大效果实现:https://blog.csdn.net/yehaocheng520/article/details/119003274?spm=1001.2014.3001.5501

在这里插入图片描述
当时是在vue项目中使用的,其实跟在js中原理也是一样的。

实现图片放大镜效果的重点就是下面的这张图了:

在这里插入图片描述
上面的方法中,右侧图片,为了实现放大,使用的是background背景图片的设置原理,给background-size设置大于1的参数,就可以实现图片的放大效果了。

下面介绍另一种方法来实现图片放大镜的效果:个人感觉下面的方法更简单。

在这里插入图片描述

1.html部分代码——左右布局,左侧有图片+选择框,右侧有图片

  1. <div class="leftcon" id="left">
  2. <img src="img/风景-1.jpg">
  3. <div class="slide_box" id="box"></div>
  4. </div>
  5. <div class="rightcon" id="right">
  6. <img src="img/风景-1.jpg">
  7. </div>

2.css部分——右侧大图直接设置width height百分比超过1,实现放大效果

  1. .leftcon{
  2. width: 350px;
  3. height: 350px;
  4. margin: 100px 20px 0px 312px;
  5. float: left;
  6. position: relative;
  7. box-shadow:3px 3px 10px 0 #111111; /*给图片施加阴影效果 */
  8. -webkit-box-shadow: 3px 3px 10px 0 #111111; /*兼容性处理*/
  9. -moz-box-shadow: 3px 3px 10px 0 #111111;
  10. }
  11. .leftcon img{
  12. width: 100%;
  13. height: 100%;
  14. }
  15. .leftcon .slide_box{
  16. display:none; /*将小方块盒子隐藏*/
  17. position:absolute;
  18. top:0;
  19. left:0;
  20. width:175px;
  21. height:175px;
  22. background:#000;
  23. opacity: 0.3;
  24. cursor:move; /*改变鼠标的形状*/
  25. }
  26. .rightcon{
  27. display: none; /*将右边div隐藏*/
  28. width: 350px;
  29. height: 350px;
  30. margin-top: 100px;
  31. float: left;
  32. overflow: hidden;
  33. position: relative;
  34. }
  35. .rightcon img{
  36. width: 200%;
  37. height: 200%;
  38. position: absolute;
  39. left: 0px;
  40. top: 0px;
  41. }

3.js部分——关键部分

1.首先获取到几个关键的dom元素

  1. var leftone = document.getElementById('left');//获取左侧部分dom
  2. var rightone = document.getElementById('right');//获取右侧部分dom
  3. var box = documnent.getElementById('box');//获取选择框dom
  4. var rimg = rightone.getElementsByTagName('img')[0];//获取右侧部分中的img数组的第一个

2.需要用到的参数——关于浏览器界面的参数

  1. 浏览器点击事件传递的事件源是event,代表对象的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态,eventwindow的一个属性

event || window.event:就是事件源对象,这样写是为了兼容IE浏览器
在这里插入图片描述
根据上面的图片,我们可以看到几个相关的参数:
e.pageY:鼠标点击处距离页面最顶部的距离
e.pageX:鼠标点击处距离页面最左边的距离
oAppTop:就是左侧图片距离页面顶部的距离:也就是当前案例中的leftone.offsetTop
oAppLeft:就是左侧图片距离页面左边的距离:也就是当前案例中的leftone.offsetLeft
height:就是选择框的高度:也就是当前案例中的box.offsetHeight
width:就是选择框的宽度:也就是当前案例中的box.offsetWidth

通过上面的分析,可以得出:选择框的位置left top的大小:
var top = e.pageY - leftone.offsetTop - box.offsetHeight/2;
var left = e.pageX - leftone.offsetLeft - box.offsetWidth/2;

3.计算选择框出现的边界范围——因为选择框是相对于左侧图片的,因此最小值是0

var maxtop = leftone.offsetHeight - box.offsetHeight;//选择框的最大top值
var maxleft = leftone.offsetWidth - box.offsetWidth;//选择框的最大left值
var mintop = 0;//选择框的最小top值
var minleft = 0;//选择框的最小left值

4.判断选择框的边界范围

代码分析:

  1. top是鼠标到浏览器的垂直距离减去左边div顶部到浏览器的垂直距离减去选择框的高度的一半,那么现在鼠标在选择框的中心,也就是说,top就等于选择框的顶部到左边的div的垂直距离,那么,如果top<0,就是说选择框和左边的div顶部重合,就让选择框的top值为0,即鼠标继续向上移动,选择框不再移动,从而让选择框的移动范围不能超过左边div的宽高范围
  2. if(top < mintop){
  3. box.style.top = mintop + "px";
  4. mvtop = mintop;
  5. }else if(top>maxtop){
  6. box.style.top = maxtop+'px';
  7. mvtop = maxtop;
  8. }else{
  9. box.style.top = top +'px';
  10. mvtop = top;
  11. }
  12. if(left < minleft){
  13. box.style.left = minleft + "px";
  14. mvleft = minleft;
  15. }else if(left > maxleft){
  16. box.style.left = maxleft + "px";
  17. mvleft = maxleft;
  18. }else{
  19. box.style.left = left + 'px';
  20. mvleft = left;
  21. }

5.给右侧大图的位置赋值

rimg.style.top = -mvtop*2+‘px’
rimg.style.left = -mvleft*2+'px'

6.监听鼠标移动的事件——onmouseomveonmouseleave

鼠标移动效果

  1. leftone.onmousemove = function(e){
  2. var e = e||window.event;//判断事件源
  3. box.style.display = 'block';
  4. getPosition(e);//这个就是移动鼠标改变右侧图片位置的方法
  5. rightone.style.display = 'block';
  6. }

鼠标移出效果

  1. leftone.onmouseleave = function(e){
  2. var e = e||window.event;//判断事件源
  3. box.style.display = 'none';
  4. rightone.style.display = 'none';
  5. }

完整html代码如下

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <link rel="icon" href="img/favicon.ico" type="img/x-ico" />
  6. <title>Image Magnifying Glass</title>
  7. <!-- 放大镜的原理: 左边图片100%显示,右边图片200%显示并定位,定义两个图片框,将图片放入,图片超出相框部分隐藏,移动滑块,根据滑块的位置,计算出右边图片的定位,从而形成映射效果,即图片放大镜 -->
  8. <style type="text/css">
  9. body {
  10. margin: 0px;
  11. padding: 0px;
  12. }
  13. img {
  14. /* display: block; */
  15. }
  16. .leftcon {
  17. width: 350px;
  18. height: 350px;
  19. margin: 100px 20px 0px 312px;
  20. float: left;
  21. position: relative;
  22. box-shadow: 3px 3px 10px 0 #111111;
  23. /*给图片施加阴影效果 */
  24. -webkit-box-shadow: 3px 3px 10px 0 #111111;
  25. /*兼容性处理*/
  26. -moz-box-shadow: 3px 3px 10px 0 #111111;
  27. }
  28. .leftcon img {
  29. width: 100%;
  30. height: 100%;
  31. }
  32. .leftcon .slide_box {
  33. display: none;
  34. /*将小方块盒子隐藏*/
  35. position: absolute;
  36. top: 0;
  37. left: 0;
  38. width: 175px;
  39. height: 175px;
  40. background: #000;
  41. opacity: 0.3;
  42. cursor: move;
  43. /*改变鼠标的形状*/
  44. }
  45. .rightcon {
  46. display: none;
  47. /*将右边div隐藏*/
  48. width: 350px;
  49. height: 350px;
  50. margin-top: 100px;
  51. float: left;
  52. overflow: hidden;
  53. position: relative;
  54. }
  55. .rightcon img {
  56. width: 200%;
  57. height: 200%;
  58. position: absolute;
  59. left: 0px;
  60. top: 0px;
  61. }
  62. </style>
  63. </head>
  64. <body>
  65. <div class="leftcon" id="left">
  66. <img src="img/风景-1.jpg" />
  67. <div class="slide_box" id="box"></div>
  68. </div>
  69. <div class="rightcon" id="right">
  70. <img src="img/风景-1.jpg" />
  71. </div>
  72. </body>
  73. <script>
  74. var leftone = document.getElementById("left");
  75. var rightone = document.getElementById("right");
  76. var box = document.getElementById("box");
  77. var rimg = rightone.getElementsByTagName("img")[0];
  78. // Event是获取事件对象,对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态,envet是windows的一个属性。
  79. // 放大镜实现方法(获取右边图片定位)
  80. function getPosition(e) {
  81. //这里的参数e就是代表event
  82. //首先我们要去判断事件源,获取事件源,也就是e
  83. var e = e || window.event; //实现兼容
  84. //理解:
  85. //这个表达式写全是这样:var e=event?event||window.event;
  86. //如果存在event,那么var e=event;而如果不存在event,那么var e=window.event.那么可以看出确实能实现兼容
  87. var top = e.clientY - leftone.offsetTop - box.offsetHeight / 2;
  88. var left = e.clientX - leftone.offsetLeft - box.offsetWidth / 2;
  89. //理解:
  90. //e.clientY:返回事件触发时鼠标相对于元素视口的Y坐标。
  91. //e.clientX:返回事件触发时鼠标相对于元素视口的X坐标。
  92. //这里的元素视口实际上代指就是浏览器,clientX是鼠标距离浏览器左边框的距离,clientY是鼠标距离浏览器上边框的距离。
  93. //offsetTop获取对象相对于版面或由offsetTop属性指定的父坐标的计算顶端位置。这里就是左边的div相对于body即浏览器窗口的纵向距离
  94. //offsetLeft获取对象相对于版面或由offsetLeft属性指定的父坐标的计算顶端位置。这里就是左边的div相对于body即浏览器窗口的纵横向距离
  95. //offsetHeight是对象的可见高度。这里是指小滑块的高度
  96. //offsetHeight是对象的可见宽度。这里是指小滑块的宽度
  97. //这里为什么除以2?是因为我们不除以2的话,事件源也就是鼠标就在这个小滑块的的右下角,并不美观
  98. //我们要让鼠标位于滑块的中心,所以宽高各减去一半
  99. //边界判断
  100. var maxtop = leftone.offsetHeight - box.offsetHeight; //获取小滑块最大纵向移动距离
  101. var maxleft = leftone.offsetWidth - box.offsetWidth; //获取小滑块最大横向移动距离
  102. var mintop = 0; //获取小滑块最小纵向移动距离
  103. var minleft = 0; //获取小滑块最大纵向移动距离
  104. var mvtop; //定义小滑块的纵向移动距离
  105. var mvleft; //定义小滑块的横向移动距离
  106. // 判断
  107. if (top < mintop) {
  108. box.style.top = mintop + "px";
  109. mvtop = mintop;
  110. //理解:
  111. //top是鼠标到浏览器的垂直距离-左边div顶部到浏览器的垂直距离-小滑块的高度的一半。那么现在鼠标在小滑块的中心,也就是说,top就等于小滑块的顶部到左边div的垂直距离
  112. //那么,如果top<0,就是说小滑块和左边div顶部重合,就让小滑块的top值为0,即鼠标继续向上移动,小滑块不在移动,从而让小滑块的移动范围不能超过左边div的宽高范围
  113. //下方同理
  114. } else if (top > maxtop) {
  115. box.style.top = maxtop + "px";
  116. mvtop = maxtop;
  117. //如果top>maxtop,就是说小滑块和左边div底部重合,就让小滑块的top值为maxtop,即鼠标继续向下移动,小滑块不在移动,从而让小滑块的移动范围不能超过左边div的宽高范围
  118. } else {
  119. box.style.top = top + "px";
  120. mvtop = top;
  121. //不超过边界,则小滑块的垂直移动距离就等于top,即小滑块的顶部到左边div的垂直距离
  122. }
  123. if (left < minleft) {
  124. box.style.left = minleft + "px";
  125. mvleft = minleft;
  126. } else if (left > maxleft) {
  127. box.style.left = maxleft + "px";
  128. mvleft = maxleft;
  129. } else {
  130. box.style.left = left + "px";
  131. mvleft = left;
  132. }
  133. //因为右边div的图片是左边div的图片的两倍,而左边div和右边div都是小滑块的宽高的两倍,而要让右边div放大左边的小滑块的包围图片,所以右边大图的定位坐标是小滑块的两倍,这样才能进行映射
  134. //右侧图片跟着运动:左侧小滑块移动多少,右侧跟着移动他的2倍即可
  135. rimg.style.top = -mvtop * 2 + "px";
  136. rimg.style.left = -mvleft * 2 + "px";
  137. }
  138. // 左侧盒子鼠标移入,小滑块和右侧图片显示,衔接鼠标移动效果
  139. //onmouseenter 事件类似于 onmouseover 事件。 唯一的区别是 onmouseenter 事件不支持冒泡。
  140. //该事件通常与 onmouseleave 事件一同使用。
  141. // leftone.onmouseenter = function(e){
  142. // var e=e||window.event; //判断事件源
  143. // box.style.display = "block";
  144. // getPosition(e);
  145. // rightone.style.display = "block";
  146. // }
  147. //鼠标移动效果
  148. leftone.onmousemove = function(e) {
  149. var e = e || window.event; //判断事件源
  150. box.style.display = "block";
  151. getPosition(e);
  152. rightone.style.display = "block";
  153. };
  154. //鼠标移出效果
  155. leftone.onmouseleave = function(e) {
  156. var e = e || window.event; //判断事件源
  157. box.style.display = "none";
  158. rightone.style.display = "none";
  159. };
  160. </script>
  161. </html>

发表评论

表情:
评论列表 (有 0 条评论,355人围观)

还没有评论,来说两句吧...

相关阅读

    相关 原生js实现放大镜效果

    今天是中秋佳节,在这了我祝大家中秋快乐,心想事成,工作顺利哈! 放大镜效果在电商网站上较为常见的 一个效果,主要针对鼠标在图片选取部分放大查看。效果如图所示 ![...

    相关 js实现购物网站放大镜效果

    > 在一些主流的购物网站上,我们经常能看到一些带有放大镜效果的图片框,看似神奇,指哪哪大,其实实现的原理很简单 主要原理:实现放大镜的核心是需要有三套大小不同,形状相同的图片