JavaScript实现京东风格放大镜效果详解
作者:微光时间:2026-10-24 17:43:00浏览:613
本文详细介绍如何使用JavaScript实现类似京东网站的图片放大镜功能。通过监听鼠标事件,控制黄色遮挡层与大图盒子的显示隐藏及联动移动,利用特定公式计算大图的位移距离,从而完成高清局部放大效果。
JavaScript实现京东风格放大镜效果详解
本文分享了一段使用JavaScript编写的仿京东网站图片放大镜功能的完整代码,供读者参考学习。
功能需求分析
该功能主要包含以下需求:
1. 系统划分为三个主要模块。 2. 当鼠标移入小图片所在的容器时,黄色的半透明遮挡层和大图片容器应当显示;当鼠标离开时,这两个容器需自动隐藏。 3. 黄色的遮挡层需跟随鼠标的移动而实时移动。 4. 当黄色遮挡层发生位移时,大图片需同步进行反向移动,以实现局部放大查看的效果。
大图片的移动距离计算公式为:大图片移动距离 = (遮挡层移动距离 × 大图片最大可移动距离)/ 遮挡层最大可移动距离。
HTML与CSS结构实现
<style>
body,
div {
margin: 0;
padding: 0;
}
.product {
position: relative;
width: 400px;
height: 400px;
margin: 50px 0 0 20px;
border: 1px solid #000;
}
.preview_img img {
width: 300px;
height: 300px;
margin: 50px 50px;
}
.mask {
position: absolute;
display: none;
top: 20px;
left: 30px;
width: 80px;
height: 80px;
background-color: yellow;
opacity: 0.5;
cursor: move;
}
.big {
position: absolute;
display: none;
left: 410px;
top: 0;
width: 500px;
height: 500px;
z-index: 999;
overflow: hidden;
}
.big img {
position: absolute;
top: 0;
left: 0;
width: 400px;
height: 400px;
}
</style>
<!-- 引入js文件 -->
<script src="detail.js"></script>
</head>
<body>
<div class="product">
<div class="preview_img">
<img src="images/xs.jpg" alt="" />
<div class="mask"></div>
<div class="big">
<img src="images/xs.jpg" alt="" class="bigImg" />
</div>
</div>
</div>
</body>
JavaScript逻辑代码
以下是实现该功能的具体JavaScript代码部分。
//页面预加载
window.addEventListener("load", function () {
var preview_img = document.querySelector(".preview_img");
var mask = document.querySelector(".mask");
var big = document.querySelector(".big");
//1.鼠标经过 preview_img 就显示和隐藏 mask 遮挡层 和 big 大盒子
preview_img.addEventListener("mouseover", function () {
mask.style.display = "block";
big.style.display = "block";
});
preview_img.addEventListener("mouseout", function () {
mask.style.display = "none";
big.style.display = "none";
});
//把鼠标坐标给遮挡层是不合适的,因为遮挡层坐标以父盒子为准
preview_img.addEventListener("mousemove", function (e) {
//(1)先计算出鼠标在盒子内的坐标
var x = e.pageX - this.offsetLeft;
var y = e.pageY - this.offsetTop;
//(2)减去盒子高度宽度的一半
//(3)mask 移动的距离
var maskX = x - mask.offsetWidth / 2;
var maskY = y - mask.offsetHeight / 2;
//(4)如果坐标小于0 就让他停在 0 的位置(即超出盒子范围就停止)
var egdeX = preview_img.offsetWidth - mask.offsetWidth;
var egdeY = preview_img.offsetHeight - mask.offsetHeight;
if (maskX <= 0) {
maskX = 0;
} else if (maskX >= egdeX) {
maskX = egdeX;
}
if (maskY <= 0) {
maskY = 0;
} else if (maskY >= egdeY) {
maskY = egdeY;
}
mask.style.left = maskX + "px";
mask.style.top = maskY + "px";
//大图片的移动距离 = 遮挡层移动距离*大图片最大移动距离 / 遮挡层的最大移动距离
var bigImg = document.querySelector(".bigImg");
//大图片最大移动距离
var bigMax = bigImg.offsetWidth - big.offsetWidth;
//大图片的移动距离 x y
var bigX = (maskX * bigMax) / egdeX;
var bigY = (maskY * bigMax) / egdeY;
bigImg.style.left = -bigX + "px";
bigImg.style.top = -bigY + "px";
});
});
以上就是本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。
作者最新文章
JavaScript零基础入门:从环境搭建到运行第一段代码
2026-11-05 15:29:58
HTML链接中javascript:void(0)的作用及现代替代方案
2026-11-05 10:07:47
在线调试 JS 时怎么引入 jQuery 或 Vue 等第三方库
2026-11-05 08:53:56
原生JavaScript实现简易颜色选择器原理与代码
2026-11-03 23:22:19
JS原生表单序列化:FormData与URLSearchParams用法详解
2026-11-03 23:13:21
