js实现放大镜效果

作者: jia林 | 来源:发表于2017-09-13 23:19 被阅读0次

前言:在拿到一个需求之前,我们要先进行分析,再设计,最后实现代码的编写以及调试。

放大镜的原理分析

  • 鼠标在小图片上移动时,通过捕获鼠标在小图片上的位置,定位大图片的相应位置

放大镜特效设计

  • 页面元素
  • 技术点:事件捕获、定位
  • 难点:计算

代码编写,Github源码下载 [https://github.com/galyean-gong/function.git ]

<!DOCTYPE html>
<html>
<head>
   <title>放大镜特效</title>
</head>
<style type="text/css">
      * {
           margin: 0;
           padding: 0
       }

       #demo {
           display: block;
           width: 400px;
           height: 255px;
           margin: 50px;
           position: relative;
           border: 1px solid #ccc;
       }

       #small-box {
           position: relative;
           z-index: 1;
       }

       #float-box {
           display: none;
           width: 160px;
           height: 120px;
           position: absolute;
           background: #ffffcc;
           border: 1px solid #ccc;
           filter: alpha(opacity=50);
           opacity: 0.5;
       }

       #mark {
           position: absolute;
           display: block;
           width: 400px;
           height: 255px;
           background-color: #fff;
           filter: alpha(opacity=0);
           opacity: 0;
           z-index: 10;
       }

       #big-box {
           display: none;
           position: absolute;
           top: 0;
           left: 460px;
           width: 400px;
           height: 300px;
           overflow: hidden;
           border: 1px solid #ccc;
           z-index: 1;;
       }

       #big-box img {
           position: absolute;
           z-index: 5
       }
</style>
<body>
<div id="demo">
   <div id="small-box">
       <div id="mark"></div>
       <div id="float-box"></div>
       ![](image/saml.jpg)
   </div>
   <div id="big-box">
       ![](image/big.jpg)
   </div>
</div>
<!-- offsetLeft 子元素想当父元素的左位移 
offsetTop 子元素想当父元素的上位移
offsetWidth 盒子本身的宽高 不包括滚动条
event.clientX 鼠标的X,Y轴相对与整个页面,而非子元素
-->
<script type="text/javascript">

    //页面加载完毕后执行
       window.onload = function () {

           var objDemo = document.getElementById("demo");
           var objSmallBox = document.getElementById("small-box");
           var objMark = document.getElementById("mark");
           var objFloatBox = document.getElementById("float-box");
           var objBigBox = document.getElementById("big-box");
           var objBigBoxImage = objBigBox.getElementsByTagName("img")[0];

           objMark.onmouseover = function () {
               objFloatBox.style.display = "block"
               objBigBox.style.display = "block"
           }

           objMark.onmouseout = function () {
               objFloatBox.style.display = "none"
               objBigBox.style.display = "none"
           }

           objMark.onmousemove = function (ev) {

               var _event = ev || window.event;  //兼容多个浏览器的event参数模式

               var left = _event.clientX - objDemo.offsetLeft - objSmallBox.offsetLeft - objFloatBox.offsetWidth / 2;
               var top = _event.clientY - objDemo.offsetTop - objSmallBox.offsetTop - objFloatBox.offsetHeight / 2;

               if (left < 0) {
                   left = 0;
               } else if (left > (objMark.offsetWidth - objFloatBox.offsetWidth)) {
                   left = objMark.offsetWidth - objFloatBox.offsetWidth;
               }

               if (top < 0) {
                   top = 0;
               } else if (top > (objMark.offsetHeight - objFloatBox.offsetHeight)) {
                   top = objMark.offsetHeight - objFloatBox.offsetHeight;

               }

               objFloatBox.style.left = left + "px";   //oSmall.offsetLeft的值是相对什么而言
               objFloatBox.style.top = top + "px";

               var percentX = left / (objMark.offsetWidth - objFloatBox.offsetWidth);
               var percentY = top / (objMark.offsetHeight - objFloatBox.offsetHeight);

               objBigBoxImage.style.left = -percentX * (objBigBoxImage.offsetWidth - objBigBox.offsetWidth) + "px";
               objBigBoxImage.style.top = -percentY * (objBigBoxImage.offsetHeight - objBigBox.offsetHeight) + "px";
           }
       }
</script>


</body>
</html>

相关文章

网友评论

    本文标题:js实现放大镜效果

    本文链接:https://www.haomeiwen.com/subject/ztalsxtx.html