JS原生放大镜

利用原生JS写一个放大镜

本文用于记录在学习写一个放大镜


放大镜的关键原理
鼠标在小图片上移动时,通过捕抓鼠标在小图片上的位置定位大图片的相应位置

做放大镜特效需要的元素
1.小图片
2.大图片
3.存放小图片和大图片的容器
4.一个放大镜

涉及的技术点

鼠标的移入移出鼠标移动3个事件

onmouseover
onmouseout
onmousemove

这里写图片描述

重点
1.如何让小图片的图片和大图片同时移动。坐标的计算。

这里写图片描述

主要计算的是一个比例

右边的放大部分相对于左边的放大镜来说,是一个固定的位置

图片中的ABCD都是按照相同的比例来放大的

左边放大镜的offsetleft为X,小盒子的offsetwidth为B

右边显示的部分额offsetwidth为C,整一个大盒子的offsetWidth为D

我们需要计算的就是大盒子中的图片的left值。

因为大盒子是小盒子的等比例放大

X/B-A=?/D-C

图片中的ABCD都是可以求到的

通过X/B-A求到left的系数

        var parX  = left/(smallbox.offsetWidth-fdj.offsetWidth);

同理得到top的

     var parY = top/(smallbox.offsetHeight-fdj.offsetHeight);

然后

 oimg.style.left=-parX*(oimg.offsetWidth-bigbox.offsetWidth)+'px';
 oimg.style.top=-parY*(oimg.offsetHeight-bigbox.offsetHeight)+'px';

注意这里的parx和Y是负数,因为要反方向的移动

整体代码


页面部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="box">
        <div id="box1">
            <div id="float-box"></div>
            <img src="./macbook-small.jpg" alt="">
        </div>
        <div id="box2">
            <img src="./macbook-big.jpg" alt="">
        </div>
    </div>
</body>

</html>

css样式部分

    <style>
      *{padding: 0;margin: 0}
        #box{
            display: block;
            width: 400px;
            height: 255px;
            margin: 50px;
            position: relative;
            border: 1px solid #ccc;
        }
        #box1{position: relative;z-index: 1}
        #float-box{display: none;width: 160px;height: 120px;position: absolute;background: #ffffcc;border: 1px solid #ccc;opacity: 0.5;cursor: move}
        #box2{display: none;position: absolute;top: 0;left: 460px;width: 400px;height: 300px;overflow: hidden;border: 1px solid #ccc;z-index: 1}
        #box2 img{position: absolute;z-index: 5}
    </style>

JS实现部分

<script>
window.onload=function () {
    var oBox = document.getElementById('box');  //获取整体盒子
    var smallbox=document.getElementById('box1'); //获取左边小盒子
    var fdj = document.getElementById('float-box'); //左边的放大镜
    var bigbox = document.getElementById('box2');  //右边的盒子
    var oimg = bigbox.getElementsByTagName('img')[0]; //右边盒子中的图片

    smallbox.onmouseover=function () {  //鼠标移入事件
        fdj.style.display='block';
        bigbox.style.display='block';
    }
    smallbox.onmouseout=function () {  //鼠标移出事件
        fdj.style.display='none';
        bigbox.style.display='none';
    }
    smallbox.onmousemove=function (ev) {  //鼠标移动事件
        var ev = ev||event;  //兼容
        var left=ev.clientX-oBox.offsetLeft-smallbox.offsetLeft-fdj.offsetWidth/2;  //放大镜的left,/2是为了鼠标在放大镜的中间,美观
        var top=ev.clientY-oBox.offsetTop-smallbox.offsetTop-fdj.offsetHeight/2; //放大镜的top,/2是为了鼠标在放大镜的中间,美观
        if(left<0){ //判断left的值,不让放大镜超出小盒子
            left=0;
        }else if(left>(smallbox.offsetWidth-fdj.offsetWidth)){
            left=smallbox.offsetWidth-fdj.offsetWidth;
        }
        if(top<0){ //判断top的值,不让放大镜超出小盒子
            top=0;
        }else if(top>(smallbox.offsetHeight-fdj.offsetHeight)){
            top=smallbox.offsetHeight-fdj.offsetHeight;
        }
        var parX  = left/(smallbox.offsetWidth-fdj.offsetWidth);
        var parY = top/(smallbox.offsetHeight-fdj.offsetHeight);

        //改变放大镜和右边图片的left和top
        fdj.style.left=left+'px';
        fdj.style.top=top+'px';
        oimg.style.left=-parX*(oimg.offsetWidth-bigbox.offsetWidth)+'px';
        oimg.style.top=-parY*(oimg.offsetHeight-bigbox.offsetHeight)+'px';


    }

}

</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值