Javascript 实现放大镜效果实例详解


Posted in Javascript onDecember 03, 2016

Javascript 实现放大镜效果

今天做任务的时候,有一个任务就是让实现电商网站常用的放大镜效果,类似于这样的放大镜效果效果,之前并没有做过这种放大镜效果,刚开始的思路是对图片进行裁剪,但是后来发现实在是难以实现,于是求助了万能的谷歌,发现一个很好的思路就是,展示区是一小块可视区域,给他一个图片,超出可视区域的部分设为隐藏,有了这个思路,这个效果就能够很好的实现了,先看一下HTML结构!

 

<div id="pic_wrap">
  <div id="float_box"></div>
  <img src="1.jpg">
</div>
<div id="show">
  <img src="1.jpg" id="big_img">
</div>

最外层的两个div,分别是商品原始图片区域,和放大后的可视区域!id为float_box的区域为放大镜所示的区域!第一个img为商品图片,第二个img为预留的放大后的商品!图片CSS代码如下!

img {
      width: 250px;
      height: 150px;
    }
    #pic_wrap {
      position: relative;
      width: 250px;
      height: 150px;
    }
    #float_box {
      width: 100px;
      height: 100px;
      background-color: green;
      filter: opacity(alpha: 30);
      opacity: 0.3;
      position: absolute;
      display: none;
    }
    #big_img {
      background-image: url(1.jpg);
      height: 450px;
      width: 750px;
      background-repeat: no-repeat;
      background-size: cover;
      position: relative;
    }
    #show {    
      width: 300px;
      height: 300px;
      background-color: white;
      opacity: 1;
      filter: opacity(alpha:1);
      overflow: hidden;
      display: none;
    }

HTML和CSS写好之后,就要利用js给放大镜加一些交互效果!

第一步,当鼠标移入的时候,放大镜能够显示出来!需要加onmouseover事件。

第二步,当鼠标没有移除,且鼠标在图片内不停地移动, 需要加onmousemove事件。

第三步,当鼠标完全移除后,需要加onmouseout事件。

第四步,onmouseover事件需要让放大镜和可视窗口显示出来。

第五步,onmousemove事件,让放大镜和可视窗口中的图片同时移动。

第六步,onmouseout时间,让放大镜和可是窗口消失!

完整代码如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
  <style type="text/css">
    /*body {
      margin: 0;
      padding: 0;
    }*/
    img {
      width: 250px;
      height: 150px;
    }
    #pic_wrap {
      position: relative;
      width: 250px;
      height: 150px;
    }
    #float_box {
      width: 100px;
      height: 100px;
      background-color: green;
      filter: opacity(alpha: 30);
      opacity: 0.3;
      position: absolute;
      display: none;
    }
    #big_img {
      background-image: url(1.jpg);
      height: 450px;
      width: 750px;
      background-repeat: no-repeat;
      background-size: cover;
      position: relative;
    }
    #show {    
      width: 300px;
      height: 300px;
      background-color: white;
      opacity: 1;
      filter: opacity(alpha:1);
      overflow: hidden;
      display: none;
    }
  </style>
</head>
<body>
  <div id="pic_wrap">
    <div id="float_box"></div>
    <img src="1.jpg">
  </div>
  <div id="show">
    <img src="1.jpg" id="big_img">
  </div>
