原生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 相关文章推荐
doctype后如何获得body.clientHeight的方法
Jul 11 Javascript
jQuery的deferred对象使用详解
Aug 20 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
Aug 14 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
Jun 16 Javascript
Webpack 实现 AngularJS 的延迟加载
Mar 02 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
Feb 27 Javascript
详解angular用$sce服务来过滤HTML标签
Apr 11 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
May 24 Javascript
vue2.0之多页面的开发的示例
Jan 30 Javascript
Vue2 添加数据可视化支持的方法步骤
Jan 02 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中的socket_read和socket_recv区别详解
2015/02/09 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
PHP的mysqli_set_charset()函数讲解
2019/01/23 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
python爬取抖音视频的实例分析
2021/01/19 Python
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
师范生自我鉴定范文
2013/10/05 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
安阳殷墟导游词
2015/02/10 职场文书
小时代观后感
2015/06/10 职场文书
MySQL索引是啥?不懂就问
2021/07/21 MySQL