原生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 json 实例代码
Dec 02 Javascript
jquery一般方法介绍 入门参考
Jun 21 Javascript
JavaScript判断密码强度(自写代码)
Sep 06 Javascript
验证控件与Button的OnClientClick事件详细解析
Dec 04 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
May 04 Javascript
jquery插件NProgress.js制作网页加载进度条
Jun 05 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
May 05 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
Feb 07 Javascript
微信小程序 图片加载(本地,网路)实例详解
Mar 10 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
Aug 09 jQuery
vue使用canvas实现移动端手写签名
Sep 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 gzip压缩输出的实现方法
2013/04/27 PHP
神盾加密解密教程(二)PHP 神盾解密
2014/06/08 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
2016/09/26 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
Python自动化运维之Ansible定义主机与组规则操作详解
2019/06/13 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
django admin 添加自定义链接方式
2020/03/11 Python
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
英语专业学生个人求职信
2014/01/28 职场文书
股指期货心得体会
2014/09/10 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
创先争优承诺书
2015/01/20 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
草房子读书笔记
2015/06/29 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
JavaScript原型链详解
2021/11/07 Javascript