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 相关文章推荐
JSON 和 JavaScript eval使用说明
Jun 13 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
Feb 23 Javascript
window.requestAnimationFrame是什么意思,怎么用
Jan 13 Javascript
一个JavaScript处理textarea中的字符成每一行实例
Sep 22 Javascript
js Calender控件使用详解
Jan 05 Javascript
jQuery实现表单步骤流程导航代码分享
Aug 28 Javascript
基于JS2Image实现圣诞树代码
Dec 24 Javascript
详解webpack3如何正确引用并使用jQuery库
Aug 26 jQuery
JavaScript中常见内置函数用法示例
May 14 Javascript
vue filter 完美时间日期格式的代码
Aug 14 Javascript
JavaScript实现简单的弹窗效果
May 19 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 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
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
jquery tools 系列 scrollable学习
2009/09/06 Javascript
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
2015/03/09 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python抓取最新博客内容并生成Rss
2015/05/17 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
python获取array中指定元素的示例
2019/11/26 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
python 利用zmail库发送邮件
2020/09/11 Python
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
房产销售经理职责
2013/12/20 职场文书
教师节活动总结
2014/08/29 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
护士求职自荐信范文
2015/03/04 职场文书
大学生求职自荐信
2015/03/24 职场文书
2016国庆促销广告语
2016/01/28 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
分享几种python 变量合并方法
2022/03/20 Python