原生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 相关文章推荐
摘自百度的图片轮换效果代码
Nov 19 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
Jun 20 Javascript
javascript常用的正则表达式实例
May 15 Javascript
详谈JavaScript内存泄漏
Nov 14 Javascript
理解和运用JavaScript的闭包机制
Aug 13 Javascript
jquery Easyui快速开发总结
Aug 20 Javascript
Vue.js动态添加、删除选题的实例代码
Sep 30 Javascript
vue iview组件表格 render函数的使用方法详解
Mar 15 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
Jul 17 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
May 29 Javascript
vue祖孙组件之间的数据传递案例
Dec 07 Vue.js
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
怎么在Windows系统中搭建php环境
2013/08/31 PHP
PHP中array_map与array_column之间的关系分析
2014/08/19 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
jQuery事件对象总结
2016/10/17 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
Python递归函数实例讲解
2019/02/27 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
2019/08/09 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
2020/02/17 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
优秀教师事迹简介
2014/02/02 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
个性婚礼策划方案
2014/05/17 职场文书
优秀党支部申报材料
2014/12/24 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
孟佩杰观后感
2015/06/17 职场文书
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL