jQuery chili图片远处放大插件


Posted in Javascript onNovember 30, 2009

为了让本地图片、远程图片、过小的图片都适应此插件,有很多细节问题要处理。

首先定义结构:
<div class="imgMagnifierWrap"> 
<div class="overlay"><!--覆盖层,鼠标的感应区域,位于小图上最方--></div> 
<div class="tipboxHover"><!--小图上方的悬停提示方框--></div> 
<div class="imgOriginal"><!--装载大图的容器,绝对定位<img src="bigOne.jpg" /><!--前景大图,绝对定位--></div> 
</div>
<!--样式--> 
<style type="text/css"> 
.imgMagnifierWrap *{position:absolute;background:#fff;} 
.imgMagnifierWrap .tipboxHover{width:80px; height:60px; filter:alpha(opacity=30);opacity:.3;display:none;} 
.imgMagnifierWrap .imgOriginal{display:none;z-index:9999;overflow:hidden; width:400px; height:400px; 
    background-color:#cdf; background-repeat:no-repeat; text-align:center;border:1px solid #555; } 
.imgMagnifierWrap .overlay{cursor:crosshair;filter:alpha(opacity=0);opacity:0;} 
<style>
然后考虑图片预加载:
$.imgPreloader=function(url,eventLists){ 
var img=new Image(); 
var $img=$(img); 
img.src=url; 
$.each(eventLists,function(type,fn){ 
$img.bind(type,fn); 
}); 
$img.trigger(img.complete?'load':'begin'); 
return $img; 
};
再计算感应区域:
小图所处感应区域四边各减去指示方框各四边的1/2大小的矩形,在此之外的区域则显示到大图边界:
var borderLeft =thumbInfo.left+tipboxInfo.width/2; 
var ratioX=(mouseInfo.x-borderLeft)/(thumbInfo.width-tipboxInfo.width);
用大图用做背景图片引发的问题:
用隐藏的前景图片预加载,load事件判断时机,ie,chrome正常,ff请求了两次图片,图片未缓存;
换一种方式,不预载大图。改成直接在大图位置用覆盖层做“loading”后,chrome下表现为渐进加载图片,非chrome是直接显示,略有遗憾。
最终结果,把大图用做前景图片:
优势在于,大图的load和error事件都可以正常工作:
$.imgPreloader($anchor.attr('href'),{ 
load:function(){ 
isImageReady=true; 
$o.empty().append(this); 
setTimeout(autoFitPicture,0); 
}, 
begin:function(){ 
$o.text('loading...'); 
}, 
error:function(){ 
isImageReady=true; 
$o.text('invalid picture!'); 
} 
});

大图预载的load事件和小图mousemove事件不同步的解决办法:实时存储鼠标坐标,把提示方框定位和大图定位的方法分离。

//鼠标位置存储 
var mouseInfo={x:0,y:0}; 
//指示框定位 
var setTipboxPosition=function(e){ 
mouseInfo.x=e.pageX; 
mouseInfo.y=e.pageY; 
$tipbox.css({ 
top:mouseInfo.y<thumbInfo.width/2+thumbInfo.top 
?Math.max(mouseInfo.y-tipboxInfo.height/2,thumbInfo.top) 
:Math.min(mouseInfo.y-tipboxInfo.height/2,thumbInfo.top+thumbInfo.height-tipboxInfo.height), 
left:mouseInfo.x<thumbInfo.width/2+thumbInfo.left 
?Math.max(mouseInfo.x-tipboxInfo.width/2,thumbInfo.left) 
:Math.min(mouseInfo.x-tipboxInfo.width/2,thumbInfo.left+thumbInfo.width-tipboxInfo.width) 
});   
setImgPosition(); 
};

随便一提,如果有一种浏览器,也许会很幸运。
演示代码
打包下载 https://3water.com/jiaoben/22866.html

Javascript 相关文章推荐
js实现DIV的一些简单控制
Jun 04 Javascript
传智播客学习之java 反射
Nov 22 Javascript
Jquery实现无刷新DropDownList联动实现代码
Mar 08 Javascript
javascript 得到文件后缀名的思路及实现
May 09 Javascript
复选框全选与全不选操作实现思路
Aug 18 Javascript
jQuery插件开发的五种形态小结
Mar 04 Javascript
JS原型链 详解及示例代码
Sep 06 Javascript
Bootstrap整体框架之CSS12栅格系统
Dec 15 Javascript
JavaScript设置名字输入不合法的实现方法
May 23 Javascript
Vuejs 页面的区域化与组件封装的实现
Sep 11 Javascript
通过实例解析vuejs如何实现调试代码
Jul 16 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
Nov 30 #Javascript
javascript 设置某DIV区域内的checkbox复选框
Nov 30 #Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
Nov 30 #Javascript
javascript &amp;&amp;和||运算法的另类使用技巧
Nov 28 #Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
Nov 28 #Javascript
JavaScript 闭包在封装函数时的简单分析
Nov 28 #Javascript
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
Nov 27 #Javascript
You might like
用Zend Encode编写开发PHP程序
2006/10/09 PHP
php 应用程序安全防范技术研究
2009/09/25 PHP
PHP数据类型的总结分析
2013/06/13 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python获取豆瓣电影简介代码分享
2014/01/16 Python
用Python编程实现语音控制电脑
2014/04/01 Python
python中返回矩阵的行列方法
2018/04/04 Python
python 将md5转为16字节的方法
2018/05/29 Python
Python制作词云图代码实例
2019/09/09 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
人力资源经理自我评价
2014/01/04 职场文书
电焊工岗位职责
2014/03/06 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android