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 相关文章推荐
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
Mar 17 Javascript
jquery focus(fn),blur(fn)方法实例代码
Dec 16 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 Javascript
IE、FF浏览器下修改标签透明度
Jan 28 Javascript
window.location 对象所包含的属性
Oct 10 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
Dec 05 Javascript
第十章之巨幕页头缩略图与警告框组件
Apr 25 Javascript
sso跨域写cookie的一段js脚本(推荐)
May 25 Javascript
js选项卡的制作方法
Jan 23 Javascript
Vue实现表格中对数据进行转换、处理的方法
Sep 06 Javascript
react 中父组件与子组件双向绑定问题
May 20 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
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更新修改excel中的内容实例代码
2014/02/26 PHP
javascript下过滤数组重复值的代码
2007/09/10 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
python实现的防DDoS脚本
2011/02/08 Python
Python中的zip函数使用示例
2015/01/29 Python
Python的装饰器使用详解
2017/06/26 Python
python pygame实现2048游戏
2018/11/20 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
Python数据分析pandas模块用法实例详解
2019/11/20 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
青年创业培训欢迎词
2014/01/08 职场文书
机关财务管理制度
2014/01/17 职场文书
正风肃纪剖析材料
2014/02/18 职场文书
党员公开承诺书内容
2014/05/20 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
十八大宣传标语
2014/10/09 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
作文评语集锦
2014/12/25 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书