javascript 图片放大效果函数
程序员文章站
2022-06-04 12:06:24
/*pre css reset*/
body,th,td { font-size:12px;font-family:tahoma,helvetica,arial,'...
[ctrl+a 全选 注:如需引入外部js需刷新才能执行]
imagezoom.js
复制代码 代码如下:
/*
*author:sohighthesky
*date:2009-11-14
*/
/*
*img 指定要放大的图片或者其id
*options:参见代码中setoptions中的注释
*/
var imagezoom = function(img,options) {
this.img=this.g(img);
if(this.img.nodename!="img") {
if(this.img && this.img.children[0].nodename=="img")this.img=this.img.children[0];
else throw error("invalid argument [img] !");
}
this.setoptions(options);
this.init();
}
imagezoom.prototype={
g:function(id) {return typeof(id)=="string"?document.getelementbyid(id):id;},
ae:function(el,type,call) {
if(el.addeventlistener)el.addeventlistener(type,call,false);
else el.attachevent("on"+type,call);
},
getpos:function(o){//取元素坐标
var x = 0, y = 0;
do{x += o.offsetleft; y += o.offsettop;}
while(o=o.offsetparent);
return {'x':x,'y':y};
},
setoptions:function(options) {
this.options={
mul:0,//默认为不放大(显示图片的原来大小)
bigimg:null,//指定放大的图片路径(要跟小图成比例才好)
viewer:null, //指定显示的位置(可以为一个div或者其id)
viewercla:"",//预览的div的类样式
viewermul:1,//指定显示div的放大倍数,默认为原大小,设置viewer时此参数无效
onshow:function(){},
onhide:function(){}
};
for(var o in options) {this.options[o]=options[o];}
this.options.bigimg =this.options.bigimg ||this.img.src;
},
getsize:function(o) {
return {w:o.offsetwidth,h:o.offsetheight};
},
createview:function() {
var _is=this.getsize(this.img);
var d=document;
if(this.options.viewer){
this.viewer=this.g(this.options.viewer);
this.viewer.style.overflow="hidden";
this.viewer.style.position="relative";
} else {
this.viewer=d.createelement("div");
this.viewer.classname=this.options.viewercla;
var pos=this.getpos(this.img);
this.viewer.style.csstext="display:none;overflow:hidden;position:absolute;top:"+pos.y+"px;left:"+(pos.x+_is.w+10)+"px;height:"+_is.h*this.options.viewermul+"px;width:"+_is.w*this.options.viewermul+"px";
d.body.appendchild(this.viewer);
}
this.viewimg=d.createelement("img");
this.viewimg.style.csstext="position:relative;left:-33%;top:-33%;";
this.viewimg.src=this.options.bigimg;
if(this.options.mul) {//设置放大倍数
this.viewimg.style.width=_is.w*this.options.mul +"px";
this.viewimg.style.height=_is.h*this.options.mul +"px";
}
this.viewer.appendchild(this.viewimg);
},
move:function(e) {
if(!this.options.mul)
this.options.mul=this.viewimg.offsetheight/this.img.offsetheight;
var pos=this.getpos(this.img);
var l=e.clientx-pos.x+(document.documentelement.scrollleft || document.body.scrollleft);//鼠标位置相对于图片左上角的偏移
var t=e.clienty-pos.y+(document.documentelement.scrolltop || document.body.scrolltop);
var zs=this.getsize(this.viewer);
var pl=-l*this.options.mul+zs.w/2;
var pt=-t*this.options.mul+zs.h/2;
pl=pl>0?0:pl;
pt=pt>0?0:pt;
var vs=this.getsize(this.viewimg);
pl=math.max(pl,zs.w-vs.w);
pt=math.max(pt,zs.h-vs.h);
this.viewimg.style.left=pl+"px";
this.viewimg.style.top=pt+"px";
},
init:function() {
var o=this;
var load=function(a) {//图片加载
o.createview.call(o);
o.img.setattribute("alt","");
o.ae(o.img,"mousemove",function(event){o.move.call(o,event);});
if(!o.options.viewer) {
o.ae(o.img,"mouseover",function(){o.options.onshow();o.viewer.style.display=""});
o.ae(o.img,"mouseout",function(){o.options.onhide();o.viewer.style.display="none"});
}
};
if(typeof(document.readystate)=="undefined" || window.opera) {
var de=document.documentelement || document.body;
var h=de.scrollheight;
var t=setinterval(function() {
if(h==de.scrollheight){
clearinterval(t);
load();
} else h=de.scrollheight;
},500);
} else if(document.readystate=="complete")
load();
else
o.ae(window,"load",load);
}
};
下一篇: 文字在网页上下浮动 学习可以不建议用