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';
}