原生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 相关文章推荐
js用图作提交按钮或超连接
Mar 26 Javascript
jQuery的12招常用技巧分享
Aug 08 Javascript
jQuery UI 实现email输入提示实例
Aug 15 Javascript
jQuery+PHP实现动态数字展示特效
Mar 14 Javascript
jQuery获得子元素个数的方法
Apr 14 Javascript
Boostrap入门准备之border box
May 09 Javascript
9个让JavaScript调试更简单的Console命令
Nov 14 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
Jul 07 Javascript
Vue.js 单页面多路由区域操作的实例详解
Jul 17 Javascript
vue-cli2.9.3 详细教程
Apr 23 Javascript
在Vue-cli里应用Vuex的state和mutations方法
Sep 16 Javascript
小程序绑定用户方案优化小结
May 15 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
德生PL330的评价与改造
2021/03/02 无线电
PHP中cookies使用指南
2007/03/16 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
php数组去除空值函数分享
2015/02/02 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
jquery multiSelect 多选下拉框
2010/07/09 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
2017/09/15 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
对numpy中轴与维度的理解
2018/04/18 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
python3实现mysql导出excel的方法
2019/07/31 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
高级Java程序员面试要点
2013/08/02 面试题
宿舍卫生检讨书
2014/01/16 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
Javascript之datagrid查询详解
2021/09/15 Javascript
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
python实现手机推送 代码也就10行左右
2022/04/12 Python
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript