原生javascript实现图片放大镜效果

 更新时间:2017年01月18日 13:55:49   作者:依然仰望  
这篇文章主要为大家详细介绍了原生javascript实现图片放大镜效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

当我们在电商网站上购买商品时,经常会看到这样一种效果,当我们把鼠标放到我们浏览的商品图片上时,会出现类似放大镜一样的一定区域的放大效果,方便消费者观察商品。今天我对这一技术,进行简单实现,实现图片放大镜效果。
我在代码中进行了代码编写的思路的说明和详细的代码注释,方便读者,请看代码:

<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时出现异常。最终,笔者采用上述代码中的方法,能够出现稳定的效果。读者可以自行运行代码,查看效果。这里附上笔者的效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Bootstrap 3.x打印预览背景色与文字显示异常的解决

    Bootstrap 3.x打印预览背景色与文字显示异常的解决

    前几天同事有个问题咨询我,他在调用print()来打印页面,发现打印预览页面上的背景色无法显示以及文字总是显示为黑色,感觉非常奇怪,我通过测试发现是Bootstrap的问题,现在将解决的方法分享给大家,希望可以帮助到同样遇到这个问题的朋友们,下面来一起看看。
    2016-11-11
  • Avalonjs双向数据绑定与监听的实例代码

    Avalonjs双向数据绑定与监听的实例代码

    本文通过实例代码给大家介绍了Avalonjs双向数据绑定与监听的实现代码,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-06-06
  • JavaScript正则表达式匹配 div  style标签

    JavaScript正则表达式匹配 div style标签

    这篇文章主要介绍了JavaScript正则表达式匹配<div><style>标签 的相关资料,需要的朋友可以参考下
    2016-03-03
  • 浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题

    浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题

    下面小编就为大家带来一篇浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Javascript的异步函数和Promise对象你了解吗

    Javascript的异步函数和Promise对象你了解吗

    这篇文章主要为大家详细介绍了Javascript异步函数和Promise对象,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • JavaScript判断表单为空及获取焦点的方法

    JavaScript判断表单为空及获取焦点的方法

    这篇文章主要介绍了JavaScript判断表单为空及获取焦点的方法,可实现表单提交时判断表单是否为空及获取响应焦点的功能,非常简单实用,需要的朋友可以参考下
    2016-02-02
  • 解析javascript 实用函数的使用详解

    解析javascript 实用函数的使用详解

    本篇文章对javascript中的一些实用函数进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • JavaScript状态模式及适配器模式使用讲解

    JavaScript状态模式及适配器模式使用讲解

    这篇文章主要介绍了理解JavaScript中的状态模式及适配器模式,适配器模式即Adapter Pattern,是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,下文更多相关介绍需要的小伙伴可以参考一下
    2022-12-12
  • 微信小程序云函数添加数据到数据库的方法

    微信小程序云函数添加数据到数据库的方法

    这篇文章主要介绍了微信小程序云函数添加数据到数据库的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • uni-app中renderjs使用的方式浅析

    uni-app中renderjs使用的方式浅析

    renderjs是一个运行在视图层的js,它只支持app-vue和h5,下面这篇文章主要给大家介绍了关于uni-app中renderjs使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论