图片放大镜功能可以让用户将鼠标悬停在图片上时,看到对应区域的放大效果,核心是通过HTML构建基础展示结构,结合JavaScript的鼠标事件处理函数实现坐标跟踪和放大区域更新。

一、基础HTML结构搭建
首先需要搭建原图展示区、放大镜遮罩层和放大结果展示区的结构,所有元素通过CSS定位实现布局关联。
<div class="magnifier-container">
<!-- 原图区域 -->
<div class="origin-box" id="originBox">
<img src="test.jpg" alt="原图" class="origin-img" id="originImg" />
<!-- 放大镜遮罩层 -->
>div class="magnifier-glass" id="magnifierGlass"></div>
</div>
<!-- 放大结果展示区 -->
<div class="result-box" id="resultBox"></div>
</div>二、CSS样式设置
通过CSS设置各元素的尺寸、定位和初始显示状态,确保布局符合放大镜的交互逻辑。
.magnifier-container {
display: flex;
gap: 20px;
margin: 50px;
}
.origin-box {
position: relative;
width: 400px;
height: 300px;
cursor: crosshair;
}
.origin-img {
width: 100%;
height: 100%;
object-fit: cover;
}
.magnifier-glass {
position: absolute;
width: 100px;
height: 100px;
background: rgba(255, 255, 255, 0.5);
border: 2px solid #ccc;
display: none;
pointer-events: none;
}
.result-box {
width: 400px;
height: 300px;
border: 1px solid #ccc;
background-repeat: no-repeat;
display: none;
}三、JavaScript鼠标事件处理函数实现
核心逻辑通过绑定鼠标事件到原图容器,编写对应的处理函数实现坐标跟踪和放大效果更新。
1. 获取DOM元素并定义基础变量
// 获取DOM元素
const originBox = document.getElementById('originBox');
const originImg = document.getElementById('originImg');
const magnifierGlass = document.getElementById('magnifierGlass');
const resultBox = document.getElementById('resultBox');
// 定义基础参数
const glassWidth = 100; // 放大镜宽度
const glassHeight = 100; // 放大镜高度
const resultWidth = 400; // 放大区宽度
const resultHeight = 300; // 放大区高度2. 鼠标进入事件处理函数
当鼠标进入原图区域时,显示放大镜遮罩和放大结果区,同时设置放大结果区的背景图。
// 鼠标进入处理函数
function handleMouseEnter() {
magnifierGlass.style.display = 'block';
resultBox.style.display = 'block';
// 设置放大结果区的背景图为原图
resultBox.style.backgroundImage = `url(${originImg.src})`;
// 计算放大比例:放大区尺寸 / 放大镜尺寸
const scaleX = resultWidth / glassWidth;
const scaleY = resultHeight / glassHeight;
resultBox.style.backgroundSize = `${originImg.offsetWidth * scaleX}px ${originImg.offsetHeight * scaleY}px`;
}
originBox.addEventListener('mouseenter', handleMouseEnter);3. 鼠标移动事件处理函数(坐标跟踪核心)
该处理函数通过获取鼠标相对于原图容器的坐标,计算放大镜的位置和放大结果区的背景偏移,实现坐标同步跟踪。
// 鼠标移动处理函数
function handleMouseMove(e) {
// 获取原图容器相对于视口的位置
const boxRect = originBox.getBoundingClientRect();
// 计算鼠标相对于原图容器的坐标(clientX是鼠标相对于视口的X坐标,减去容器左边界得到相对坐标)
let x = e.clientX - boxRect.left;
let y = e.clientY - boxRect.top;
// 限制放大镜位置,避免超出原图边界
x = Math.max(glassWidth / 2, Math.min(x, originBox.offsetWidth - glassWidth / 2));
y = Math.max(glassHeight / 2, Math.min(y, originBox.offsetHeight - glassHeight / 2));
// 设置放大镜的位置,让鼠标处于放大镜中心
magnifierGlass.style.left = `${x - glassWidth / 2}px`;
magnifierGlass.style.top = `${y - glassHeight / 2}px`;
// 计算放大结果区的背景偏移,和放大镜位置对应
const bgX = -(x - glassWidth / 2) * (resultWidth / glassWidth);
const bgY = -(y - glassHeight / 2) * (resultHeight / glassHeight);
resultBox.style.backgroundPosition = `${bgX}px ${bgY}px`;
}
originBox.addEventListener('mousemove', handleMouseMove);4. 鼠标离开事件处理函数
鼠标离开原图区域时,隐藏放大镜和放大结果区,重置相关状态。
// 鼠标离开处理函数
function handleMouseLeave() {
magnifierGlass.style.display = 'none';
resultBox.style.display = 'none';
}
originBox.addEventListener('mouseleave', handleMouseLeave);四、核心坐标计算逻辑说明
整个功能的坐标跟踪核心是getBoundingClientRect()方法和鼠标事件对象的clientX、clientY属性配合:
getBoundingClientRect()返回元素相对于视口的位置信息,包含left、top等属性,用于计算鼠标相对于元素的偏移量。clientX和clientY是鼠标触发事件时相对于浏览器视口左上角的坐标,减去元素的左、上边界值,就得到鼠标相对于该元素的坐标。- 放大比例的计算保证放大镜覆盖的原图区域,刚好完整显示在放大结果区中,实现1:1的对应放大效果。
五、注意事项
- 如果原图尺寸和容器尺寸不一致,需要额外计算图片的实际渲染尺寸,避免坐标偏差。
- 放大镜的宽高和放大结果区的宽高比例需要匹配,否则会出现放大区域显示错位的问题。
- 使用
pointer-events: none设置放大镜遮罩层,避免遮罩层触发鼠标事件,导致坐标计算异常。
htmlJavaScriptmouse_eventimage_magnifier修改时间:2026-06-04 17:49:36