html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>放大镜</title> <style> .lit_box,.big_box{ width:400px; height: 400px; position: relative; overflow: hidden; border:1px solid rgb(219, 219, 219); float: left; } .lit_box img{ width: 100%; height: 100%; } .big_box { display: none; } .big_box img{ width: 200%; height: 200%; position: relative; left: 0; top: 0; } .mask{ width: 200px; height: 200px; background-color: rgba(230, 190, 14, 0.445); position:absolute; top: 0; left: 0; display: none; } </style></head><body> <!-- 原图片展示 --> <div class="lit_box"> <img src="img.jpg" alt=""> <!-- 蒙层 --> <div class="mask"> </div> </div> <!-- 放大后的图片 --> <div class="big_box"> <img src="./img1.jpg" alt=""> </div></body></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';
}