原生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 相关文章推荐
IE浏览器兼容Firefox的JS脚本的代码
Oct 23 Javascript
选择器中含有空格在使用示例及注意事项
Jul 31 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 Javascript
浅谈javascript中return语句
Jul 15 Javascript
javascript实现超炫的向上滑行菜单实例
Aug 03 Javascript
JavaScript编程中布尔对象的基本使用
Oct 25 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
May 16 Javascript
Angular ng-repeat 对象和数组遍历实例
Sep 14 Javascript
javascript中的数据类型检测方法详解
Aug 07 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
Sep 23 Javascript
JavaScript交换两个变量方法实例
Nov 25 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对数组排序的简单实例
2013/12/25 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
2016/07/12 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
Mac下安装vue
2018/04/11 Javascript
jQuery中的类名选择器(.class)用法简单示例
2018/05/14 jQuery
jQuery实现简单复制json对象和json对象集合操作示例
2018/07/09 jQuery
vue select 获取value和lable操作
2020/08/28 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
python之django母板页面的使用
2018/07/03 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
jupyter notebook清除输出方式
2020/04/10 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
详解SQL的窗口函数
2022/04/21 Oracle