每当打开淘宝,天猫等pc端时,看到心仪的物品时,点击图片时,便呈现出放大的效果。在没有去理解分析它的原理时,感觉非常的神奇,当真正地去接触,也是非常好理解。如下图展示所见:

很是常见,在此记载一下,毕竟好记性不如烂笔头。

主要事件:

  • onmouseout
  • onmouseover
  • onmousemove

这种实现也是比较简单的,代码如下所示:

 <!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>放大镜</title>
<style>
* {
margin: 0;
padding: 0
} #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>
<script> //页面加载完毕后执行
window.onload = function () { var objDemo = document.getElementById("demo");
var objSmallBox = document.getElementById("small-box");
var objMark = document.getElementById("mark");
var objFloatBox = document.getElementById("float-box");
var objBigBox = document.getElementById("big-box");
var objBigBoxImage = objBigBox.getElementsByTagName("img")[0]; objMark.onmouseover = function () {
objFloatBox.style.display = "block"
objBigBox.style.display = "block"
} objMark.onmouseout = function () {
objFloatBox.style.display = "none"
objBigBox.style.display = "none"
} objMark.onmousemove = function (ev) { var _event = ev || window.event; //兼容多个浏览器的event参数模式 var left = _event.clientX - objDemo.offsetLeft - objSmallBox.offsetLeft - objFloatBox.offsetWidth / 2;
var top = _event.clientY - objDemo.offsetTop - objSmallBox.offsetTop - objFloatBox.offsetHeight / 2; //设置边界处理,防止移出小图片
if (left < 0) {
left = 0;
} else if (left > (objMark.offsetWidth - objFloatBox.offsetWidth)) {
left = objMark.offsetWidth - objFloatBox.offsetWidth;
} if (top < 0) {
top = 0;
} else if (top > (objMark.offsetHeight - objFloatBox.offsetHeight)) {
top = objMark.offsetHeight - objFloatBox.offsetHeight; } objFloatBox.style.left = left + "px"; //oSmall.offsetLeft的值是相对什么而言
objFloatBox.style.top = top + "px"; //求其比值
var percentX = left / (objMark.offsetWidth - objFloatBox.offsetWidth);
var percentY = top / (objMark.offsetHeight - objFloatBox.offsetHeight); //方向相反,小图片鼠标移动方向与大图片相反,故而是负值
objBigBoxImage.style.left = -percentX * (objBigBoxImage.offsetWidth - objBigBox.offsetWidth) + "px";
objBigBoxImage.style.top = -percentY * (objBigBoxImage.offsetHeight - objBigBox.offsetHeight) + "px";
}
}
</script>
</head>
<body>
<div id="demo">
<div id="small-box">
<div id="mark"></div>
<div id="float-box"></div>
<img src="img/macbook-small.jpg"/>
</div>
<div id="big-box">
<img src="img/macbook-big.jpg"/>
</div>
</div>
</body>
</html>

这里面需要区别的是offsetLeft和style.left:

offsetLeft 获取的是相对于父对象的左边距;left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距;

  • offsetLeft返回的数值,而style.left则返回的是字符串;
  • offsetLeft是只读的,style.left可读写的;
  • style.left的值需要事先定义,否则取到的值为空,而且必须要定义在html里,如果写在样式里面,是取不出它的值的;

这是这个代码的要点之一,另外一个就是去要计算其比例。根据对应比例,进行代码的显示。

另外,小图片和大图片的显示,移动方向是相反的,所以比例前面会乘以一个负号。这个需要注意。

最新文章

  1. postgres创建表的过程以及部分源码分析
  2. BestCoder Round #86
  3. poj 2732 Countdown(East Central North America 2005)
  4. 最近使用JQuery Easyui 碰到的几个奇怪问题
  5. 利用vba将excel中的图片链接直接转换为图片
  6. vsftp 使用匿名帐号登陆
  7. centos6.6 设置静态网络
  8. js单例模式
  9. APP瘦身绝技(快速减少包大小)
  10. Java 面试知识点解析(四)——版本特性篇
  11. Android 异常 android.os.NetworkOnMainThreadException
  12. 简析Window、Activity、DecorView以及ViewRoot之间的错综关系
  13. Mock.js开发中拦截Ajax
  14. 深入剖析php执行原理(2):函数的编译
  15. 一个好的Java时间工具类DateTime
  16. Atitit. 最佳实践 QA----降低cpu占有率--cpu占用太高怎么办
  17. Aws s3 api
  18. tornado 01 路由、输入与输出
  19. Runloop理解
  20. P2215 [HAOI2007]上升序列

热门文章

  1. css3弹性盒子模型——回顾。
  2. Thinkpad W540通过扩展坞连接显示器后蓝屏原因
  3. Git学习之路(6)- 分支操作
  4. SQL Server 2008R2 企业版 百度云下载地址
  5. Ansible 系列之 Ad-Hoc介绍及使用
  6. 局域网里连接mysql服务器,其他人连接自己的mysql服务器
  7. Django之Session
  8. 《深入理解Java虚拟机》学习笔记之工具
  9. 微信小程序之提高应用速度小技巧
  10. 【LeetCode】Binary Tree Level Order Traversal 【BFS】