原生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 相关文章推荐
硬盘浏览程序,保存成网页格式便可使用
Dec 03 Javascript
Javascript 日期对象Date扩展方法
May 30 Javascript
使用JavaScript 编写简单计算器
Nov 24 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
Mar 11 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
May 12 Javascript
去除html代码里面的script正则方法
May 19 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
Jul 12 Javascript
AngularJs  Understanding Angular Templates
Sep 02 Javascript
js前端解决跨域问题的8种方案(最新最全)
Nov 18 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
Jan 12 Javascript
ES6模板字符串和标签模板的应用实例分析
Jun 25 Javascript
基于JavaScript实现年月日三级联动
Jun 22 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 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
拖拉表格的JS函数
2008/11/20 Javascript
JS前端框架关于重构的失败经验分享
2013/03/17 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
详解a++和++a的区别
2017/08/30 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
Python制作简易注册登录系统
2016/12/15 Python
深入理解python对json的操作总结
2017/01/05 Python
Python 操作文件的基本方法总结
2017/08/10 Python
Python3计算三角形的面积代码
2017/12/18 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
清正廉洁演讲稿
2014/05/22 职场文书
小学安全汇报材料
2014/08/14 职场文书
入党转正介绍人意见
2015/06/03 职场文书
高效课堂教学反思
2016/02/24 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP