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 相关文章推荐
Jquery index()方法 获取相应元素索引值
Oct 12 Javascript
jQuery中slideUp 和 slideDown 的点击事件
Feb 26 Javascript
js实现Select列表各项上移和下移的方法
Aug 14 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
Jan 08 Javascript
JavaScript jquery及AJAX小结
Jan 24 Javascript
JavaScript实战之带收放动画效果的导航菜单
Aug 16 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
Mar 29 Javascript
基于js中的存储键值对以及注意事项介绍
Mar 30 Javascript
vuejs 动态添加input框的实例讲解
Aug 24 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
Oct 23 Javascript
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
一道JS算法面试题——冒泡、选择排序
Apr 21 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的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
php实现rc4加密算法代码
2012/04/25 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
运动检测ViBe算法python实现代码
2018/01/09 Python
python文本数据相似度的度量
2018/03/12 Python
python 公共方法汇总解析
2019/09/16 Python
python匿名函数的使用方法解析
2019/10/10 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
物业管理毕业生个人的求职信
2013/11/30 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
离婚财产分割协议书
2015/08/11 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
vue自定义右键菜单之全局实现
2022/04/09 Vue.js
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers