原生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 添加/移除CSS类实现代码
Feb 11 Javascript
基于Jquery的温度计动画效果
Jun 18 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
Oct 21 Javascript
禁止你的左键复制实用技巧
Jan 04 Javascript
js中实现多态采用和继承类似的方法
Aug 22 Javascript
javascript实现的一个随机点名功能
Aug 26 Javascript
js+html5实现canvas绘制简单矩形的方法
Jun 05 Javascript
javascript实现方法调用与方法触发小结
Mar 26 Javascript
jQuery中的通配符选择器使用总结
May 30 Javascript
AngularJS入门教程中SQL实例详解
Jul 27 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
Sep 03 Javascript
vue-cli3 取消eslint校验代码的解决办法
Jan 16 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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
PHP文件上传类实例详解
2016/04/08 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
JS 实现完美include载入实现代码
2010/08/05 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
详解angular2.x创建项目入门指令
2018/10/11 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
python中redis的安装和使用
2016/12/04 Python
Python中捕获键盘的方式详解
2019/03/28 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
如何通过命令行进入python
2020/07/06 Python
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
简历中的自我评价怎么写
2014/01/29 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
公司业务员岗位职责
2014/03/18 职场文书
超市优秀员工事迹材料
2014/05/01 职场文书
建筑工地大门标语
2014/06/18 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript