本文详细解析如何使用JavaScript实现类似淘宝主图的放大镜效果。通过监听鼠标移动事件,计算鼠标在小图中的相对位置,并结合大小图尺寸比例换算出大图需显示的区域。文章涵盖HTML/CSS基础布局、核心JS逻辑、大图定位算法以及鼠标移出边缘时的边界限制处理,帮助开发者掌握前端交互开发的实用技巧。
放大镜效果原理概述
欲达成特定效果,需先明晰其底层逻辑。 放大镜机制的核心在于:捕捉鼠标在小图区域内的坐标,依据大小图的尺寸比例,推算出大图应展示的对应区域,并通过定位技术将该区域映射至右侧显示框内。 结合代码进行解析,有助于更直观地理解实现过程。
HTML与CSS基础布局
HTML结构部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>放大镜效果</title>
<link rel="stylesheet" href="magnifier.css">
</head>
<body>
<div id="wrapper">
<!--小图-->
<div id="img_min">
<!--图片-->
<img src="test.jpg" alt="min">
<!--跟随鼠标的白块-->
<p id="mousebg"></p>
</div>
<!--大图-->
<div id="img_max"><img id="img2_img" src="test.jpg" alt="max"></div>
</div>
<script type="text/javascript" src="magnifier.js"></script>
</body>
</html>
CSS样式部分
*{
margin: 0;
padding: 0;
}
div{
position: relative;
}
div>div{
width: 300px;
height: 300px;
float: left;
margin: 100px;
overflow: hidden;
}
#img_min>img{
/*display: block;*/
width: 300px;
}
#img_max{
display: none;
}
#img_max>img{
position: absolute;
top: 0;
left: 0;
display: block;
width: 1500px;
}
#mousebg{
display: none;
position: absolute;
width: 60px;
height: 60px;
background-color: rgba(255,255,255,.7);
top: 0;
left: 0;
}
JavaScript核心逻辑实现
核心JavaScript逻辑部分
window.onload = function () {
var img1 = document.getElementById('img_min');//小图盒子
var img2 = document.getElementById('img_max');//大图盒子
var img2_img = document.getElementById('img2_img');//大图图片
var wrap = document.getElementById('wrapper');
var mousebg = document.getElementById('mousebg');//鼠标白块
var mul = 5;
//当某一个模块dispaly:none的时候不能使用offsetWidth获取它的宽高
img1.onmouseover = function () {
//鼠标进入
img2.style.display = 'block';
mousebg.style.display = 'block';
}
img1.onmouseout = function () {
//鼠标离开
img2.style.display = 'none';
mousebg.style.display = 'none';
}
img1.onmousemove = function (event) {
var _event = event||window.event;//兼容性处理
var mouseX = _event.clientX - wrap.offsetLeft - img1.offsetLeft;
//计算鼠标相对与小图的位置
var mouseY = _event.clientY - wrap.offsetTop - img1.offsetTop;
//特殊情况处理,分别靠近四条边的时候
if(mouseX<mousebg.offsetWidth/2){
mouseX = mousebg.offsetWidth/2;
}
if(mouseX>img1.offsetWidth-mousebg.offsetWidth/2){
mouseX = img1.offsetWidth-mousebg.offsetWidth/2;
}
if(mouseY<mousebg.offsetHeight/2){
mouseY = mousebg.offsetHeight/2;
}
if(mouseY>img1.offsetHeight-mousebg.offsetHeight/2){
mouseY = img1.offsetHeight-mousebg.offsetHeight/2;
}
//计算大图的显示范围
img2_img.style.left = -mul*mouseX+img2.offsetWidth/2+"px";
img2_img.style.top = -mul*mouseY+img2.offsetHeight/2+"px";
//使鼠标在白块的中间
mousebg.style.left = mouseX-mousebg.offsetWidth/2+"px";
mousebg.style.top = mouseY-mousebg.offsetHeight/2+"px";
}
}
若阅读代码及注释后已完全掌握,不妨借用李云龙的话评价:“哎呀,你小子tnd还真是个天才”。此时,快速浏览后续解析即可。
鼠标位置获取与大图定位解析
详细解析部分:
HTML与CSS部分仅涉及基础布局,此处略过。JS代码逻辑相对简洁,重点解析鼠标移动事件处理逻辑。 首先,通过图示阐明获取鼠标相对于小图位置的计算原理:

经代码运算,所得数值即为鼠标相对于img1左上角的坐标值。 掌握此步后,任务已推进过半。 接下来,暂略特殊边界处理,直接进行右侧图片定位的核心计算。 涉及offsetWidth、offsetHeight、style.width、style.height属性。其中,style.width/height与offsetWidth/offsetHeight的取值范围一致,其他差异将在另文详述。此处通过图示对比各属性(图片来源网络,侵删):

代码逻辑详解如下:
右侧大图框内的图片通过style.left确定其在框内的位置。添加负号是因为鼠标移动方向与图片移动方向相反;mul为根据大图与小图尺寸计算的比例系数。-mul*mouseX计算出图片在大图框中的相对偏移量。由于鼠标初始位于大图框左上角,需加上img2.offsetWidth/2以实现图片居中显示。纵坐标同理处理。
//计算大图的显示范围
img2_img.style.left = -mul*mouseX+img2.offsetWidth/2+"px";
img2_img.style.top = -mul*mouseY+img2.offsetHeight/2+"px";
鼠标移动边界限制处理
接下来处理边界特殊情况。当鼠标移至边缘时,白色跟随块可能超出图片范围。为此,需将鼠标活动范围限制在距离图片边框上下左右各二分之一白块长/宽的区域内。因鼠标位于白色透明块中心,故限制鼠标坐标即可实现。
//特殊情况处理,分别靠近四条边的时候
if(mouseX<mousebg.offsetWidth/2){
mouseX = mousebg.offsetWidth/2;
}
if(mouseX>img1.offsetWidth-mousebg.offsetWidth/2){
mouseX = img1.offsetWidth-mousebg.offsetWidth/2;
}
if(mouseY<mousebg.offsetHeight/2){
mouseY = mousebg.offsetHeight/2;
}
if(mouseY>img1.offsetHeight-mousebg.offsetHeight/2){
mouseY = img1.offsetHeight-mousebg.offsetHeight/2;
}
当鼠标距左侧距离小于二分之一白块宽度时,强制将mouseX设为二分之一宽度,阻止白块继续左移。其他三个方向的处理逻辑相同。 完成此步骤,功能即告完成。 ps:抽象概念可通过绘图辅助理解。
本文内容至此结束,希望能为您的学习提供参考,欢迎继续支持本站。