图片放大镜效果

实现效果如下图所示

图片放大镜效果

以下为HTML代码

<div id="img1">
    <img src="img/b7003af33a87e95053e42ae21c385343faf2b449.jpg">
    <span></span>
</div>
<div id="img2">
    <img src="img/b7003af33a87e95053e42ae21c385343faf2b449.jpg">
</div>

以下为CSS代码

*{
    margin: 0;
    padding: 0;
}
#img1{
    position: relative;
    width: 450px;
    height: 300px;
}
#img1 img:nth-of-type(1){
}
#img2{
    position: relative;
    top: -300px;
    left: 450px;
    display: none;
    width: 430px;
    height: 430px;
    border: 1px solid aqua;
    overflow: hidden;
}
#img2 img{
    position: absolute;
    top:0;
    left: 0;
}
#img1 span{
    position: absolute;
    top: 0;
    left: 0;
    width: 120px;
    height: 120px;
    background-color: rgba(0,0,0,0.1);
}

以下为JS代码

window.onload=function () {
    //先获取页面元素
    var divOne=document.getElementById("img1");
    var divOneImg=divOne.getElementsByTagName("img")[0];
    var divTwo=document.getElementById("img2");
    var divTwoImg=divTwo.getElementsByTagName("img")[0];
    var omouse=document.getElementById("img1").getElementsByTagName("span")[0];
    //显示遮罩层和放大图片框
    divOne.addEventListener("mouseover",function () {
        omouse.style.display='block';
        divTwo.style.display="block";
    });
    //隐藏遮罩层和放大图片框
    divOne.addEventListener("mouseout",function () {
        omouse.style.display='none';
        divTwo.style.display="none";
    });
    divOne.addEventListener("mousemove",function (ev) {
        ev=ev||window.event;
        //获取鼠标的位置
        let currentMouseX=ev.pageX;
        let currentMouseY=ev.pageY;
        //获取被放大图片框距离左侧和顶部的值
        let offsetLeft=divOneImg.offsetLeft;
        let offestTop=divOneImg.offsetTop;
        //获取遮罩层的大小
        let omouseWidth=omouse.offsetWidth;
        let omouseHeight=omouse.offsetHeight;
        //计算鼠标移动后遮罩层的位置
        let zoomMouseX=currentMouseX-offsetLeft-omouseWidth/2;
        let zoomMouseY=currentMouseY-offestTop-omouseHeight/2;
        //限制鼠标上和左侧的范围
        if (zoomMouseX<=0){
            zoomMouseX=0;
        }
        if (zoomMouseY<=0){
            zoomMouseY=0;
        }
        //限制鼠标下和右侧的范围
        let maxX=divOneImg.offsetWidth-omouseWidth;
        if (zoomMouseX>=maxX){
            zoomMouseX=maxX;
        }
        let maxY=divOneImg.offsetHeight-omouseHeight;
        if (zoomMouseY>=maxY){
            zoomMouseY=maxY;
        }
        //赋给鼠标计算后的移动值
        omouse.style.left=zoomMouseX+'px';
        omouse.style.top=zoomMouseY+"px";
        divTwoImg.style.width="300%";
        divTwoImg.style.height="300%";
        //计算图片放大的后的比例和位置
        let zommDiv = (divTwoImg.offsetWidth - divTwo.offsetWidth) / (divOne.offsetWidth - omouseWidth);
        divTwoImg.style.left = -zommDiv * zoomMouseX + 'px';
        divTwoImg.style.top = -zommDiv * zoomMouseY + 'px';



    })
}