文章目录

  • 案例描述
  • 案例图示
  • HTML
  • CSS样式
  • JS代码
    • JS分解代码----小图点击事件
    • JS分解代码----鼠标进入和移出
    • JS分解代码----鼠标的移动
    • JS分解代码----碰撞事件,放大镜的移动
    • JS分解代码----超大图的位置改变
    • JS全部代码展示

案例描述

在浏览器的左边有一张大图,下面有两张小图,点击任何一张小图会在大图的位置显示这张小图的画面。进入大图,鼠标所指之处有一个透明的黄色区域,而在大图的右边(以下称超大图)会放大这一区域

案例图示

HTML

<body><div id="box"><div id="small"><img src="./program1/images/1.jpg" ><span id="mask"></span></div><div id="big"><img src="./program1/images/1.jpg" ></div></div><div id="list"><ul><li><img src="./program1/images/1.jpg" width="100px"></li><li><img src="./program1/images/2.jpg" width="100px"></li></ul></div>
</body>

CSS样式

详解请看注释

<style>* {padding: 0;margin: 0;box-sizing: border-box;list-style: none;border: none;}#box {width: 250px;height: 160px;margin-left: 100px;margin-top: 100px;position: relative;}#small {width: 100%;height: 100%;border: 1px solid #ccc; /* 放大镜操作 */position: relative;       }#small img{width: 100%;height: 100%;padding: 2px;}/* 显微镜 */#mask {width: 50px;height: 50px;/* 透明图 */background-color:rgba(255, 255, 0,.4);position: absolute;left: 0;top: 0;cursor: move;/* 隐藏 */display: none;}#big {width: 400px;height: 255px;border: 1px solid #ccc;/* 为以后大图位置改变作准备 */position: absolute;/* 250 + 10 margin */left: 260px;     top: 0;/* 图片超出部分隐藏 */overflow: hidden;/* 整个大图开始是隐藏的 */display: none;}#big img {width: 700px;padding: 2px;position: absolute;left: 0;top: 0;margin: 0 auto;background-color: red;}#list {margin-top: 5px;margin-left: 100px;}#list li {float: left;margin-right: 5px;cursor: pointer;}
</style>

JS代码

JS分解代码----小图点击事件

