JS放大镜

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        *{
            margin:0;
            padding:0;
        }
        #box{
            width: 350px;
            height: 350px;
            border:1px solid #ccc;
            position: relative;
            margin:100px;
        }
        #small{
            position: relative;
        }
        #mask{
            width: 100px;
            height: 100px;
            position: absolute;
            top:0;
            left:0;
            background: rgba(255,255,0,.4);
            cursor: move;
            display: none;
        }
        #big{
            width: 450px;
            height: 450px;
            position: absolute;
            top:0;
            left: 360px;
            overflow: hidden;
            display: none;
        }
        #big img{
            position: absolute;
            top:0;
            left:0;
        }
    </style>
</head>
<body>
<div id="box">
    <div id="small">
        ![](images/001.jpg)
        <div id="mask"></div>
    </div>
    <div id="big">
        ![](images/0001.jpg)
    </div>
</div>
<script>
    // 获取元素
    var box = document.getElementById("box");
    var small = document.getElementById("small");
    var mask = document.getElementById("mask");
    var big = document.getElementById("big");
    var bigImg = big.querySelector("img");

    small.onmouseover = function () {
        mask.style.display  = "block";
        big.style.display = "block";
    };
    small.onmouseout = function () {
        mask.style.display  = "none";
        big.style.display = "none";
    };

    small.onmousemove = function (event) {
       var e = event ||window.event;
       // 获取鼠标位置(可视区域)
       var mX = e.clientX;
       var mY = e.clientY;
       // 计算放大镜的移动范围
        var maxLeft = box.offsetWidth - mask.offsetWidth;
        var maxTop = box.offsetHeight - mask.offsetHeight;
        // 设置临时位置
        var tempLeft = mX - box.offsetLeft - mask.offsetWidth / 2;
        var tempTop = mY - box.offsetTop - mask.offsetHeight / 2;
       //  设置最终位置
        var nowLeft = 0;
        var nowTop = 0;
        if(tempLeft >= maxLeft){
            nowLeft = maxLeft;
        }else if(tempLeft>0 && tempLeft < maxLeft){
            nowLeft = tempLeft;
        }
        if(tempTop >= maxTop){
            nowTop = maxTop;
        }else if(tempTop > 0 && tempTop < maxTop){
            nowTop = tempTop;
        }

        // 遮罩跟随鼠标
        mask.style.left = nowLeft + "px";
        mask.style.top = nowTop + "px";

        // 计算移动比例
        var ratioX = box.offsetWidth / bigImg.offsetWidth;
        var ratioY = box.offsetHeight / bigImg.offsetHeight;
        // 大图位置
        bigImg.style.left = - nowLeft / ratioX + "px";
        bigImg.style.top = - nowTop / ratioY + "px";

    }

</script>
</body>
</html>

这种布局方式相对来说更好操作,小图和大图在同一个盒子里;
难点在于获取鼠标在盒子中的位置,不明白的朋友可以自己画图,可以更直观的理解。
再一点就是遮罩移动,大图移动,强调下,移动的不是大图的父级盒子,而是图片本身,根据图片比例移动,比如,遮罩在小图上移动1px,那么在大盒子上移动的就是 1 / 小图 / 大图 。代码中有所体现,如有哪里不清楚,请在下方留言,我会第一时间回复!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • <!doctype html> *{ margin:0; padding:0;} box{ pos...
    教我情何以堪阅读 2,405评论 0 0
  • [目录] 【简单的实现放大镜动能】 成果图 放大镜的原理 网页结构 实现步骤第一步 获取元素第二步 注册鼠标进...
    顽皮的雪狐七七阅读 8,531评论 6 14
  • 前言 随手打开一个电商网站(如淘宝),查看商品的时候, 把鼠标放到图片上都可以看到图片的更多细节,像把图片局部放大...
    jazenye阅读 5,433评论 0 10
  • 经常逛某宝可以发现,查看商品时都有如下的放大功能,鼠标放到图片上可以看到图片的细节,那么它是如何实现的呢?是真的将...
    丶chlorine阅读 4,446评论 1 3
  • 终于拔掉了最后一颗智齿。从20岁开始,断断续续地长了十几年,我终于长齐了4颗智齿。虽然智慧没见的增长,但是牙齿确实...
    游泳的鱼_cc71阅读 4,576评论 0 3

友情链接更多精彩内容