JavaScript实现商品放大镜效果:原理与代码详解
本文详细解析了基于JavaScript的商品放大镜效果实现原理。通过HTML构建结构、CSS控制样式与比例、JS处理鼠标交互与图片切换,实现了小图、正常图与放大图的联动。文章提供了完整的代码示例,重点讲解了遮盖层与放大层的比例计算及定位逻辑,帮助开发者掌握这一常见电商交互功能。
JS商品放大镜效果实现教程:HTML/CSS/JS完整代码与原理
本文分享了使用JavaScript实现电商网站商品放大镜效果的具体代码,供读者参考学习。
放大镜效果核心原理分析
首先阐述其核心原理,以天猫某商品页面的放大镜功能为例进行说明。

所谓的放大镜效果,本质上是一种视觉欺骗。观察发现,下方展示的小图序列、中间的遮盖层图片以及上方的放大层图片,内容完全一致,仅分辨率存在差异。因此,实现该效果需要准备多组分辨率不同但内容相同的图片资源。

具体而言,小图中包含文件名带有“small”标识的低分辨率图片;遮盖层对应正常分辨率的图片;放大层则对应文件名带有“big”标识的高分辨率图片。配合适当的位移计算与显示逻辑,即可呈现出放大镜效果。下文将通过代码具体演示实现过程。
HTML结构与CSS样式构建
首先构建HTML基本结构。
<div id="box">
<div class="show">
<img src="./images/1.jpg" alt="#">
<div class="drag"></div>
</div>
<div class="magnify"></div>
<ul>
<li class="active"><img src="./images/1.small.jpg" alt="#"></li>
<li><img src="./images/2.small.jpg" alt="#"></li>
</ul>
</div>
<script type="text/javascript" src="./javascript/mgfyGlass.js"></script>
<script>
const oBox = document.querySelector('#box');
const imgArr = [
{small: '1.small.jpg', normal: '1.jpg', big: '1.big.jpg'},
{small: '2.small.jpg', normal: '2.jpg', big: '2.big.jpg'}
];
</script>
接着添加CSS样式定义。
body,div,ul,li{
margin: 0; padding: 0;
list-style: none;
font-size: 0;
}
img{
display: block;
}
#box{
width: 650px;
position: relative;
margin: 0 auto 0 240px;
}
#box .show{
width: 600px;
border: solid 2px hotpink;
position: relative;
}
#box .show img{
width: 100%;
}
#box .show .drag{
position: absolute;
width: 200px;
height: 200px;
background-color: #e0a8d7;
opacity: .4;
left: 0;
top: 0;
display: none;
}
#box .magnify{
width: 800px;
height: 800px;
border: solid 2px #7d777b;
position: absolute;
left: 100%;
top: 0;
background: url("../images/1.big.jpg") no-repeat 0 0 / 2400px;
display: none;
}
#box ul{
width: 100%;
height: 150px;
margin-top: 20px;
}
#box ul::after{
content: '';
display: block;
clear: both;
}
#box ul li{
height: 100%;
float: left;
margin: 0 8px;
border: solid 2px #fff;
}
#box ul li.active{
border-color: hotpink;
}
#box ul li img{
height: 100%;
}
在设置CSS样式时需特别注意以下细节。
放大层的尺寸是通过遮盖层等比例放大得到的。因此,放大层宽度与高度之比,应当等于放大层背景图片尺寸与正常显示图片(即class为“show”的容器内图片)尺寸之比。
JavaScript交互逻辑实现
接下来需要使用JavaScript实现以下交互功能。
1. 当鼠标移入正常图片容器时,显示遮盖层和放大层;当鼠标移出该容器时,隐藏这两个层。 2. 定位遮盖层的位置,使其随鼠标在正常图片容器内的移动而移动,同时确保放大层内的背景图片进行对应的反向移动。 3. 实现小图切换效果,并在切换小图时,同步更新正常图片和放大层图片以显示对应的内容。
以下是具体的JavaScript实现代码。
class MgnGlass {
constructor(ele, array) {
this.ele = ele;
this.array = array;
this.show = ele.querySelector('.show');
this.showImg = this.show.querySelector('img');
this.drag = ele.querySelector('.drag');
this.magnify = ele.querySelector('.magnify');
this.oUl = ele.querySelector('ul');
this.oUlis = ele.querySelectorAll('ul li');
}
// 定义一个方法,来调用之后定义的所有的方法
// 入口函数
init() {
this.setMouse();
this.setPosition();
this.setTab();
}
// 鼠标的移入移出
setMouse() {
// 鼠标移入,图片区域show,让遮盖层和放大镜显示
this.show.addEventListener('mouseover', () => {
this.drag.style.display = 'block';
this.magnify.style.display = 'block';
});
// 鼠标移出,图片区域show,让遮盖层和放大镜隐藏
this.show.addEventListener('mouseout', () => {
this.drag.style.display = 'none';
this.magnify.style.display = 'none';
});
}
// 设置定位效果
// 鼠标在 图片区域移动 时
// 1,让遮盖层,跟随鼠标移动 --- 类似之前鼠标拖拽的效果
setPosition() {
this.show.addEventListener('mousemove', (e) => {
e = e || event;
// 1,定位 遮盖层
// 通过 鼠标的定位位置,来计算 遮盖层 左上角 定位的坐标位置
let x = e.clientX - this.ele.offsetLeft - this.ele.clientLeft - this.drag.clientWidth / 2;
let y = e.clientY - this.ele.offsetTop - this.ele.clientTop - this.drag.clientHeight / 2;
// 2,设定边界值
// 最小是 0 最大值 父级div宽高 - 遮盖层宽高
if (x < 0){
x = 0;
}
else if (x > (this.show.clientWidth - this.drag.clientWidth)){
x = this.show.clientWidth - this.drag.clientWidth;
}
if (y < 0){
y = 0;
}
else if (y > (this.show.clientHeight - this.drag.clientHeight)){
y = this.show.clientHeight - this.drag.clientHeight;
}
// 3,将数值定位给遮盖层
this.drag.style.left = x + 'px';
this.drag.style.top = y + 'px';
// 4,需要让右侧放大镜的背景图片也一起移动
// 给背景图片添加定位
// 左侧是 图片不动,遮盖层动 遮盖层动 100 100
// 右侧是 放大镜不动,背景图片动 背景图动 -100 -100
// 移动时,定位必须是按照比例来设定
// 背景图片定位 = 背景图片大小 * 遮盖层定位 / 图片大小
// 通过遮盖层移动的比例,来计算,背景图片定位的数值
let backX = 2400 * x / 600;
let backY = 2400 * y / 600;
// 给背景图片定位
// 给背景图片进行定位赋值操作
this.magnify.style.backgroundPosition = `-${backX}px -${backY}px`;
})
}
// 切换效果
// 1,给当前鼠标经过mouseover 的标签,添加样式
// 给所有的标签去除样式,给当前点击/经过标签,添加样式
setTab() {
this.oUlis.forEach((item, key) => {
item.addEventListener('mouseover', () => {
// 1,给所有的li标签清除样式
this.oUlis.forEach((item2) => {
item2.className = '';
});
// 2,给当前的标签添加样式
item.className = 'active';
// 3,设定图片
// 当前标签的索引下标 key 就是对应 图片数组中,需要显示的图片的索引下标
// 1,给图片标签,设定路径
// 通过数组,索引,图片属性,获取对应的图片名称
// 标签.src = 赋值 或者 标签.setAttribute('src' , 属性值) 都可以
this.showImg.setAttribute('src', `./images/${this.array[key].normal}`);
// 2,给放大镜区域,背景图片设定路径
// 必须把关于背景图片的所有设定都重新写一遍
this.magnify.style.background = `url('./images/${this.array[key].big}') no-repeat 0 0 / 2400px`;
})
})
}
}
关键比例计算与注意事项
要完美实现放大镜效果,必须严格注意两个关键比例关系。
1. CSS样式比例关系:图片区域大小与遮盖层大小的比值,应等于背景图片大小与放大镜区域大小的比值。 2. 定位比例关系:遮盖层的定位坐标与图片区域大小的比值,应等于背景图片的定位坐标与背景图片大小的比值。
构造函数调用与效果演示
最后,调用封装好的构造函数即可生成最终的HTML结构,执行代码后即可看到预期的放大镜效果。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>放大镜</title>
<link rel="stylesheet" type="text/css" href="./css/mgfyGlass.css" >
</head>
<body>
<div id="box">
<div class="show">
<img src="./images/1.jpg" alt="#">
<div class="drag"></div>
</div>
<div class="magnify"></div>
<ul>
<li class="active"><img src="./images/1.small.jpg" alt="#"></li>
<li><img src="./images/2.small.jpg" alt="#"></li>
</ul>
</div>
<script type="text/javascript" src="./javascript/mgfyGlass.js"></script>
<script>
const oBox = document.querySelector('#box');
const imgArr = [
{small: '1.small.jpg', normal: '1.jpg', big: '1.big.jpg'},
{small: '2.small.jpg', normal: '2.jpg', big: '2.big.jpg'}
];
const mgnGlass = new MgnGlass(oBox, imgArr);
mgnGlass.init();
</script>
</body>
</html>
以上就是本文的全部内容,希望能为读者的学习提供有益帮助,同时也欢迎大家继续支持本站。
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
