目录

前言

代码思想及代码实现

效果图展示

整体思想

HTML部分

CSS部分

JavaScript部分

完整代码

总结


前言

放大镜可以说是前端人必须学会的程序之一!今天本美女就用京东距离为大家展示一下怎么实现放大镜的效果!相比较html和css而言,js更重要的就是你需要想明白程序的思想以及怎么一步步实现自己的想法,话不多说开整!

代码思想及代码实现

效果图展示

整个效果就是当鼠标放到展示图上的时候,会出现一个遮罩层以及弹出来一个框展示一个详情图,并且鼠标移动的时候详情图跟着移动,鼠标离开详情图消失。

整体思想

  • 当鼠标放在展示图上方时,出现遮罩层并且出现详情图;
  • 当鼠标离开展示图时遮罩层和详情图消失;
  • 鼠标需要在遮罩层中央,遮罩层半透明;
  • 展示图和详情图需要移动比例相同;

HTML部分

主要是两个盒子:

  • 定义为box类:用于存放展示的图片(展示图)、遮罩层;
  • 定义为big类:用于存放大的图片(详情图);
 <div class="box"><img src="../img/ip.jpg" alt=""><div class="mask"></div></div><div class="big"><img src="../img/ip10.jpg" alt="" class="img"></div>

CSS部分

  • box类:选择合适的大小,设置好宽度和高度,设置浮动效果让big类能够和box在同一排显示(根据自身情况调整 不需要可以不设置);
