原生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 相关文章推荐
“不能执行已释放的Script代码”错误的原因及解决办法
Sep 09 Javascript
Javascript 代码也可以变得优美的实现方法
Jun 22 Javascript
jquery中filter方法用法实例分析
Feb 06 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 Javascript
AngularJS基础 ng-mouseover 指令简单示例
Aug 02 Javascript
极力推荐10个短小实用的JavaScript代码段
Aug 03 Javascript
AngularJS API之copy深拷贝详解及实例
Sep 14 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
Mar 26 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
Aug 23 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
May 13 Javascript
JS如何在不同平台实现多语言方式
Jul 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
PHP 可阅读随机字符串代码
2010/05/26 PHP
献给php初学者(入门学习经验谈)
2010/10/12 PHP
PHP CLI模式下的多进程应用分析
2013/06/03 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
php上传excel表格并获取数据
2017/04/27 PHP
javascript网页关键字高亮代码
2008/07/30 Javascript
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
python实现ip查询示例
2014/03/26 Python
python提取内容关键词的方法
2015/03/16 Python
Python读写文件方法总结
2015/06/09 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
Django为窗体加上防机器人的验证码功能过程解析
2019/08/14 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
python制作微博图片爬取工具
2021/01/16 Python
10张动图学会python循环与递归问题
2021/02/06 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
信用社实习人员自我鉴定
2013/09/20 职场文书
高二生物教学反思
2014/01/27 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书
学生会干部任命书
2015/09/21 职场文书
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技