原生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 相关文章推荐
再谈javascript 动态添加样式规则 W3C校检
Dec 25 Javascript
JavaScript 拾碎[三] 使用className属性
Oct 16 Javascript
jquery中获取元素的几种方式小结
Jul 05 Javascript
javascript五图轮播切换实用版
Aug 17 Javascript
javascript从image转换为base64位编码的String
Jul 29 Javascript
BootStrap创建响应式导航条实例代码
May 31 Javascript
微信小程序 二维码canvas绘制实例详解
Jan 06 Javascript
vue.js树形组件之删除双击增加分支实例代码
Feb 28 Javascript
vue+axios 前端实现的常用拦截的代码示例
Aug 23 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
Apr 13 Javascript
Vue 3.x+axios跨域方案的踩坑指南
Jul 04 Javascript
微信小程序 高德地图路线规划实现过程详解
Aug 05 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 xml文件操作代码(一)
2009/03/20 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
2016/11/25 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
js+html制作简单日历的方法
2017/06/27 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
python中去空格函数的用法
2014/08/21 Python
Python中处理unchecked未捕获异常实例
2015/01/17 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
你真的了解Python的random模块吗?
2017/12/12 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
python3.4中清屏的处理方法
2020/07/06 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
努比亚手机官网:nubia
2016/10/06 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
请解释流与文件有什么不同
2016/07/29 面试题
工厂实习感言
2014/01/14 职场文书
产品质量承诺书范文
2014/03/27 职场文书
个人求职信范文
2014/05/24 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
委托书格式要求
2015/01/28 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python