javascript实现放大镜功能


Posted in Javascript onDecember 09, 2020

本文实例为大家分享了javascript实现放大镜功能的具体代码,供大家参考,具体内容如下

描述:当鼠标在小图片上移动时,通过捕捉鼠标在小图片上的位置, 使放大镜的移动方向与大图的水平和垂直方向相反

javascript实现放大镜功能

如何设计

  • 页面元素
  • 技术要点:事件捕捉和定位
  • 难点:计算

涉及技术

  • onmouseover:当鼠标指针移动到指定的对象上时发生
  • onmouseout:鼠标指针移出指定对象时发生
  • onmousemove:鼠标指针移动时发生
  • offsetLeft | offsetTop | offsetWidth | offsetHeight
  • event.clientX | event.clientY

偏移量与style.left

  • style.left返回字符串,例如30px,而offsetLeft返回数字30。
  • style.left可以读和写,offsetLeft是只读的。如果我们想改变div的位置,我们可以修改style.left.
  • style.left应事先定义,否则值为空。

需要考虑

  • 如何使小画面上的放大镜与大图同步移动
  • IE兼容性问题

代码实现

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Magnifier Effect</title>
 <style>
 *{
  margin: 0;
  padding: 0;
 }
 #wrap{
  width: 400px;
  height: 255px;
  margin: 50px;
  border: 1px solid #ccc;
  display: block;
  position: relative;
 }
 #small-box{
  position: relative;
  z-index: 1;
 }
 #float-box{
  width: 160px;
  height: 120px;
  position: absolute;
  background-color: #ffffcc;
  border:1px solid #ccc;
  filter: alpha(opacity = 50);
  opacity: .5;
  display: none;
 }
 #mask{
  position: absolute;
  display: block;
  width: 400px;
  height: 255px;
  z-index: 10;
  background-color: #ffffff;
  filter: alpha(opacity = 0);
  opacity: 0;
  cursor: move;
 }
 #big-box{
  position: absolute;
  top: 0;
  left: 460px;
  width: 400px;
  height: 300px;
  overflow: hidden;
  border: 1px solid #ccc;
  z-index: 1;
  display: none;
 }
 #big-box img{
  position: absolute;
  z-index: 5; 
 }
 </style>
</head>
<script>
 // 页面加载完毕之后执行
 window.onload = function(){
 // 获取父元素wrap, 小盒子,遮罩层, 放大镜, 大盒子, 大图片
 var wrap = document.getElementById('wrap');
 var smallBox = document.getElementById('small-box');
 var mask = document.getElementById('mask');
 var floatBox = document.getElementById('float-box');
 var bigBox = document.getElementById('big-box');
 var bigImg = bigBox.getElementsByTagName('img')[0];
 console.log(wrap, smallBox, mask, floatBox, bigBox, bigImg); 

 // 鼠标移动到小盒子上时, 放大镜显示, 大盒子显示
 mask.onmouseover = function(){
  floatBox.style.display = 'block';
  bigBox.style.display = 'block';
 }

 // 鼠标移出小盒子时, 放大镜隐藏, 大盒子隐藏
 mask.onmouseout = function(){
  floatBox.style.display = 'none';
  bigBox.style.display = 'none';
 }

 // 添加鼠标移动事件
 mask.onmousemove = function(ev){
  // 获取当前鼠标移动的位置并考虑IE兼容性
  var _event = ev || window.event;

  // 获取放大镜向左移动的距离
  var left = _event.clientX - wrap.offsetLeft - smallBox.offsetLeft - floatBox.offsetWidth / 2;
  var top = _event.clientY - wrap.offsetTop - smallBox.offsetTop - floatBox.offsetHeight / 2;

  // console.log(left, top);

  // 考虑边界情况
  if(left < 0){
  left = 0;
  }else if(left > (mask.offsetWidth - floatBox.offsetWidth)){
  left = mask.offsetWidth - floatBox.offsetWidth;
  }

  if(top < 0){
  top = 0;
  }else if(top > (mask.offsetHeight - floatBox.offsetHeight)){
  top = mask.offsetHeight - floatBox.offsetHeight;
  }

  floatBox.style.left = left + 'px';
  floatBox.style.top = top + 'px';

  // calculate percentage
  var percentX = left / (mask.offsetWidth - floatBox.offsetWidth);
  var percentY = top / (mask.offsetHeight - floatBox.offsetHeight);

  // calculate displacement of big image, big image has opposite direction of magnifying glass
  bigImg.style.left = -percentX * (bigImg.offsetWidth - bigBox.offsetWidth) + 'px';
  bigImg.style.top = -percentY * (bigImg.offsetHeight - bigBox.offsetHeight) + 'px';

 }
 }
</script>
<body>
 <div id="wrap">
 <div id="small-box">
  <div id="mask"></div>
  <div id="float-box"></div>
  <img src="./img/macbook-small.jpg" alt="smallMac">
 </div>
 <div id="big-box">
  <img src="./img/macbook-big.jpg" alt="bigMac">
 </div>
 </div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 树控件 比较好用
Jun 11 Javascript
js 实现无缝滚动 兼容IE和FF
Jul 15 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
Apr 07 Javascript
Js 刷新框架页的代码
Apr 13 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
Mar 05 Javascript
AngularJS的一些基本样式初窥
Jul 27 Javascript
jQuery实现点击水纹波动动画
Apr 10 Javascript
功能强大的Bootstrap效果展示(二)
Aug 03 Javascript
ES6 系列之 WeakMap的使用示例
Aug 06 Javascript
ES6 Promise对象的含义和基本用法分析
Jun 14 Javascript
layui form表单提交后实现自动刷新
Oct 25 Javascript
WebWorker 封装 JavaScript 沙箱详情
Nov 02 Javascript
Javascript实现单选框效果
Dec 09 #Javascript
javascript实现移动端轮播图
Dec 09 #Javascript
JavaScript实现弹出窗口效果
Dec 09 #Javascript
五句话帮你轻松搞定js原型链
Dec 09 #Javascript
JS常用跨域方法实现原理解析
Dec 09 #Javascript
video.js添加自定义组件的方法
Dec 09 #Javascript
手把手教你如何编译打包video.js
Dec 09 #Javascript
You might like
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
php计算整个目录大小的方法
2015/06/19 PHP
php经典趣味算法实例代码
2020/01/21 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
JS 判断undefined的实现代码
2009/11/26 Javascript
jQuery 开天辟地入门篇一
2009/12/09 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
Python的动态重新封装的教程
2015/04/11 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
django 读取图片到页面实例
2020/03/27 Python
容易被忽略的Python内置类型
2020/09/03 Python
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
Unix/Linux开发面试题
2016/08/16 面试题
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
广告宣传策划方案
2014/05/21 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
资料员岗位职责范本
2015/04/13 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
2015中秋祝酒词
2015/08/12 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
Spring整合Mybatis的全过程
2021/06/28 Java/Android
python函数的两种嵌套方法使用
2022/04/02 Python