原生javascript实现图片放大镜效果


Posted in Javascript onJanuary 18, 2017

当我们在电商网站上购买商品时,经常会看到这样一种效果,当我们把鼠标放到我们浏览的商品图片上时,会出现类似放大镜一样的一定区域的放大效果,方便消费者观察商品。今天我对这一技术,进行简单实现,实现图片放大镜效果。
我在代码中进行了代码编写的思路的说明和详细的代码注释,方便读者,请看代码:

<html>
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style type="text/css">
   *{margin:0px; padding:0px;}
   .small-box {
    width:300px;
    height:300px;
    margin-left:100px;
    margin-top:100px;
    border:1px #ccc solid;
    cursor:move;
    float:left;
    position:relative;
   }
   .small-box img {
    width:300px;
    height:300px;
   }
   .tool {
    width:150px;
    height:150px;
    background-color:gold;
    opacity:0.6;
    filter:alpha(opacity=60);
    position:absolute;
    left:0px;
    top:0px;
    display:none;
   }
   .tool.active {
    display:block;
   }
   .big-box {
    width:300px;
    height:300px;
    border:1px #ccc solid;
    overflow:hidden;
    float:left;
    margin-top:100px;
    position:relative;
    display:none;
   }
   .big-box.active {
    display:block;
   }
   .big-box img {
    width:600px;
    height:600px;
    position:absolute;
   }
  </style>
 </head>
 <body>
  <div class="small-box" id="smallBox">
   <img src="img1.jpg"/>
   <div class="tool" id="tool"></div>
  </div>
  <div class="big-box" id="bigBox">
   <img src="img1.jpg" id="bigImg" />
  </div>
  <script>
   /*
    第一步:当页面加载完后,获取所要操作的节点对象。
    第二步:为smallBox添加一个鼠标浮动事件
       当鼠标浮动到smallBox可视区域的时候,显示出小黄盒子tool
       和右边的大盒子(小黄盒子的放大版)bigBox
       添加active

      为smallBox添加一个鼠标离开事件
       隐藏小黄盒子和右边的大盒子
       去掉active

    第三步:为smallBox添加一个鼠标移动事件
      小黄盒子tool要跟着鼠标的坐标移动
      右边的大盒子里的图片也跟着指定的比例移动
   */
   var smallBox = document.getElementById("smallBox");//小盒子
   var tool = document.getElementById("tool");//小盒子中的黄色区域
   var bigBox = document.getElementById("bigBox");//大盒子
   var bigImg = document.getElementById("bigImg");//放大的图片
   //鼠标进入小盒子区域内,显示黄色区域和大盒子
   smallBox.onmouseenter = function(){
    tool.className = "tool active";
    bigBox.className = "big-box active";
   }
   //鼠标离开小盒子区域,不显示黄色区域和大盒子
   smallBox.onmouseleave = function(){
    tool.className = "tool";
    bigBox.className = "big-box";
   }
   //鼠标在小盒子内移动
   smallBox.onmousemove = function(e){
    var _e = window.event||e;//事件对象
    var x = _e.clientX-this.offsetLeft-tool.offsetWidth/2;//事件对象在小盒子内的横向偏移量
    var y = _e.clientY-this.offsetTop-tool.offsetHeight/2;//竖向偏移量
    if(x<0){
     x = 0;//当左偏移出小盒子时,设为0
    }
    if(y<0){
     y = 0;//当上偏移出小盒子时,设为0
    }
    if(x>this.offsetWidth-tool.offsetWidth){
     x = this.offsetWidth-tool.offsetWidth;//当右偏移出小盒子时,设为小盒子的宽度-黄色放大区域宽度
    }
    if(y>this.offsetHeight-tool.offsetHeight){
     y = this.offsetHeight-tool.offsetHeight;//当下偏移出小盒子时,设为小盒子的高度-黄色放大区域高度
    }
    tool.style.left = x + "px";//黄色放大区域距离小盒子左偏距
    tool.style.top = y + "px";//黄色放大区域距离小盒子上偏距
    bigImg.style.left = -x*2 + "px";//放大图片移动方向相反,偏移距离加倍
    bigImg.style.top = -y*2 + "px";
   }
  </script>
 </body>
</html>

这里,我并没有对代码中css样式,JavaScript行为进行和html结构的分离,方便读者阅读和运行。

有读者可能考虑,获取事件对象的偏移距离时直接使用offsetX和offsetY属性,省去了计算,但是笔者在试验时,出现了异常,黄色放大区域并不能稳定的随着鼠标进行移动,笔者认为,当时用offsetX和offsetY时,执行onmousemove会不断地出发onmouseover,而onmouseover会产生事件传播,从而导致在获取offsetX时出现异常。最终,笔者采用上述代码中的方法,能够出现稳定的效果。读者可以自行运行代码,查看效果。这里附上笔者的效果图:

原生javascript实现图片放大镜效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
没有document.getElementByName方法
Aug 19 Javascript
jquery获取tagName再进行判断
May 29 Javascript
再谈JavaScript线程
Jul 10 Javascript
javascript实现在线客服效果
Jul 15 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
May 17 Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 Javascript
angular1.x ui-route传参的三种写法小结
Aug 31 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
Oct 25 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
Jun 12 jQuery
js对象数组和对象的使用实例详解
Aug 27 Javascript
微信小程序自定义底部弹出框功能
Nov 18 Javascript
javascript中Set、Map、WeakSet、WeakMap区别
Dec 24 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
Jan 18 #Javascript
原生js实现回复评论功能
Jan 18 #Javascript
js实现表格筛选功能
Jan 18 #Javascript
js放大镜放大购物图片效果
Jan 18 #Javascript
详解vue 中使用 AJAX获取数据的方法
Jan 18 #Javascript
easyui 中的datagrid跨页勾选问题的实现方法
Jan 18 #Javascript
JavaScript日期对象(Date)基本用法示例
Jan 18 #Javascript
You might like
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
几个php应用技巧
2008/03/27 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
详解Python中的文本处理
2015/04/11 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
python运行时间的几种方法
2016/06/17 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
C#笔试题
2015/07/14 面试题
学生实习推荐信范文
2013/11/26 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
绿里奇迹观后感
2015/06/15 职场文书
优质护理心得体会
2016/01/22 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server