基于jquery的商品展示放大镜


Posted in Javascript onAugust 07, 2010

直接上代码吧(一共也才100来行,小东西)

$(document).ready(function() { 
_el("biggerPic").style.marginLeft = (0 - (getOffsetNumber(_el("biggerPic").style.width) - getOffsetNumber(_el("container").style.width))) + "px"; 
_el("biggerPic").style.marginTop = (0 - (getOffsetNumber(_el("biggerPic").style.height) - getOffsetNumber(_el("container").style.height))) + "px"; 
$("#oriImage").bind('mouseleave', function(event) { 
_el("biggerPic").style.marginLeft = (0 - (getOffsetNumber(_el("biggerPic").style.width) - getOffsetNumber(_el("container").style.width))) + "px"; 
_el("biggerPic").style.marginTop = (0 - (getOffsetNumber(_el("biggerPic").style.height) - getOffsetNumber(_el("container").style.height))) + "px"; 
}); 
$("#oriImage").bind('mouseover', function(event) { 
$("#oriImage").bind('mousemove', function(event) { // 在鼠标移动至操作层以后才LazyBind鼠标移动事件 
var mouseX, mouseY; 
if (navigator.userAgent.indexOf("MSIE 6.0") >= 0) { //在IE6以上各版本下和GOOGLE浏览器下 
mouseY = _offsetY(event, "oriImage"); 
mouseX = _offsetX(event, "oriImage"); 
} else {//在FF浏览器下需要追加像素作为偏移量单位而不能是其他 
mouseY = _offsetY(event, "oriImage"); 
mouseX = _offsetX(event, "oriImage"); 
} 
var playOffsetX = 0 - mouseX / _xPercent(_el("oriImage").style.width, _el("biggerPic").style.width); 
var playOffsetY = 0 - mouseY / _yPercent(_el("oriImage").style.height, _el("biggerPic").style.height); 
//当大图X坐标大于0,也就是到达最左边距时重置为0,当图片的X偏移量已经超出显示的容器时,则重置为其X偏移量为图片与容器之差的负数 
if (playOffsetY < 0 - (getOffsetNumber(_el("biggerPic").style.height) - getOffsetNumber(_el("container").style.height)) - getOffsetNumber(_el("container").style.height) / 2 
&& playOffsetX > 0 - (getOffsetNumber(_el("biggerPic").style.width) - getOffsetNumber(_el("container").style.width))) { 
_el("biggerPic").style.marginLeft = playOffsetX > 0 ? 0 + "px" : 
playOffsetX + getOffsetNumber(_el("container").style.width) / 2 > 0 ? 0 + "px" : playOffsetX + getOffsetNumber(_el("container").style.width) / 2 + "px"; 
return; 
} 
//当大图Y坐标大于0,也就是到达最上边距时重置为0,当图片的Y偏移量已经超出显示的容器时,则重置为其Y偏移量为图片与容器之差的负数 
if (playOffsetX < 0 - (getOffsetNumber(_el("biggerPic").style.width) - getOffsetNumber(_el("container").style.width)) - getOffsetNumber(_el("container").style.width) / 2 
&& playOffsetY > 0 - (getOffsetNumber(_el("biggerPic").style.height) - getOffsetNumber(_el("container").style.height))) { 
_el("biggerPic").style.marginTop = playOffsetY > 0 ? 0 + "px" : 
playOffsetY + getOffsetNumber(_el("container").style.height) / 2 > 0 ? 0 + "px" : playOffsetY + getOffsetNumber(_el("container").style.height) / 2 + "px"; 
return; 
} 
if (playOffsetY >= 0 - (getOffsetNumber(_el("biggerPic").style.height) - getOffsetNumber(_el("container").style.height)) - getOffsetNumber(_el("container").style.height) / 2 
&& playOffsetX >= 0 - (getOffsetNumber(_el("biggerPic").style.width) - getOffsetNumber(_el("container").style.width)) - getOffsetNumber(_el("container").style.width) / 2) { 
//alert(0 - (getOffsetNumber(_el("biggerPic").style.height) - getOffsetNumber(_el("container").style.height)) - getOffsetNumber(_el("container").style.height) / 2); 
_el("biggerPic").style.marginLeft = playOffsetX > 0 ? 0 + "px" : 
playOffsetX + getOffsetNumber(_el("container").style.width) / 2 > 0 ? 0 + "px" : playOffsetX + getOffsetNumber(_el("container").style.width) / 2 + "px"; 
_el("biggerPic").style.marginTop = playOffsetY > 0 ? 0 + "px" : 
playOffsetY + getOffsetNumber(_el("container").style.height) / 2 > 0 ? 0 + "px" : playOffsetY + getOffsetNumber(_el("container").style.height) / 2 + "px"; 
return; 
} 
return; 
}); 
}); 
});

嗯上面就基本上是大体的逻辑了,这里稍微解释一下,

