原生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 相关文章推荐
Jquery中显示隐藏的实现代码分析
Jul 26 Javascript
JavaScript中“+”的陷阱深刻理解
Dec 04 Javascript
js中复制行和删除行的操作实例
Jun 25 Javascript
javascript使用isNaN()函数判断变量是否为数字
Sep 21 Javascript
js操作DOM--添加、删除节点的简单实例
Jul 08 Javascript
React 子组件向父组件传值的方法
Jul 24 Javascript
npm scripts 使用指南详解
Oct 08 Javascript
JS判断用户用的哪个浏览器实例详解
Oct 09 Javascript
vue axios封装及API统一管理的方法
Apr 18 Javascript
Node.js系列之发起get/post请求(2)
Aug 30 Javascript
如何基于JavaScript判断图片是否加载完成
Dec 28 Javascript
vue实现登录拦截
Jun 29 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
php session 错误
2009/05/21 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
smarty内置函数section的用法
2015/01/22 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
PHP内核探索之变量
2015/12/22 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
Python中内置的日志模块logging用法详解
2016/07/12 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
.net开发工程师面试题
2014/02/25 面试题
开业庆典邀请函
2014/01/08 职场文书
2014年销售工作总结
2014/12/01 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
golang日志包logger的用法详解
2021/05/05 Golang