• 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里,如果写在样式里面,是取不出它的值的

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

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

  • 相关阅读:
    Asp.net MVC 利用 Nopi 导出 Excel
    React 中 调用 Asp.net WebApi
    Node.js mysql 连接池使用事务自动回收连接
    __far和__near的小问题
    注册博客园了,以后在这里写写随笔。
    Electron客户端开发入门必备的知识点
    公司组织构架的三大类型
    经济学中的人性抉择(下)
    经济学中的人性抉择(上)
    模拟音乐播放器播放条样式
  • 原文地址:https://www.cnblogs.com/zxcjj/p/6603585.html
Copyright © 2020-2023  润新知