js代码实现放大镜效果

每当打开淘宝,天猫等pc端时,看到心仪的物品时,点击图片时,便呈现出放大的效果。在没有去理解分析它的原理时,感觉非常的神奇,当真正地去接触,也是非常好理解。如下图展示所见:

很是常见,在此记载一下,毕竟好记性不如烂笔头。

主要事件:

  • onmouseout
  • onmouseover
  • onmousemove

这种实现也是比较简单的,代码如下所示:

  1 <!doctype html>
  2 <html>
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>放大镜</title>
  6     <style>
  7         * {
  8             margin: 0;
  9             padding: 0
 10         }
 11
 12         #demo {
 13             display: block;
 14             width: 400px;
 15             height: 255px;
 16             margin: 50px;
 17             position: relative;
 18             border: 1px solid #ccc;
 19         }
 20
 21         #small-box {
 22             position: relative;
 23             z-index: 1;
 24         }
 25
 26         #float-box {
 27             display: none;
 28             width: 160px;
 29             height: 120px;
 30             position: absolute;
 31             background: #ffffcc;
 32             border: 1px solid #ccc;
 33             filter: alpha(opacity=50);
 34             opacity: 0.5;
 35         }
 36
 37         #mark {
 38             position: absolute;
 39             display: block;
 40             width: 400px;
 41             height: 255px;
 42             background-color: #fff;
 43             filter: alpha(opacity=0);
 44             opacity: 0;
 45             z-index: 10;
 46         }
 47
 48         #big-box {
 49             display: none;
 50             position: absolute;
 51             top: 0;
 52             left: 460px;
 53             width: 400px;
 54             height: 300px;
 55             overflow: hidden;
 56             border: 1px solid #ccc;
 57             z-index: 1;;
 58         }
 59
 60         #big-box img {
 61             position: absolute;
 62             z-index: 5
 63         }
 64     </style>
 65     <script>
 66
 67         //页面加载完毕后执行
 68         window.onload = function () {
 69
 70             var objDemo = document.getElementById("demo");
 71             var objSmallBox = document.getElementById("small-box");
 72             var objMark = document.getElementById("mark");
 73             var objFloatBox = document.getElementById("float-box");
 74             var objBigBox = document.getElementById("big-box");
 75             var objBigBoxImage = objBigBox.getElementsByTagName("img")[0];
 76
 77             objMark.onmouseover = function () {
 78                 objFloatBox.style.display = "block"
 79                 objBigBox.style.display = "block"
 80             }
 81
 82             objMark.onmouseout = function () {
 83                 objFloatBox.style.display = "none"
 84                 objBigBox.style.display = "none"
 85             }
 86
 87             objMark.onmousemove = function (ev) {
 88
 89                 var _event = ev || window.event;  //兼容多个浏览器的event参数模式
 90
 91                 var left = _event.clientX - objDemo.offsetLeft - objSmallBox.offsetLeft - objFloatBox.offsetWidth / 2;
 92                 var top = _event.clientY - objDemo.offsetTop - objSmallBox.offsetTop - objFloatBox.offsetHeight / 2;
 93
 94                 //设置边界处理,防止移出小图片
 95                 if (left < 0) {
 96                     left = 0;
 97                 } else if (left > (objMark.offsetWidth - objFloatBox.offsetWidth)) {
 98                     left = objMark.offsetWidth - objFloatBox.offsetWidth;
 99                 }
100
101                 if (top < 0) {
102                     top = 0;
103                 } else if (top > (objMark.offsetHeight - objFloatBox.offsetHeight)) {
104                     top = objMark.offsetHeight - objFloatBox.offsetHeight;
105
106                 }
107
108                 objFloatBox.style.left = left + "px";   //oSmall.offsetLeft的值是相对什么而言
109                 objFloatBox.style.top = top + "px";
110
111                 //求其比值
112                 var percentX = left / (objMark.offsetWidth - objFloatBox.offsetWidth);
113                 var percentY = top / (objMark.offsetHeight - objFloatBox.offsetHeight);
114
115                 //方向相反,小图片鼠标移动方向与大图片相反,故而是负值
116                 objBigBoxImage.style.left = -percentX * (objBigBoxImage.offsetWidth - objBigBox.offsetWidth) + "px";
117                 objBigBoxImage.style.top = -percentY * (objBigBoxImage.offsetHeight - objBigBox.offsetHeight) + "px";
118             }
119         }
120     </script>
121 </head>
122 <body>
123     <div id="demo">
124         <div id="small-box">
125             <div id="mark"></div>
126             <div id="float-box"></div>
127             <img src="img/macbook-small.jpg"/>
128         </div>
129         <div id="big-box">
130             <img src="img/macbook-big.jpg"/>
131         </div>
132     </div>
133 </body>
134 </html>

