原生js实现淘宝放大镜效果


Posted in Javascript onOctober 28, 2020

大家经常逛淘宝、天猫、京东这类网站的时候往往会看到一些图片展示的效果,例如:把鼠标放在图片上右侧会出现一个放大的预览区域,这就是所谓放大镜效果。今天闲着没事干,就打算复习一下JavaScript基础,用一下基础知识制作一个类似于淘宝的放大镜效果。

先说一下这个效果需要用到的一些基础知识:

css相对定位:position:absolute;

鼠标移入移出以及移动事件:onmouseover、onmouseout、onmousemove,记住这些事件一般不会单个出现

获取鼠标点击坐标:X轴:clientX,Y轴:clientY

当前元素相对于父元素的左位移:offsetLeft

当前元素相对于父元素的上位移:offsetTop

当前元素的实际高、宽度(不包括滚动条):offsetWidth、offsetHeight

球当前元素的最小值,最大值:Math.min()、Math.max();

话不多说直接上代码吧!

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>放大镜效果</title>
<style type="text/css">
*{
padding: 0;
margin: 0;
}
#demo{
display: block;
width: 400px;
height: 255px;
margin: 50px;
position: relative;
border: 1px solid #ccc;
}
#float-box{
position: relative;
z-index: 1;
}
#small-box{
display: none;
width: 160px;
height: 120px;
position: absolute;
background: #ffffcc;
border: 1px solid #ccc;
filter: alpha(opacity=50);
opacity: 0.5;
cursor: move;
}
#big-box{
display: none;
position: absolute;
top: 0;
left: 460px;
width: 400px;
height: 300px;
overflow: hidden;
border: 1px solid #ccc;
z-index: 1;
 
 
}
#big-box img{
position: absolute;
z-index: 5;
}
 
 
</style>
</head>
<body>
<div id="demo">
<div id="float-box">
<div id="small-box"></div>
<img src="../images/macbook-small.jpg">
</div>
<div id="big-box">
<img src="../images/macbook-big.jpg">
</div>
</div>
<script type="text/javascript">
window.onload = function(){
 
//获取到需要的元素
var demo = document.getElementById('demo');
var smallBbox = document.getElementById('small-box');
var floatBox = document.getElementById('float-box');
var bigBox = document.getElementById('big-box');
var bigBoxImg = bigBox.getElementsByTagName('img')[0];
 
 
floatBox.onmouseover = function(){
smallBbox.style.display = "block";
bigBox.style.display = "block";
}
floatBox.onmouseout = function(){
smallBbox.style.display = "none";
bigBox.style.display = "none";
}
floatBox.onmousemove = function(e){
var _event = e || event;
console.log(_event.clientY);
var l = _event.clientX - demo.offsetLeft - floatBox.offsetLeft - smallBbox.offsetWidth/2;//除2是因为让鼠标点出现在放大遮罩的中心位置
var t = _event.clientY - demo.offsetTop - floatBox.offsetTop - smallBbox.offsetHeight/2;
 
var demoWidth = demo.offsetWidth;
var demoHeight = demo.offsetHeight;
 
 
var smallBboxWidth = smallBbox.offsetWidth;
var smallBboxHeight = smallBbox.offsetHeight;
//鼠标可以移动的最大XY的距离
var maxX = demoWidth - smallBboxWidth;
var maxY = demoHeight - smallBboxHeight;
 
 
l = Math.min(maxX,Math.max(0,l));
t = Math.min(maxY,Math.max(0,t));
smallBbox.style.left = l +"px";
smallBbox.style.top = t +"px";
 
 
var percentX = l / (floatBox.offsetWidth - smallBboxWidth);//求出小图遮罩的坐标占可移动区域的比例
var percentY = t / (floatBox.offsetHeight - smallBboxHeight);
 
 
bigBoxImg.style.left = -percentX *(bigBoxImg.offsetWidth - bigBox.offsetWidth) +"px";//大图对的移动方向和小图遮罩的移动方向相反
bigBoxImg.style.top = -percentY*(bigBoxImg.offsetHeight - bigBox.offsetHeight)+"px";
 
}
}
</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用jscript实现列出安装的软件列表
Jun 18 Javascript
js动态创建、删除表格示例代码
Aug 07 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
javascript HTML+CSS实现经典橙色导航菜单
Feb 16 Javascript
JS实现简单的右下角弹出提示窗口完整实例
Jun 21 Javascript
react native实现往服务器上传网络图片的实例
Aug 07 Javascript
Bootstrap实现翻页效果
Nov 27 Javascript
Node 升级到最新稳定版的方法分享
May 17 Javascript
微信小程序简单的canvas裁剪图片功能详解
Jul 12 Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 Javascript
JS中的继承操作实例总结
Jun 06 Javascript
JS原生实现轮播图的几种方法
Mar 23 Javascript
微信小程序如何获取手机验证码
Nov 04 #Javascript
微信小程序实现弹出层效果
May 26 #Javascript
微信小程序实现预览图片功能
Oct 22 #Javascript
详解如何使用koa实现socket.io官网的例子
Nov 04 #Javascript
微信小程序实现多选功能
Nov 04 #Javascript
微信小程序实现无限滚动列表
May 29 #Javascript
微信小程序自定义轮播图
Nov 04 #Javascript
You might like
一个简单的PHP入门源程序
2006/10/09 PHP
浅谈php和.net的区别
2014/09/28 PHP
php实现生成验证码实例分享
2016/04/10 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
Python实现简单登录验证
2016/04/13 Python
Python爬豆瓣电影实例
2018/02/23 Python
Python的argparse库使用详解
2018/10/09 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
Python 实现一个计时器
2020/07/28 Python
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
Delphi软件工程师试题
2013/01/29 面试题
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
迅雷Cued工作心得体会
2014/01/27 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
小学体育课教学反思
2016/02/16 职场文书
试了下Golang实现try catch的方法
2021/07/01 Golang
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL
Win11查看设备管理器
2022/04/19 数码科技
python井字棋游戏实现人机对战
2022/04/28 Python