(1)首先设置一个value属性用于改变small_img中的图片src,value的值为其下标+1
(2)监听li中的点击事件时,要改变small_img(大图)中的图片展示和big_img(超大图)中的图片展示

 for (let i = 0; i < allLi.length; i++) {var li = allLi[i];//设置一个value属性用于改变small_img中的图片srcli.setAttribute('value',i+1);//监听li中的点击事件li.addEventListener('click',function(){//改变small_img中的图片展示small_img.setAttribute('src',"./program1/images/" + this.getAttribute('value') +".jpg");//改变big_img中的图片展示big_img.setAttribute('src',"./program1/images/" + this.getAttribute('value') +".jpg");});}

JS分解代码----鼠标进入和移出

鼠标进入和移出都要改变放大镜和超大图的display属性。
进入时display属性值为*“block”*
移出时display属性值为*“none”*

//监听鼠标进入boxbox.addEventListener('mouseover',function() { //放大镜显示mask.style.display = 'block';//big图片显示big.style.display = 'block';       });//监听鼠标移出boxbox.addEventListener('mouseout',function(){//放大镜隐藏mask.style.display = 'none';//big图片隐藏big.style.display = 'none';})});

JS分解代码----鼠标的移动

在鼠标进入事件中监听鼠标的移动
这里运用到事件对象和offset家族的知识
可以参考:
事件对象
offset家族
注意事项看注释

 //监听鼠标的移动
small.addEventListener('mousemove',function(event){//事件对象
var e = event || window.event;
//获取鼠标的位置  鼠标显示在mask中间:减去自身宽高度的一半
//最好用pageX、pageY,不要用clientX、clientY 防止有分页时出错var small_x = event.pageX - box.offsetLeft - mask.offsetWidth*0.5;
var small_y= event.pageY - box.offsetTop - mask.offsetHeight*0.5;

JS分解代码----碰撞事件,放大镜的移动

写完上述代码,你会发现放大镜也能去到大图以外的区域,这不是我们所期望的,这里就需要用到碰撞事件了
这里还是用到了offset家族的知识
这里用到的思维是用if判断条件限制上下左右的边界
放大镜的移动就是改变它的top和left值(因为它相对父元素绝对定位)
不理解offset,请参考:offset家族
注意事项看注释


//放大镜碰撞    //相对于box  因为box有定位
if(small_x <= 0)small_x = 0;
else if( small_x >= box.offsetWidth-mask.offsetWidth)small_x = box.offsetWidth-mask.offsetWidth - 2;   //除去边框
if(small_y <= 0)small_y = 0;
else if( small_y >= box.offsetHeight-mask.offsetHeight)small_y = box.offsetHeight-mask.offsetHeight - 2;//放大镜跟着鼠标的位置
mask.style.left = small_x + 'px';
mask.style.top = small_y + 'px';

JS分解代码----超大图的位置改变

big_img.style.leftbig_img.style.top为负值(你可以试试去掉负号是什么样的效果)
这里的重点是这个公式

 //big_img中的位置相应改变
//公式:small_x/big_x = small_width/big_img_widthbig_img.style.left = - (event.pageX - box.offsetLeft) /(small.offsetWidth / big.offsetWidth) + 'px';
big_img.style.top = -( event.pageY - box.offsetTop)/( small.offsetHeight / big.offsetHeight) + 'px';

JS全部代码展示

<script>window.addEventListener ('load',function(){//获取元素var small = $('small');var big = $('big');   var mask = $('mask');var allLi = document.getElementsByTagName('li');var small_img = small.children[0];var big_img = big.children[0];//遍历每一个li中的点击事件for (let i = 0; i < allLi.length; i++) {var li = allLi[i];//设置一个value属性用于改变small_img中的图片srcli.setAttribute('value',i+1);//监听li中的点击事件li.addEventListener('click',function(){//改变small_img中的图片展示small_img.setAttribute('src',"./program1/images/" + this.getAttribute('value') +".jpg");//改变big_img中的图片展示big_img.setAttribute('src',"./program1/images/" + this.getAttribute('value') +".jpg");});}//监听鼠标进入boxbox.addEventListener('mouseover',function() { //放大镜显示mask.style.display = 'block';//big图片显示big.style.display = 'block';//监听鼠标的移动small.addEventListener('mousemove',function(event){//事件对象var e = event || window.event;//获取鼠标的位置  鼠标显示在mask中间:减去自身宽高度的一半//最好用pageX、pageY,不要用clientX、clientY 防止有分页时出错var small_x = event.pageX - box.offsetLeft - mask.offsetWidth*0.5;var small_y= event.pageY - box.offsetTop - mask.offsetHeight*0.5;//放大镜碰撞    // console.log(mask.offsetLeft) ;//相对于box  因为boxx有定位if(small_x <= 0)small_x = 0;else if( small_x >= box.offsetWidth-mask.offsetWidth)small_x = box.offsetWidth-mask.offsetWidth - 2;   //除去边框if(small_y <= 0)small_y = 0;else if( small_y >= box.offsetHeight-mask.offsetHeight)small_y = box.offsetHeight-mask.offsetHeight - 2;//放大镜跟着鼠标的位置 mask.style.left = small_x + 'px';mask.style.top = small_y + 'px';//big_img中的位置相应改变//公式:small_x/big_x = small_width/big_img_widthbig_img.style.left = - (event.pageX - box.offsetLeft) /(small.offsetWidth / big.offsetWidth) + 'px';big_img.style.top = -( event.pageY - box.offsetTop)/( small.offsetHeight / big.offsetHeight) + 'px';});});//监听鼠标移出boxbox.addEventListener('mouseout',function(){//放大镜隐藏mask.style.display = 'none';//big图片隐藏big.style.display = 'none';})});//封装function $(id) {return typeof id === 'string'? document.getElementById(id):null;}
</script>

用JS逐步分解实现放大镜(看完就有收获)相关推荐

  1. js事件大全,看完我也就醉了

    事件源对象 捕获释放 event.srcElement.setCapture();   event.srcElement.releaseCapture(); 事件按键 event.keyCode  e ...

  2. List再整理,从代码底层全面解析List(看完后保证收获满满)

    前言 本文为对List集合的再一次整理,从父集接口Collection到顶级接口Iterable再到线程不安全实现类:ArrayList.LinkedList,再到线程安全实现类:Vector(被弃用 ...

  3. 14年的面试官经验分享,看完必有收获

    面试,是找到好工作的过程中,最最重要的一环. 在我14年的职业生涯中,亲自面试的人应该不下1000人了. 看过的简历还要更多,尤其是微软上海早期扩张的时候. 所以今天,我就从自身经历出发,给你分享一些 ...

  4. mongodb jar包_MongoDB是什么?看完你就知道了!

    Java社区回复[520社区],领取资源500G惊喜 来源:http://suo.im/5e8a94 一.概述 1.MongoDB是什么?用一句话总结 MongoDB是一款为web应用程序和互联网基础 ...

  5. 【算法入门】用Python手写五大经典排序算法,看完这篇终于懂了!

    算法作为程序员的必修课,是每位程序员必须掌握的基础.作为Python忠实爱好者,本篇将通过Python来手撕5大经典排序算法,结合例图剖析内部实现逻辑,对比每种算法各自的优缺点和应用点.相信我,耐心看 ...

  6. python tab和空格混用_Python编程常见十大错误,看完你自己都笑了!

    关注并置顶[柠檬班]的小哥哥小姐姐 胸有成"猪" 使用python会出现各种各样的错误,以下是Python常见的错误以及解决方法.  01 ValueError ValueErro ...

  7. 用Python手写五大经典排序算法,看完这篇终于懂了!

    算法作为程序员的必修课,是每位程序员必须掌握的基础.作为Python忠实爱好者,本篇东哥将通过Python来手撕5大经典排序算法,结合例图剖析内部实现逻辑,对比每种算法各自的优缺点和应用点.相信我,耐 ...

  8. 你不知道的js中关于this绑定机制的解析[看完还不懂算我输]

    前言 最近正在看<你不知道的JavaScript>,里面关于this绑定机制的部分讲的特别好,很清晰,这部分对我们js的使用也是相当关键的,并且这也是一个面试的高频考点,所以整理一篇文章分 ...

  9. js 等待某个函数执行完_JS 函数的执行时机

    JS函数在不同的时候运行,会有不同的运行结果,本文将分别举例分析 案例一 let a = 1 function fn(){ console.log(a) } 注意:这里不会打印任何东西,因为函数只是声 ...

  10. 手把手教你完成CSDN对接百度统计 看完这篇文章你还不会对接 欢迎您提刀顺着网线来砍我!!!!

    大家好,我是:じ☆ve朽木,开发经验都是一步一步慢慢积累的,没有谁生来就具有的,只要我们付出了努力,肯定就会有收获!进入我的博客,带你了解Java知识,js小技巧,带你玩转高端物联网.博客地址为:じ☆ ...

最新文章

  1. 人机猜拳(这是最近的一个总结)
  2. 后台提示云提醒未激活 点击激活删除方法
  3. RSA体系 c++/java相互进行加签验签--转
  4. 多线程:同步和异步的优缺点比较
  5. mysql查询索引数组_mysql-索引
  6. WebSocket轻松单台服务器5w并发jmeter实测
  7. 有哪些类目适合刚创业的新手淘宝卖家做?
  8. 2018上海大学生网络安全赛 misc 92 wp
  9. 项目交付:把Python项目打包成exe文件供客户使用然后收钱
  10. 第5章分布式系统模式 Broker(代理程序)
  11. win7系统补丁安装流程
  12. Python-Curses模块
  13. Python开发微信公众号
  14. [TcaplusDB] 行业新闻汇编(6月29日)
  15. linux服务器网卡极限速率,linux下简单限制网卡速度
  16. windows系统统不支持mysql_Windows系统下MySQL无法启动的万能解决方法
  17. java 按英文名排序_输入5种水果的英文名称,用java编写一个程序,输出这些水果名称按照字典出现的先后循序输出?...
  18. 葡萄城报表介绍:自由报表
  19. PWM 实现调光——测试pwn的功能
  20. 为什么进程切换比线程切换耗费资源?

热门文章

  1. Vacuum tube 真空管/电子管
  2. 力叩经典题--俩数之和
  3. css 面包屑 30个字节,css3面包屑设计
  4. 单个html页面面包屑,充分利用网页设计中的面包屑
  5. 中国古代传说中的四大神兽
  6. 阿里云上云迁移工具案例实践:腾讯云迁移到阿里云
  7. Snipast截图软件
  8. vue-router升级3.0.0以上版本导致Uncaught(in promise) navigation guard报错问题
  9. Flash:动画实例--球体弹跳
  10. Activemq优点和缺点