<script src="等比放大镜.js"></script>
<script type="text/javascript">  
  var pic_wrap = document.getElementById('pic_wrap'),
    float_box = document.getElementById("float_box"),
    show = document.getElementById('show');
    big_img = document.getElementById("big_img");
  //鼠标移入事件,让放大镜和放大区显示!
  pic_wrap.onmouseover = function() {
    float_box.style.display = "block";
    show.style.display = "block";
  }
  //鼠标不断移动时触发,实时更新放大镜得到的图片
  pic_wrap.onmousemove = function(event) {
    floatMove(float_box, pic_wrap, event);
    showPic();
  }
  //鼠标移出后,放大镜和放大区隐藏
  pic_wrap.onmouseout = function() {
    float_box.style.display = "none";
    show.style.display = "none";
  }  
      //由于offset方法包括边框,在使用的时候很容易出现问题,所以用style来实时获取attr!
  function getStyle(obj, attr) {
    if (window.currentStyle) {
      return parseInt(obj.currentStyle[attr]);
    }
    else {
      return parseInt(getComputedStyle(obj,null)[attr]);
    }
  }
  //运动框架,控制放大镜在原图中的位置!
  function floatMove(argu1, argu2, event) {
    var e = event ||window.event;
    var minLeft = getStyle(argu1, "width");
    var maxLeft = getStyle(argu2, "width") - minLeft/2;
    var minHeight = getStyle(argu1, "height");
    var maxHeight = getStyle(argu2, "height") - minHeight/2;
    console.log(maxLeft);
    console.log(maxLeft - minLeft/2);
    if (e.clientX < minLeft/2) {
      float_box.style.left = "0px";//防止放大镜超出左边框
    }
    else if (e.clientX > maxLeft) {
      float_box.style.left = getStyle(argu2, "width") - getStyle(argu1, "width") + "px";//防止放大镜超出右边框
    }
    else {
      float_box.style.left = event.clientX - minLeft/2 + "px"; //放大镜完全在图片内时正常移动
    }
    if (e.clientY < minHeight/2) {
      float_box.style.top = "0px"; //防止放大镜超出上边框
    }
    else if (e.clientY > maxHeight) {
      float_box.style.top = getStyle(argu2, "height") - getStyle(argu1, "height") + "px"; //防止放大镜超出下边框
    }
    else {
      float_box.style.top = event.clientY - minLeft/2 + "px";
    }
  }
  //用来显示放大镜得到的图片,利用坐标计算!实时更新可视区域
  function showPic() {
    var iCurLeft = getStyle(float_box,"left");
    var iCurTop = getStyle(float_box,"top");
    var a = getStyle(pic_wrap,"width") - getStyle(float_box,"width");
    var b = getStyle(big_img,"width") - getStyle(show,"width");    
    var moveWidth = -(iCurLeft/a)*b;
    big_img.style.left = moveWidth + "px";
    var c = getStyle(pic_wrap,"height") - getStyle(float_box,"height");
    var d = getStyle(big_img,"height") - getStyle(show,"height");
    var moveHigth = -(iCurTop/c)*d;
    big_img.style.top = moveHigth + "px";
  }
</script>
</body>
</html>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
parseInt parseFloat js字符串转换数字
Aug 01 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
Jul 04 Javascript
浅谈angularJS 作用域
Jul 05 Javascript
深入理解关于javascript中apply()和call()方法的区别
Apr 12 Javascript
Node.js进阶之核心模块https入门
May 23 Javascript
jQuery实现表单动态加减、ajax表单提交功能
Jun 08 jQuery
Vue基本使用之对象提供的属性功能
Apr 30 Javascript
Node.js实现一个HTTP服务器的方法示例
May 13 Javascript
javascript面向对象三大特征之多态实例详解
Jul 24 Javascript
微信小程序tabBar 返回tabBar不刷新页面
Jul 25 Javascript
微信小程序实现音乐播放器
Nov 20 Javascript
JavaScript实现图片伪异步上传过程解析
Apr 10 Javascript
bootstrap模态框垂直居中效果
Dec 03 #Javascript
JS制作类似选项卡切换的年历
Dec 03 #Javascript
JS键盘版计算器的制作方法
Dec 03 #Javascript
js实现右键自定义菜单
Dec 03 #Javascript
js实现小窗口拖拽效果
Dec 03 #Javascript
学习vue.js计算属性
Dec 03 #Javascript
学习vue.js中class与style绑定
Dec 03 #Javascript
You might like
PHP获取POST数据的几种方法汇总
2015/03/03 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
详解Python 调用C# dll库最简方法
2019/06/20 Python
Python中的类与类型示例详解
2019/07/10 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
法国购买隐形眼镜和眼镜网站:Optical Center
2019/10/08 全球购物
网络工程师个人的自我评价范文
2013/10/01 职场文书
个人职业生涯规划书1500字
2013/12/31 职场文书
业绩考核岗位职责
2014/02/01 职场文书
初三学习决心书
2014/03/11 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
2014广电局实施党的群众路线教育实践活动方案思想汇报
2014/09/22 职场文书
设备收款委托书范本
2014/10/02 职场文书
安全生产月宣传标语
2014/10/06 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
大国崛起日本观后感
2015/06/02 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers
Jsonp劫持学习
2021/04/01 PHP
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android
JS class语法糖的深入剖析
2022/07/07 Javascript