html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>放大镜</title>
  8. <style>
  9. .lit_box,.big_box{
  10. width:400px;
  11. height: 400px;
  12. position: relative;
  13. overflow: hidden;
  14. border:1px solid rgb(219, 219, 219);
  15. float: left;
  16. }
  17. .lit_box img{
  18. width: 100%;
  19. height: 100%;
  20. }
  21. .big_box {
  22. display: none;
  23. }
  24. .big_box img{
  25. width: 200%;
  26. height: 200%;
  27. position: relative;
  28. left: 0;
  29. top: 0;
  30. }
  31. .mask{
  32. width: 200px;
  33. height: 200px;
  34. background-color: rgba(230, 190, 14, 0.445);
  35. position:absolute;
  36. top: 0;
  37. left: 0;
  38. display: none;
  39. }
  40. </style>
  41. </head>
  42. <body>
  43. <!-- 原图片展示 -->
  44. <div class="lit_box">
  45. <img src="img.jpg" alt="">
  46. <!-- 蒙层 -->
  47. <div class="mask">
  48. </div>
  49. </div>
  50. <!-- 放大后的图片 -->
  51. <div class="big_box">
  52. <img src="./img1.jpg" alt="">
  53. </div>
  54. </body>
  55. </html>

JS

  // 获取所有操作的元素
    let listBox=document.querySelector('.lit_box'),
        mask=document.querySelector('.mask'),
        bigBox =document.querySelector('.big_box'),
        bigImg=bigBox.querySelector('img');
    // 鼠标移入时展示隐藏内容
    listBox.onmouseenter=function(e){
        mask.style.display='block';
        bigBox.style.display='block';
    }

    //鼠标在元素上的时候 
    listBox.onmousemove=function(e){
        let x=e.pageX-this.offsetLeft;
        let y=e.pageY-this.offsetTop;

        // 获取蒙层最大的偏移量
        let maskMax=this.offsetWidth-mask.offsetWidth;
        // 获取一下大图的偏移量
        let bigImgMax=bigImg.offsetWidth-bigBox.offsetWidth;
        // 获取蒙层的偏移量,使鼠标在蒙层的最中央
        let maskX=x-mask.offsetWidth/2;
        let maskY=y-mask.offsetHeight/2;

        // 获取大图 移动的位置
        // 大图的横坐标=蒙层的横坐标 * 大图片的最大偏移量/蒙层的最大偏移量
        let bigImgX=maskX*(bigImgMax/maskMax),
            bigImgY=maskY*(bigImgMax/maskMax);

        bigImg.style.left=-bigImgX+'px';
        bigImg.style.top=-bigImgY+'px';

        //横坐标边界
        if(maskX<=0){
            maskX=0;
        }else if(maskX>=maskMax){
            maskX=maskMax;
        }

        //纵左边边界
        if(maskY<=0){
            maskY=0;
        }else if(maskY>=maskMax){
            maskY=maskMax;
        }

        //处理蒙层移动
        mask.style.left=maskX+'px';
        mask.style.top=maskY+'px';

    }

    //鼠标移出时隐藏内容
    listBox.onmouseleave=function(e){
        mask.style.display='none';
        bigBox.style.display='none';
    }