原生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与其它库冲突的解决方法
Jun 25 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
Jul 08 Javascript
js如何判断用户是在PC端和还是移动端访问
Apr 24 Javascript
jQuery实现点击查看大图并以弹框的形式居中
Aug 08 Javascript
jQuery实现的自适应焦点图效果完整实例
Aug 24 Javascript
Bootstrap源码解读下拉菜单(4)
Dec 23 Javascript
基于vue2的table分页组件实现方法
Mar 20 Javascript
vue父组件点击触发子组件事件的实例讲解
Feb 08 Javascript
webpack4 SCSS提取和懒加载的示例
Sep 03 Javascript
vue-cli中使用高德地图的方法示例
Mar 28 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 Javascript
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
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
10条PHP编程习惯助你找工作
2008/09/29 PHP
PHP基础知识回顾
2012/08/16 PHP
ThinkPHP之getField详解
2014/06/20 PHP
php判断邮箱地址是否存在的方法
2016/02/13 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
smartupload实现文件上传时获取表单数据(推荐)
2016/12/12 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
Python 实现链表实例代码
2017/04/07 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
django使用xadmin的全局配置详解
2019/11/15 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
纪念建党演讲稿范文
2014/01/13 职场文书
七一表彰活动方案
2014/01/18 职场文书
法学函授自我鉴定
2014/02/06 职场文书
公司司机岗位职责范本
2014/03/03 职场文书
银行求职自荐信
2014/06/30 职场文书
调解书格式范本
2015/05/20 职场文书
JS中如何优雅的使用async await详解
2021/10/05 Javascript
Python中npy和mat文件的保存与读取
2022/04/24 Python