基于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 相关文章推荐
javascript十个最常用的自定义函数(中文版)
Sep 07 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
Sep 09 Javascript
JavaScript及jquey实现多个数组的合并操作
Sep 06 Javascript
Javascript与jQuery方法的隐藏与显示
Jan 19 Javascript
浅谈轻量级js模板引擎simplite
Feb 13 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
Feb 17 Javascript
javascript 中iframe高度自适应(同域)实例详解
May 16 Javascript
深入理解React中何时使用箭头函数
Aug 23 Javascript
详解vue-cli3多页应用改造
Jun 04 Javascript
layui-table对返回的数据进行转变显示的实例
Sep 04 Javascript
VUE+Element实现增删改查的示例源码
Nov 23 Vue.js
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
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
react实现同页面三级跳转路由布局
2019/09/26 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
python获取一组汉字拼音首字母的方法
2015/07/01 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
Python变量和字符串详解
2017/04/29 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
python实现飞机大战微信小游戏
2020/03/21 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
查看keras的默认backend实现方式
2020/06/19 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
高中考试作弊检讨书
2014/01/14 职场文书
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
趣味运动会开幕词
2015/01/28 职场文书