原生js实现商品放大镜效果


Posted in Javascript onJanuary 12, 2017

实现原理

大图上的放大镜:小图的显示区域=大图片大小:小图片大小=大图片的offsetLeft:小图片的offsetLeft

那么以上的公式中只有大图片的offsetLeft 是未知的,所以大图片的offsetLeft=大图片大小/小图片大小*小图片的offsetLeft

代码中有详细注释

完整代码

注:复制到本地后自行替换图片查看效果

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>demo</title>
<style>
body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0;}
h1,h2,h3,h4,h5,h6{font-size:100%;}
address,cite,dfn,em,var{font-style:normal;}
code,kbd,pre,samp{font-family:courier new,courier,monospace;}
ul,ol{list-style:none;}
a{text-decoration:none;}
a:hover{text-decoration:none;}
sup{vertical-align:text-top;}
sub{vertical-align:text-bottom;}
legend{color:#000;}
fieldset,img{border:0;}
button,input,select,textarea{font-size:100%;}
table{border-collapse:collapse;border-spacing:0;}
.clear{clear: both;float: none;height: 0;overflow: hidden;}
#demo{display:block;width:400px;height:255px;margin:50px;position:relative;border:1px solid#ccc}
#small-box{position:relative;z-index:1}
#float-box{display:none;width:160px;height:120px;position:absolute;background:#ffffcc;border:1px solid#ccc;filter:alpha(opacity=50);opacity:0.5}
#mark{position:absolute;display:block;width:400px;height:255px;background-color:#fff;filter:alpha(opacity=0);opacity:0;z-index:10}
#big-box{display:none;position:absolute;top:0;left:460px;width:400px;height:300px;overflow:hidden;border:1px solid#ccc;z-index:1}
#big-box img{position:absolute;z-index:5}
</style>
</head>
<body>
<div id="demo">
  <div id="small-box">
    <div id="mark"></div>
    <div id="float-box"></div>
    <img src="images/small.jpg"/>
  </div>
  <div id="big-box">
    <img src="images/big.jpg"/>
  </div>
</div>
<script type="text/javascript">
  //在页面加载完后立即执行多个函数方案
  function addloadEvent(func){
    var oldonload=window.onload;
    if(typeof window.onload !="function"){
      window.onload=func;
    }
    else{
      window.onload=function(){
        if(oldonload){
          oldonload(); 
        }
        func();
      }
    }
  }
  //在页面加载完后立即执行多个函数方案结束
  addloadEvent(b);
  function b(){
   //获取外围容器
   var demo=document.getElementById("demo");
   //获取小图片容器
   var s_Box=document.getElementById("small-box");
   //获取大图片容器
   var b_Box=document.getElementById("big-box");
   //获取大图片
   var b_Image=b_Box.getElementsByTagName("img")[0];
   //获取放大镜
   var f_Box=document.getElementById("float-box");
   //覆盖在最上面的盖板为鼠标移动用
   var mark=document.getElementById("mark");
   //移入放大镜和大图片容器显示
   mark.onmouseover=function(){
   f_Box.style.display="block";
   b_Box.style.display="block";
   }
   //移出放大镜和大图片容器隐藏
   mark.onmouseout=function(){
   f_Box.style.display="none";
   b_Box.style.display="none";
   }
   //移动事件
   mark.onmousemove=function(ev){
   //获取鼠标坐标window兼容ie
   var e=ev||window.event;
   //当前鼠标x轴-容器相对body偏移量-小容器相对父容器偏移值-放大镜宽度的一半=放大镜的当前位置
   var left=e.clientX-demo.offsetLeft-s_Box.offsetLeft-f_Box.offsetWidth/2;
   //公式同上
   var top=e.clientY-demo.offsetTop-s_Box.offsetTop-f_Box.offsetHeight/2;
   //判断当放大镜移出容器时在边缘显示
   if(left<0){
    left=0;
   }else if(left>(s_Box.offsetWidth-f_Box.offsetWidth)){
    left=s_Box.offsetWidth-f_Box.offsetWidth;
   }
   if(top<0){
    top=0;
   }else if(top>(s_Box.offsetHeight-f_Box.offsetHeight)){
    top=s_Box.offsetHeight-f_Box.offsetHeight;
   }
   //放大镜当前位置
   f_Box.style.left=left+"px";
   f_Box.style.top=top+"px";
   //获取比例
   var z=b_Image.offsetWidth/s_Box.offsetWidth;
   //用放大镜偏移量*比例=大图片的偏移量,方向相反所以负值
   b_Image.style.left=-left*z+"px";
   b_Image.style.top=-top*z+"px";
   }
  }
</script>
</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js 全兼容可高亮二级缓冲折叠菜单
Jun 04 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
Oct 16 Javascript
JS模拟Dialog弹出浮动框效果代码
Oct 16 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
Jul 10 Javascript
AngularJs 动态加载模块和依赖
Sep 15 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
Dec 26 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
Jun 15 Javascript
js实现扫雷小程序的示例代码
Sep 27 Javascript
nginx配置React静态页面的方法教程
Nov 03 Javascript
详解webpack+express多页站点开发
Dec 22 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
浅谈React中组件逻辑复用的那些事儿
May 21 Javascript
JS 在数组指定位置插入/删除数据的方法
Jan 12 #Javascript
JS图片压缩(pc端和移动端都适用)
Jan 12 #Javascript
原生js实现淘宝购物车功能
Jun 23 #Javascript
jQuery实现拖拽可编辑模块功能代码
Jan 12 #Javascript
jQuery实现倒计时重新发送短信验证码功能示例
Jan 12 #Javascript
js仿京东轮播效果 选项卡套选项卡使用
Jan 12 #Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
Jan 12 #Javascript
You might like
php实现的RSS生成类实例
2015/04/23 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
AutoSave/自动存储功能实现
2007/03/24 Javascript
jQuery的强大选择器小结
2009/12/27 Javascript
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
JavaScript变量的作用域全解析
2015/08/14 Javascript
基于node实现websocket协议
2016/04/25 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
python单线程实现多个定时器示例
2014/03/30 Python
python实现查询IP地址所在地
2015/03/29 Python
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python线程创建和终止实例代码
2018/01/20 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
体育口号大全
2014/06/18 职场文书
捐款活动总结
2014/08/27 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
小学端午节活动总结
2015/02/11 职场文书
管辖权异议上诉状
2015/05/23 职场文书
中学生运动会广播稿
2015/08/19 职场文书
员工给公司的建议书
2019/06/24 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
python实现进度条的多种实现
2021/04/29 Python