欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

javascript 图片放大效果函数

程序员文章站 2023-08-31 15:14:28
/*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);
    }
};