原生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 相关文章推荐
浅析return false的正确使用
Nov 04 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 Javascript
jquery实现兼容IE8的异步上传文件
Jun 15 Javascript
javascript格式化日期时间方法汇总
Jun 19 Javascript
表单验证正则表达式实例代码详解
Nov 09 Javascript
JS 对象(Object)和字符串(String)互转方法
May 20 Javascript
浅析Node.js实现HTTP文件下载
Aug 05 Javascript
jQuery表单事件实例代码分享
Aug 18 Javascript
用原生js统计文本行数的简单示例
Aug 19 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
Nov 13 Javascript
Vue中使用sass实现换肤功能
Sep 07 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
Sep 28 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文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
php下网站防IP攻击代码,超级实用
2010/10/24 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
php中static 静态变量和普通变量的区别
2016/12/01 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
python实现微信接口(itchat)详细介绍
2017/10/23 Python
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
Tesserocr库的正确安装方式
2018/10/19 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
python实现列表的排序方法分享
2019/07/01 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
Parts Express:音频、视频和扬声器的第一来源
2017/04/25 全球购物
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
仓库组长岗位职责
2014/01/29 职场文书
运动会入场词200字
2014/02/15 职场文书
质量承诺书怎么写
2014/05/24 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
新员工考核评语
2014/12/31 职场文书
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android