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 相关文章推荐
setTimeout与setInterval在不同浏览器下的差异
Jan 24 Javascript
jQuery Lightbox 图片展示插件使用说明
Apr 25 Javascript
jQuery常见开发技巧详细整理
Jan 02 Javascript
js动态为代码着色显示行号
May 29 Javascript
JavaScript获取onclick、onchange等事件值的代码
Jul 22 Javascript
jquery ajax jsonp跨域调用实例代码
Dec 11 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
Mar 27 Javascript
jQuery中odd选择器的定义和用法
Dec 23 Javascript
jQuery事件绑定与解除绑定实现方法
Apr 15 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
Nov 07 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
Aug 09 Javascript
解决vant的Toast组件时提示not defined的问题
Nov 11 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 header()函数使用说明
2008/07/10 PHP
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
2014/08/15 Python
跟老齐学Python之总结参数的传递
2014/10/10 Python
探究Python中isalnum()方法的使用
2015/05/18 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
大专生工程监理求职信
2013/10/04 职场文书
六年级学生评语
2014/04/22 职场文书
校庆标语集锦
2014/06/25 职场文书
写景作文评语集锦
2014/12/25 职场文书
工程技术员岗位职责
2015/04/11 职场文书
英语演讲开场白
2015/05/29 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js