.box {width: 450px;height: 450px;border: 1px solid #ccc;float: left;/*设置浮动使得两个盒子在一排显示*/position: relative;/*设置定位 根据自身情况可以改为绝对定位 */margin: 10px;}
  • big类:给盒子设置合适的大小,因为会详情图一般情况下是会超过盒子的大小的,需要设置超出部分隐藏,设置详情图为不可见,需要设置定位,因为详情图后面会需要定位;
 .big {width: 600px;height: 600px;overflow: hidden;/*超出部分隐藏*/border: 1px solid #ccc;position: relative;  /*设置定位 根据自身情况可以改为绝对定位 */display: none;/*默认不显示 鼠标经过box时显示*/}
  • mask类:需要设置定位,left 和top值设为0;透明度设置为0.5左右,设置一个自己喜欢的颜色,鼠标经过的样式设置以及设置为不可见;
 .mask {width: 300px;height: 300px;background-color: yellow;position: absolute;/*在box类里面定位 层级高于展示图*/top: 0px;left: 0px;opacity: .5;/*设置遮罩层的透明度*/cursor: move;/*鼠标经过的时候变成十字拖动样式*/display: none;/*默认不显示 鼠标经过box时显示*/}
  • img类(详情图):只需要添加绝对定位以及把top和left设为0即可;
 .img {position: absolute;/*在big盒子里面绝对定位*//*JavaScript需要赋值需要设置top和left值*/top: 0px;left: 0px;}

JavaScript部分

  • 获取元素
        var mask = document.querySelector('.mask');var box = document.querySelector('.box');var big = document.querySelector('.big');var img = document.querySelector('.img');
  • 实现鼠标经过展示图的时候,详情图和遮罩层的显示与隐藏;
 box.addEventListener('mouseover', function () {mask.style.display = 'block';big.style.display = 'block';});box.addEventListener('mouseout', function () {mask.style.display = 'none';big.style.display = 'none';});
  • 获取鼠标的位置,让鼠标位于遮罩层的中央;

为了帮助更好的理解我在这里画了个图,e.pageY - box.offsetTop即可获得鼠标在box盒子里面的做坐标,我们把这个获取的鼠标值给遮罩层,但是直接将鼠标值给遮罩层会偏移需要调整;

计算示意图

我们把这个获取的鼠标值给遮罩层,但是直接将鼠标值给遮罩层会偏移需要调整到遮罩层中央;

        //得到的x和y是鼠标在盒子内的坐标  this指向boxvar x = e.pageX - this.offsetLeft;var y = e.pageY - this.offsetTop;//将获取到的鼠标的值给遮罩层(减去一半是因为让鼠标在遮罩层中央) 让它跟着鼠标移动var maskX = x - mask.offsetWidth / 2;var maskY = y - mask.offsetHeight / 2;
  • 设置遮罩层的最大移动距离,不可以超出box盒子;

距离的计算box.offsetWidth - mask.offsetWidth即可得到可以移动的宽度值,box.offsetHeight - mask.offsetHeight即可得到可以移动的高度值;移动距离最小为0,最大不可以超过宽度值(高度值)。

移动距离示意图
           //设置最大移动距离var maskWidth = box.offsetWidth - mask.offsetWidth;var maskHeight = box.offsetHeight - mask.offsetHeight;//控制mask移动的范围if (maskX <= 0) {maskX = 0;} else if (maskX >= maskWidth) {maskX = maskWidth;}if (maskY <= 0) {maskY = 0;} else if (maskY >= maskHeight) {maskY = maskHeight;}mask.style.left = maskX + 'px';mask.style.top = maskY + 'px';
  • 实现展示图和详情图移动比例相同,达到一致的移动效果;

mask和详情图(大图)有一定的比例公式,转换之后就可以实现同步转换,但是需要注意方向会影响正负值。最后将计算出来的值赋给img的top和left。

转换公示
           //大图最大移动距离var imgWidth = img.offsetWidth - big.offsetWidth;var imgHeight = img.offsetHeight - big.offsetHeight;//大图片的移动距离 = mask移动距离 * 大图最大移动距离 /mask的最大移动距离  var bigX = maskX * imgWidth / maskWidth;var bigY = maskY * imgHeight / maskHeight;//赋值  注意方向相反取负值img.style.left = (-bigX) + 'px';img.style.top = (-bigY) + 'px';

完整代码

<!DOCTYPE html>
<html lang="zn"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>京东放大镜</title><style>.box {width: 450px;height: 450px;border: 1px solid #ccc;float: left; /*设置浮动使得两个盒子在一排显示*/position: relative;/*设置定位 根据自身情况可以改为绝对定位 */margin: 10px;}.big {width: 600px;height: 600px;overflow: hidden;/*超出部分隐藏*/border: 1px solid #ccc;position: relative; /*设置定位 根据自身情况可以改为绝对定位 */display: none;/*默认不显示 鼠标经过box时显示*/}.mask {width: 300px;height: 300px;background-color: yellow;position: absolute;/*在box类里面定位 层级高于展示图*/top: 0px;left: 0px;opacity: .5;/*设置遮罩层的透明度*/cursor: move;/*鼠标经过的时候变成十字拖动样式*/display: none;/*默认不显示 鼠标经过box时显示*/}.img {position: absolute;/*在big盒子里面绝对定位*//*JavaScript需要赋值需要设置top和left值*/top: 0px;left: 0px;}</style>
</head><body><div class="box"><img src="../img/ip.jpg" alt=""><div class="mask"></div></div><div class="big"><img src="../img/ip10.jpg" alt="" class="img"></div><script>var mask = document.querySelector('.mask');var box = document.querySelector('.box');var big = document.querySelector('.big');var img = document.querySelector('.img');box.addEventListener('mouseover', function () {mask.style.display = 'block';big.style.display = 'block';});box.addEventListener('mouseout', function () {mask.style.display = 'none';big.style.display = 'none';});box.addEventListener('mousemove', function (e) {//得到的x和y是鼠标在盒子内的坐标  this指向boxvar x = e.pageX - this.offsetLeft;var y = e.pageY - this.offsetTop;//将获取到的鼠标的值给遮罩层(减去一半是因为让鼠标在遮罩层中央) 让它跟着鼠标移动var maskX = x - mask.offsetWidth / 2;var maskY = y - mask.offsetHeight / 2;//设置最大移动距离var maskWidth = box.offsetWidth - mask.offsetWidth;var maskHeight = box.offsetHeight - mask.offsetHeight;//控制mask移动的范围if (maskX <= 0) {maskX = 0;} else if (maskX >= maskWidth) {maskX = maskWidth;}if (maskY <= 0) {maskY = 0;} else if (maskY >= maskHeight) {maskY = maskHeight;}mask.style.left = maskX + 'px';mask.style.top = maskY + 'px';//大图最大移动距离var imgWidth = img.offsetWidth - big.offsetWidth;var imgHeight = img.offsetHeight - big.offsetHeight;//大图片的移动距离 = mask移动距离 * 大图最大移动距离 /mask的最大移动距离  var bigX = maskX * imgWidth / maskWidth;var bigY = maskY * imgHeight / maskHeight;//赋值img.style.left = (-bigX) + 'px';img.style.top = (-bigY) + 'px';});</script></body></html>

总结

家人们!收藏这篇博客以备不时之需,以后就不会担心放大镜效果不会做了!前端人前端魂,不会放大镜效果誓不为人!

放大镜效果总共分三步:

  1. 鼠标放上去显示,否则隐藏;
  2. 鼠标的坐标计算之后给遮罩层,记得放中间;
  3. 移动比例一定,直接套用公式!

注意:千万不要把数据写死,要写成公式方便修改! 

前端必学——用JavaScript实现电商图片放大镜效果(附代码)相关推荐

  1. web前端必学功法之一:表单校验(1)

    web前端必学功法之一:表单校验 案例效果: 这里的布局采用的是bootstrap布局 <div class="container" style="margin-t ...

  2. 前端必学 - 大文件上传如何实现

    前端必学 - 大文件上传如何实现 写在前面 问题分析 开始操作 一.文件如何切片 二.得到原文件的hash值 三.文件上传 四.文件合并 技术点总结[重要] 一.上传文件? 二.显示进度 三.暂停上传 ...

  3. web前端必学功法之一:轮播图

    web前端必学功法之一:轮播图 效果演示: <style>* {margin: 0;padding: 0;}/* 去除a标签的下划线 */a {text-decoration: none; ...

  4. web前端必学功法之一:用户选择爱好

    web前端必学功法之一:用户选择爱好 案例实现效果: 首先做这个页面效果,我们要把页面布局给写好,每个网站做好页面可以解决很大的问题. css代码,这里的页面采用Grid布局 <style> ...

  5. web前端必学功法之一:留言板

    web前端必学功法之一:留言板 案例效果: css部分 <style>.container{width: 600px;}.mes-board{margin: 25px 0;padding: ...

  6. web前端必学功法之一:省市联动

    web前端必学功法之一:省市联动 案例:js实现下面功能 **<!-- 省市联动思路分析:1.准备元素:定义省份与城市的下拉框2.绑定事件:绑定省份下拉框的change事件3.准备数据:准备数组 ...

  7. web前端必学功法之一:秒表实现

    web前端必学功法之一:秒表实现 功能案例: css样式:<style>.date{width: 200px;height: 50px;background-color: black;bo ...

  8. web前端必学功法之一:五星好评

    web前端必学功法之一:五星好评 案例效果: <!--思路分析:1.设置鼠标样式,当鼠标放到星星上时,修改鼠标的样式2.定义元素:通过表格的td元素来存放星星3.绑定事件:绑定每一个星星的鼠标悬 ...

  9. web前端必学功法之一:表单校验(2)

    web前端必学功法之一:表单校验(2) 这里采用另一种写法,jQuery写法,在用jQuery写法之前,一定要引入jquery.js. <div class="container&qu ...

最新文章

  1. 性能测试07:服务器性能测试范围
  2. poj1182 and 携程预赛2第一题 带权并查集
  3. java改变this指向_$.on()方法和addEventListener改变this指向
  4. 怎么看python环境变量配置是否好了验证图片_python 的 tesserocr 模块安装与获取图片验证码...
  5. python高级特性:迭代器与生成器
  6. 【codevs3304】水果姐逛水果店Ⅰ,线段树练习
  7. StringBuffer和String,StringBuilder的区别?
  8. python单例设计模式(待补充)
  9. 老手萌新学习composer的使用
  10. nginx websocket wss 连接失败 failed_Nginx 配置WSS 解析与实战
  11. G.8032 ERPS 轻松强固网络安全!
  12. java jdk1.5_jdk1.5 64位官方下载
  13. 深度解读旷视招股书:这557页带你看懂中国AI公司的生意经
  14. GBK编码和UTF-8编码区别各所占用字节数
  15. 连接服务器显示用户账户无效,发现MT4真实账户无效该怎么办?
  16. python 题目识别截图切分(有道API接口题目坐标识别、PIL截图)
  17. 魔方cfop公式软件_按这七步训练,你可以快速玩转魔方!
  18. React 环境 webpack less 配置 及 javascriptEnabled 解决方法
  19. revit二次开发 IdlingExternalEvent 空闲事件与外部事件
  20. 具有路线规划功能的外卖平台(Qt,C++,C/S架构,MySql)

热门文章

  1. C++中关于写日志文件Log的方法
  2. vscode vetur 代码格式化优化设置(亲测有用)
  3. Podman的基本设置和使用
  4. matlab如何编辑幂函数,如何编辑excel幂函数(如何用excle输入公式幂)
  5. xamarin android 微信,转换微信SDK为Xamarin绑定库 Android5.5.8 iOS1.8.6.2
  6. Vchat — 从头到脚,撸一个社交聊天系统(vue + node + mongodb)
  7. 网页或APP抓包请求参数有什么意思,怎么更快的抓包获取这些请求
  8. 沈丘县司法局法治进校园金秋第一堂法治课
  9. ez_pz_hackover_2016
  10. 如何做好一个项目经理