这里面需要区别的是offsetLeft和style.left:

offsetLeft 获取的是相对于父对象的左边距;left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距;

  • offsetLeft返回的数值,而style.left则返回的是字符串;
  • offsetLeft是只读的,style.left可读写的;
  • style.left的值需要事先定义,否则取到的值为空,而且必须要定义在html里,如果写在样式里面,是取不出它的值的;

这是这个代码的要点之一,另外一个就是去要计算其比例。根据对应比例,进行代码的显示。

另外,小图片和大图片的显示,移动方向是相反的,所以比例前面会乘以一个负号。这个需要注意。

时间: 2024-10-08 10:28:02

js代码实现放大镜效果的相关文章

如何撤销浏览器注入JS代码的执行效果?

如何撤销浏览器注入JS代码的执行效果? 可用的方法: 放弃所有本地修改,整体重新reload当前的URL(这相当于大粒度的savepoint/snapshot,应确保用户数据/视图状态能够按期望恢复) 内核实现immutable的DOM树,对DOM树的每个修改均产生一个新的版本快照,修改可以直接回退,比如提供一个document.revertTo方法 immutable数据结构上实现MVCC事务,事务本身的执行是原子的,但是并没有考虑用户如何手工反转事务 实现细粒度的对应每个业务逻辑层次写操作的

前端JS电商放大镜效果

前端JS电商放大镜效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>26-电商放大镜</title> <style type="text/css"> *{ padding: 0; margin: 0; } #left{ padding: 0; margin: 0; w

原生js实现的放大镜效果

这是我用原生js写的放大镜效果,与各种各样的框架技术相比,我喜欢使用原生的js,在这里,想和大家一起谈谈原生和框架技术的理解与个人喜好. <!DOCTYPE HTML><html> <head> <title>js放大镜效果</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <style&

原生js淘宝放大镜效果(第二版)

随便写写 <!DOCTYPE html> <html> <head> <title>放大镜</title> <meta charset="utf-8" /> <style type="text/css"> *{ margin: 0; padding: 0; } body{ height: 2000px; } #wrapleft{ width: 300px; height: 400px

js代码实现购物车效果

页面分上下两部分,上部分是所有的数据,下部分是购物车.通过在上面选择需要处理的数据添加进到购物车,实现对购物车数据的统一处理. 需要注意的有两点:①购物车数据可删除,且不能重复添加 ②响应时间考虑,购物车单次处理数据最多限制为200条 代码如下: /** *添加进购物车方法 */ function addToDownGrid(){ var selRows = $("#basicInfoList").datagrid("getChecked");//选择的用户面积 i

js京东图片放大镜效果。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>放大镜</title> <style> *{ margin: 0; padding: 0; } /* 去除图片的3px */ img { vertical-align: top; } /* 容器样式 */ .container { width:

原生js实现放大镜效果

放大镜效果主要涉及3个鼠标事件: 1.onmouseover,鼠标移入浮动小方块和显示放大的区域显示: 2.onmousemove,鼠标移动,小方块和放大区域一起移动: 3.onmouseout,鼠标移除小方块和放大区域消失. 其实放大镜效果最主要的是小方块与放大区域的比例及位置: <div id="small_box"> <div class="small_Pic"> <div id="float_box">

.Net中使用response.write(&#39;js代码&#39;)后css失去效果,解决办法。

net中使用response.write输出js会将js放在源代码的最前面,这样就可能出现破坏网页css的效果,让css失去效果 .net中使用Page.ClientScript.RegisterStartupScript(this.GetType(), "", " <script lanuage=javascript>if(confirm('确定要交卷吗?')==false){history.back()}; </script>"); 可以

[JQuery]用InsertAfter实现图片走马灯展示效果2——js代码重构

写在前面 前面写过一篇文章<[JQuery]用InsertAfter实现图片走马灯展示效果>,自从写过那样的也算是使用面向对象的写法吧,代码实在丑陋,自从写过那样的代码,就是自己的一块心病,总感觉不完美,心里一直惦记着那件事,也是在我写过那篇文章之后,没多久,在博客园首页看到了一篇文章较复杂js的书写格式,这里的代码看着比较简介,就想着抽时间将之前的那段js代码进行重构.说做就做,不想一想起之前写过那样的代码,心里就有疙瘩.所以也就有了这篇文章. $.extend 在开始重构之前,需要先学习一