js实现图片局部放大效果详解
时间:2019-03-18
这篇文章主要介绍了js实现图片局部放大效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
图片局部放大效果结合的知识点主要是DOM的操作,以及事件的应用,所以首先要对DOM的操作有一定了解,其次能对事件的应用有一定的累积。
如上图,可以看到,这是放大镜的基本效果,主要分成左右两个部分。左边分成一张大图,和一个导航栏,在右边则是一个放大镜放大后的图片。因此,我在画页面的时候,大体的HTMl结构如下:
<body> <div class="choose"> <div class="content"> <img src="images/small1.jpg" id = "small"> <div class="shadow"></div> </div> <ul id = "listshow"> <li class="selected"> <img src="images/small1.jpg" data-img = "images/big1.jpg" alt=""> </li> <li> <img src="images/small2.jpg" data-img = "images/big2.jpg" alt=""> </li> <li> <img src="images/small3.jpg" data-img = "images/big3.jpg" alt=""> </li> <li> <img src="images/small4.jpg" data-img = "images/big4.jpg" alt=""> </li> </ul> </div> <div class="larger"> <img src="images/big1.jpg" id = "big"> </div> </body>
在这个时候,将静态页面按常规方式进行布局,给予css样式如下:
<style> *{ padding: 0; margin: 0; list-style: none; } .choose{ width: 400px; height: 600px; float: left; margin:50px 0 0 50px; } .content{ width: 400px; height: 400px; position: relative; } .content img { width: 400px; height: 400px; } #listshow{ width: 400px; height: 100px; margin-top: 20px; } #listshow li{ width: 98px; height: 100px; float: left; border:1px solid #666; } #listshow li img{ width: 98px; height: 100px; } #listshow .selected{ border-color: brown; } .larger{ width: 400px; height: 400px; position: absolute; top: 50px; left: 500px; float: left; overflow: hidden; display: none; } #big{ width: 800px; height: 800px; position: absolute; left: 0; top: 0; } .shadow{ width: 200px; height: 200px; background-color: rgba(145,200,200,.4); position: absolute; left: 0; top: 0; z-index: 10; display: none; } </style>
那么这个时候,开始写js样式,分布书写的话,第一步要考虑到左边的选项卡。选项卡我采用直接使用src赋值的方法,将滑过的图片对应的src给大图,代码呈现:
for(var i = 0;i<showli.length;i++){ var showitem = showli[i]; showitem.onmouseover =showitem.onclick = function(e){ let evt = window.event||e; for(var j =0;j<showli.length;j++){ showli[j].className = ""; } var showimg = this.getElementsByTagName("img")[0]; var imgsrc = showimg.src; small.src = imgsrc; var bigsrc = showimg.getAttribute("data-img"); big.src = bigsrc; this.className = "selected"; } }
这样就可以成功实现选项卡功能,比较简单粗暴的一种方式,当然,大家使用selected结合点击下标和大图下标相等的这一点,也一样可以做出来。
接下来要考虑到,鼠标在大图上移动时,遮罩层的移动效果。值得一提的时候,这个地方其实存在一个视觉上的误区,看起来是在滑动遮罩层,其实是鼠标的滑动,而遮罩层通过获取鼠标的clientX,clientY来确定自己的位置,遮罩层位置获取代码:
content.onmousemove = function (e) { var evt = window.event||e; larger.style.display = "block"; shadow.style.display = "block"; var clientX = evt.clientX; var clientY = evt.clientY; var scrollLeft = document.documentElement.scrollLeft||document.body.scrollLeft; var scrollTop = document.documentElement.scrollTop||document.body.scrollTop; var X = clientX+scrollLeft-chooseMarginL-shadowW/2; var Y = clientY+scrollTop-chooseMarginT-shadowH/2; if(X<=0){ X = 0; } if(X>=maxX){ X = maxX; } if(Y<=0){ Y = 0; } if(Y>=maxY){ Y = maxY; } // 防止遮罩层粘滞,跟随鼠标一起滑出大图位置 var bigX = X*bigW/contentW; var bigY = Y*bigH/contentH; // bigX / bigW = X / contentW,主图和遮罩层之间存在两倍关系,放大图和原图之间也有两倍关系 shadow.style.left = X+"px"; shadow.style.top = Y+"px"; big.style.left = -bigX+"px"; big.style.top = -bigY+"px"; }
在这里,计算较多,尤其要注意遮罩层阴影,主图以及放大图之间的倍数关系。
到这里,基本功能就实现了,这里面涉及的计算可以适当配图理解,尤其注意点击位置的获取。
以上所述是小编给大家介绍的js实现图片局部放大效果详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python GUI项目实战(七)学生信息的修改、删除和保存
- Python | 使用argparse解析命令行参数
- LeetCode 98 | 判断二叉搜索树是否合法
- LeetCode 96,n个数构建BST的方法有多少种?
- Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作
- 每日一题 | 二进制操作问题
- Pandas | Dataframe的merge操作,像数据库一样尽情join
- 每日一题 | 灾后重建问题
- 树形结构已知子节点找父节点
- 解析 hashMap 源码之基本操作 get
- RCE(远程命令/代码执行漏洞)原理及复现
- 我的Vue不小心跨域了o(╥﹏╥)o 干它
- 金九银十准备季——Java后端多线程&并发面试题及答案(二)
- TypeScript 设计模式之观察者模式
- pytest文档46-关于https请求警告问题