1 大家应该注意到了,还是有很多CSS HACK的地方,现在这个东西是兼容FF3.0,IE 6,
7 ,8 以及chrome的,其他的还没有来得及试验

2 开发当中当放大以后的图片也就是ID为biggerPic的图片在移动到边界的时候要做特殊
处理,左边和上边就很简单了,直接归零,但右边和下边就稍微麻烦一点,需要计算当前
图片相对于容器(也就是ID为container的DIV)的偏移量,这里有一个问题,如果想以一
个固定的值去重新覆盖掉图片距离容器的上边距或右边距的时候,当用户浏览会发现有类
似“跳帧”的现象,原因是因为我用来判断当前图片的偏移量时用到了鼠标相对于操作容
器(也就是ID为“oriImage”的DIV)的距离作为判断的条件,事后发现这种做法不够精
确,而且会造成“跳帧”,遂放弃了这种方案。现在采用的是分别判断鼠标位置的方法,
从而触发不同的逻辑,代码上写的很清楚了。

3 之所以在页面加载完毕以及鼠标离开操作层的时候将大图的位置设置为最右下方,是
因为为了避免第二点中提到的“跳帧”而用的分条件判断,在第一时间用户触发鼠标移动
事件的时候,如果由操作层的右侧或是下侧进入的话,就会有不正确的显示,这估计也是
很多网上直接把放大镜层在加载的时候设置为hidden的原因,我觉得这仍是一个BUG,希
望有大虾指点正确的做法。

4 HTML的写法如下:
下面是操作层以及其中放的小图的写法,CSS没有抽出来,最近很懒
<div id="oriImage" style="cursor:crosshair; background-color: Yellow; overflow:hidden; width: 150px; height: 150px;">
<img id="oriImg" src="3.jpg" style="width:150px;height:150px;" alt="鼠标划过查看细节" /><!--这个图片ID可以任意指定--></div>

下面是效果层以及其中放的大图的写法,CSS没有抽出来,真的很懒
<div id="container" style="position: absolute; top: 200px; left: 450px; width: 250px;height: 250px; z-index: 10; overflow:hidden;">
<img id="biggerPic" src="1.jpg" style="width:1500px;height:1500px;" alt="查看产品细节" /></div>

PS: 各个HTML元素的ID除了操作层中的图片也就是“oriImg”之外,修改的话要修改JS.
放大镜层的样式必须添加一个为“overflow:hidden;”这个本应该做到JS里面去,懒了一下.
好了东西讲完了,现在补充一下,本人刚涉足前端,很多不足,大家多多包涵,
东西虽然拙劣,但好歹是自己敲的,日后有用到的同学可以直接问我要.

Javascript 相关文章推荐
出现“不能执行已释放的Script代码”错误的原因及解决办法
Aug 29 Javascript
ext for eclipse插件安装方法
Apr 27 Javascript
JS提交并解析后台返回的XML的代码
Nov 03 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
May 20 Javascript
AngularJS向后端ASP.NET API控制器上传文件
Feb 03 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
May 10 Javascript
js模态对话框使用方法详解
Feb 16 Javascript
100多个基础常用JS函数和语法集合大全
Feb 16 Javascript
纯JS实现弹性导航条效果
Mar 06 Javascript
详解关于vue-area-linkage走过的坑
Jun 27 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
Oct 16 Javascript
JavaScript实现图片上传并预览并提交ajax
Sep 30 Javascript
jquery autocomplete自动完成插件的的使用方法
Aug 07 #Javascript
jQuery的实现原理的模拟代码 -5 Ajax
Aug 07 #Javascript
javascript new fun的执行过程
Aug 05 #Javascript
过虑特殊字符输入的js代码
Aug 05 #Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
Aug 05 #Javascript
javascript new后的constructor属性
Aug 05 #Javascript
FileUpload上传图片(图片不变形)
Aug 05 #Javascript
You might like
PHP 全角转半角实现代码
2010/05/16 PHP
php权重计算方法代码分享
2014/01/09 PHP
PHP在线书签系统分享
2016/01/04 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
javascript 面向对象编程基础:封装
2009/08/21 Javascript
Ext 今日学习总结
2010/09/19 Javascript
浅说js变量
2011/05/25 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
微信小程序canvas分享海报功能
2019/10/31 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
python代码实现图书管理系统
2020/11/30 Python
django中ImageField的使用详解
2020/12/21 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
HTML5计时器小例子
2013/10/15 HTML / CSS
Shein英国:女性时尚网上商店
2019/04/10 全球购物
金讯Java笔试题目
2013/06/18 面试题
Python里面如何拷贝一个对象
2014/02/17 面试题
工程造价管理专业大专生求职信
2013/10/06 职场文书
护理学中专毕业生求职信
2013/11/11 职场文书
暑假学习心得体会
2014/09/02 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
收银员岗位职责范本
2015/04/07 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
python中Matplotlib绘制直线的实例代码
2021/07/04 Python