原生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 相关文章推荐
javascript编程起步(第五课)
Feb 27 Javascript
基于jquery的$.ajax async使用
Oct 19 Javascript
js String对象中常用方法小结(字符串操作)
Jan 27 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
Dec 16 Javascript
JQuery中extend使用介绍
Mar 13 Javascript
JS实现跟随鼠标闪烁转动色块的方法
Feb 26 Javascript
jquery实现垂直和水平菜单导航栏
Aug 27 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
Dec 28 Javascript
vue路由跳转传参数的方法
May 06 Javascript
jquery 时间戳转日期过程详解
Oct 12 jQuery
vuex(vue状态管理)的特殊应用案例分享
Mar 03 Javascript
ES6中的类(Class)示例详解
Dec 09 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
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
php Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
基于header的一些常用指令详解
2013/06/06 PHP
smarty中js的调用方法示例
2014/10/27 PHP
laravel5使用freetds连接sql server的方法
2018/12/07 PHP
js下弹出窗口的变通
2007/04/18 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
python基于twisted框架编写简单聊天室
2018/01/02 Python
Python语言描述随机梯度下降法
2018/01/04 Python
python3爬取各类天气信息
2018/02/24 Python
把pandas转换int型为str型的方法
2019/01/29 Python
Python基本socket通信控制操作示例
2019/01/30 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
销售自我评价
2013/10/22 职场文书
追悼会子女答谢词
2014/01/28 职场文书
优秀班集体申报材料
2014/12/25 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python