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 相关文章推荐
JS IE和FF兼容性问题汇总
Feb 09 Javascript
跨浏览器的事件对象介绍
Jun 27 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 Javascript
javascript实例分享---具有立体效果的图片特效
Jun 08 Javascript
给应用部分的js代码设定一个统一的入口
Jun 15 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
Oct 23 Javascript
一个简单不报错的summernote 图片上传案例
Jul 11 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
Nov 06 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
Nov 21 Javascript
React SSR样式及SEO的实践
Oct 22 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
Apr 30 Javascript
封装微信小程序http拦截器过程解析
Aug 13 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
Codeigniter发送邮件的方法
2015/03/19 PHP
php创建多级目录的方法
2015/03/24 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
PHP实现发送微博消息功能完整示例
2019/12/04 PHP
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
[01:29]Ti4循环赛第三日精彩回顾
2014/07/13 DOTA
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
pytorch 求网络模型参数实例
2019/12/30 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
小学安全汇报材料
2014/08/14 职场文书
标准版离职证明书
2014/09/12 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
离婚协议书范文2015
2015/01/26 职场文书
礼仪培训心得体会
2016/01/22 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书