原生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 相关文章推荐
DWR Ext 加载数据
Mar 22 Javascript
SWFObject 2.1以上版本语法介绍
Jul 10 Javascript
关于flash遮盖div浮动层的解决方法
Jul 17 Javascript
javascript 拷贝节点cloneNode()使用介绍
Apr 03 Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
jQuery对象的selector属性用法实例
Dec 27 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
Aug 17 Javascript
JavaScript操作select元素和option的实例代码
Jan 29 Javascript
windows下vue-cli导入bootstrap样式
Apr 25 Javascript
在Vue中如何使用Cookie操作实例
Jul 27 Javascript
JS手机端touch事件计算滑动距离的方法示例
Oct 26 Javascript
利用Vue构造器创建Form组件的通用解决方法
Dec 03 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
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
vue router demo详解
2017/10/13 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
Python字典操作简明总结
2015/04/13 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
Python requests库用法实例详解
2018/08/14 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
wxPython实现文本框基础组件
2019/11/18 Python
python右对齐的实例方法
2020/07/05 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
类和结构的区别
2012/08/15 面试题
顺丰快递Java软件工程师面试题
2015/07/31 面试题
啤酒销售实习自我鉴定
2013/09/24 职场文书
励志演讲稿200字
2014/08/21 职场文书
化工实习心得体会
2014/09/09 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
护理工作个人总结
2015/03/03 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
python实现简单的名片管理系统
2021/04/26 Python