网站首页 > 技术文章 正文
电商详情页的经典三件套:缩略图列表 + 中等图展示 + 局部放大图。本文js原生代码实现一条无依赖、可复用、可扩展的放大镜链路,涵盖事件委托、边界计算、背景定位三大核心技能。
效果预览
一、HTML 骨架
<div class="container">
<!-- 中等图 -->
<div class="left-img">
<div class="mask"></div>
</div>
<!-- 放大图 -->
<div class="right-img"></div>
<!-- 缩略图列表 -->
<ul class="img-list"></ul>
</div>
- left-img:中等图,承担点击切换与鼠标探测双重职责
- mask:绝对定位遮罩,用于局部高亮与边界计算
- right-img:放大图,背景图定位实现局部放大效果
二、数据约定
var imgs = {
small: [
'imgA_1.jpg',
'imgB_1.jpg',
'imgC_1.jpg'],
middle: [
'imgA_2.jpg',
'imgB_2.jpg',
'imgC_2.jpg'],
large: [
'imgA_3.jpg',
'imgB_3.jpg',
'imgC_3.jpg']
}
- 三张图按索引一一对应,切换时只需同步 backgroundImage
- 缩略图定宽定高,中等图与放大图定宽不定高,保持比例
三、JS链式事件三步走
1.初始化:渲染缩略图 + 默认激活
2.点击缩略图:同步切换中等图与大图
使用事件委托,缩略图数量随意增减,无需重新绑定。
3.鼠标移动:遮罩层跟随 + 大图定位
边界计算拆解
- left ≤ 0 时强制归零
- left ≥ (中等图宽 - 遮罩宽) 时强制贴边
- 同理处理 top 高度方向
背景定位技巧
遮罩向右移动 10px,大图背景向左移动 10px,形成「窗口」效果;Y 轴同理。
四、鼠标离开:自动隐藏
$('.left-img').onmouseleave = function () {
$('.mask').style.opacity = 0
$('.right-img').style.opacity = 0
}
只用 opacity 控制显隐,避免 display: none 触发重排;背景图已预加载,无闪烁。
性能 & 扩展
- 零依赖:原生 DOM API,gzip < 1 KB
- 零重排:仅用 opacity 与 background-position,不改动布局
- 可异步:把 initPage 换成 fetch 即可接入后端图片列表
- 可响应:把 offsetWidth 换成 getBoundingClientRect 即可适配缩放
- 上一篇: JS 打造丝滑手风琴_web手风琴
- 下一篇: JS 高手进阶:玩转七种继承艺术_js继承是什么意思
猜你喜欢
- 2025-09-23 Github开源即时通讯(IM)项目,可实现聊天、语音通话等
- 2025-09-23 Astra 横空出世,真的是 JS 转 EXE 的未来吗?
- 2025-09-23 万字长文帮你彻底搞懂JS中的Promise
- 2025-09-23 JS中 call()、apply()、bind() 的用法
- 2025-09-23 JS 克隆对象八种技术,为何少不了 StructuredClone?
- 2025-09-23 为什么 JS 开发者更喜欢 Axios 而不是 Fetch?
- 2025-09-23 JS 高手进阶:玩转七种继承艺术_js继承是什么意思
- 2025-09-23 JS 打造丝滑手风琴_web手风琴
- 2024-12-18 比较 JavaScript 对象的四种方式「实践」
- 2024-12-18 我不知道还可以用 JS 做的 6 件事
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)