基于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 相关文章推荐
网上应用的一个不错common.js脚本
Aug 08 Javascript
asp.net下利用js实现返回上一页的实现方法小集
Nov 24 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
Nov 07 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
Apr 15 Javascript
jquery ajax方式直接提交整个表单核心代码
Aug 15 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
Jun 30 Javascript
JavaScript中document对象使用详解
Jan 06 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
Aug 20 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
Jan 02 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 Javascript
vue操作dom元素的3种方法示例
Sep 20 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/03/21 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
Javascript实现动态时钟效果
2018/11/17 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
Python命名空间详解
2014/08/18 Python
Python之web模板应用
2017/12/26 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
python去除文件中重复的行实例
2018/06/29 Python
Python 变量类型详解
2018/10/10 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
护士自荐信怎么写
2013/10/18 职场文书
中学生打架检讨书
2014/02/10 职场文书
资助贫困学生倡议书
2014/05/16 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
七一建党节慰问信
2015/02/14 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
安全生产奖惩制度
2015/08/06 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis