原生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中为String对象添加trim,ltrim,rtrim方法
Sep 22 Javascript
基于jQuery实现的水平和垂直居中的div窗口
Aug 08 Javascript
js防止表单重复提交实现代码
Sep 05 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
Jul 28 Javascript
js+css实现select的美化效果
Mar 24 Javascript
Jquery实现$.fn.extend和$.extend函数
Apr 14 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
Oct 10 Javascript
jquery实现图片列表鼠标移入微动
Dec 01 Javascript
JavaScript实现简单的星星评分效果
May 18 Javascript
BootStrap 动态表单效果
Jun 02 Javascript
webpack4 CSS Tree Shaking的使用
Sep 03 Javascript
vue使用节流函数的踩坑实例指南
May 20 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
PHP使用数组实现队列
2012/02/05 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
javascript xml为数据源的下拉框控件
2009/07/07 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
JavaScript函数详解
2014/11/17 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
Python3实现的简单三级菜单功能示例
2019/03/12 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
python单例模式的多种实现方法
2019/07/26 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
毕业生怎样写好自荐信
2013/11/11 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
美食节策划方案
2014/05/26 职场文书
Oracle笔记
2021/04/05 Oracle