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 相关文章推荐
将form表单中的元素转换成对象的方法适用表单提交
May 02 Javascript
javascript中Math.random()使用详解
Apr 15 Javascript
jQuery判断多个input file 都不能为空的例子
Jun 23 Javascript
JavaScript小技巧整理
Dec 30 Javascript
jquery日历插件e-calendar升级版
Nov 10 Javascript
JavaScript实现省市联动过程中bug的解决方法
Dec 04 Javascript
React中使用UEditor百度富文本的方法
Aug 22 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
Sep 26 Javascript
微信小程序事件 bindtap bindinput代码实例
Aug 26 Javascript
package.json配置文件构成详解
Aug 27 Javascript
Js代码中的span拼接问题解决
Nov 22 Javascript
JS JQuery获取data-*属性值方法解析
Sep 01 jQuery
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中的超全局变量
2006/10/09 PHP
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
php实现当前页面点击下载文件的实例代码
2016/11/16 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
React SSR样式及SEO的实践
2018/10/22 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
Python使用新浪微博API发送微博的例子
2014/04/10 Python
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
利用Python获取操作系统信息实例
2016/09/02 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
python time.strptime格式化实例详解
2021/02/03 Python
Julep官网:美容产品和指甲油
2017/02/25 全球购物
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
小学三八妇女节活动方案
2014/03/16 职场文书
护士长竞聘书
2014/03/31 职场文书
公司合作协议书范本
2014/04/18 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书