原生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 相关文章推荐
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
Aug 27 Javascript
AngularJS向后端ASP.NET API控制器上传文件
Feb 03 Javascript
Jquery实现上下移动和排序代码
Oct 17 Javascript
详解本地Node.js服务器作为api服务器的解决办法
Feb 28 Javascript
js实现下拉菜单效果
Mar 01 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
Mar 12 Javascript
jQuery实现模糊查询的方法分析
May 10 jQuery
AngularJs1.x自定义指令独立作用域的函数传入参数方法
Oct 09 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
Feb 22 Javascript
基于js判断浏览器是否支持webGL
Apr 18 Javascript
浅谈JavaScript中this的指向问题
Jul 28 Javascript
vant组件中 dialog的确认按钮的回调事件操作
Nov 04 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
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
php 可变函数使用小结
2018/06/12 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
2010年最佳jQuery插件整理
2010/12/06 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
2016/11/12 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
在Django框架中编写Contact表单的教程
2015/07/17 Python
Python 常用的安装Module方式汇总
2017/05/06 Python
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
Python之修改图片像素值的方法
2019/07/03 Python
python tkinter基本属性详解
2019/09/16 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
工业学校毕业生自荐信范文
2014/01/03 职场文书
金融管理专业求职信
2014/07/10 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
python元组打包和解包过程详解
2021/08/02 Python