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 相关文章推荐
Ajax一统天下之Dojo整合篇
Mar 24 Javascript
全屏js头像上传插件源码高清版
Mar 29 Javascript
功能强大的Bootstrap组件(结合js)
Aug 03 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
Javascript动画效果(4)
Oct 11 Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 Javascript
不使用 JS 匿名函数理由
Nov 17 Javascript
使用命令行工具npm新创建一个vue项目的方法
Dec 27 Javascript
Vue引入sass并配置全局变量的方法
Jun 27 Javascript
微信小程序开发之左右分栏效果的实例代码
May 20 Javascript
vue实现动态表格提交参数动态生成控件的操作
Nov 09 Javascript
如何使用原生Js实现随机点名详解
Jan 06 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
一个SQL管理员的web接口
2006/10/09 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
Python处理JSON数据并生成条形图
2016/08/05 Python
python自定义异常实例详解
2017/07/11 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
pymysql模块的操作实例
2019/12/17 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
Python对excel的基本操作方法
2021/02/18 Python
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
中科软测试工程师面试题
2012/06/16 面试题
毕业生就业推荐信范文
2013/12/01 职场文书
小学教师办公室制度
2014/02/03 职场文书
五年级音乐教学反思
2014/02/06 职场文书
住宅使用说明书
2014/05/09 职场文书
投标授权委托书范文
2014/08/02 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
微观世界观后感
2015/06/10 职场文书
Java 异步任务计算FutureTask
2022/04/28 Java/Android
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS