使用纯javascript实现放大镜效果
jd或者淘宝的具体商品有个放大镜的效果。虽然网上类似插件琳琅满目,应用到项目上有诸多不便,自己抽点时间自己写了个类似插件,积累下代码,何乐而不为呢!!let‘go:
打算把此特效封装成个插件,先把最基本的算法实现,然后再一步步封装吧:
最终实现效果:
html代码:
<divid="Magnifier"></div>
css代码:
<style> *{ margin:0; padding:0; } </style>
貌似什么都没有,开始咱们强大的js之旅吧:
javascript代码:
functioncreateElement(MagnifierId,sImg,bImg){ varMagnifier=$(MagnifierId); Magnifier.style.position='relative'; //小图div varsmallDiv=$Create("div"); smallDiv.setAttribute("id","small"); smallDiv.style.position="absolute"; //遮罩层 varmask=$Create("div"); mask.setAttribute("id","mask"); mask.style.position="absolute"; //镜片 varmirror=$Create("div"); mirror.setAttribute("id","mirror"); mirror.style.opacity=0.3; mirror.style.position="absolute"; mirror.style.display="none"; //小图 varsmallImg=$Create("img"); smallImg.setAttribute("src",sImg); smallImg.setAttribute("id","smallImg"); smallImg.onload=function(){ //如果没设置放大镜的height或者width根据小图大小设置放大镜大小 if(!Magnifier.offsetHeight){ Magnifier.style.width=this.offsetWidth+"px"; Magnifier.style.height=this.offsetHeight+"px"; } //遮罩层大小和小图一样 mask.style.opacity="0"; mask.style.width=this.width+'px'; mask.style.height=this.height+"px"; mask.style.zIndex=2; bigDiv.style.left=this.width+5+"px"; bigDiv.style.top="-5px"; } smallDiv.appendChild(mask); smallDiv.appendChild(mirror); smallDiv.appendChild(smallImg); //视窗 varbigDiv=$Create("div"); bigDiv.setAttribute("id","big"); bigDiv.style.position="absolute"; bigDiv.style.overflow="hidden"; bigDiv.style.display="none"; varbigImg=$Create("img"); bigImg.setAttribute("src",bImg); bigImg.setAttribute("id","bigImg"); bigImg.style.position="absolute"; bigDiv.appendChild(bigImg); Magnifier.appendChild(smallDiv); Magnifier.appendChild(bigDiv); } functionsetMagnifierStyle(mirrorStyle,shichuangStyle){ //mirror for(variteminmirrorStyle){ mirror.style[item]=mirrorStyle[item]; } for(variteminshichuangStyle){ $("big").style[item]=shichuangStyle[item]; } } functionregisterEvent(){ $("mask").onmouseover=function(){ $("big").style.display="block"; mirror.style.display="block"; } $("mask").onmouseout=function(){ $("big").style.display="none"; mirror.style.display="none"; } $("mask").onmousemove=function(evt){ varoEvent=evt||event; vardisX=oEvent.offsetX; vardisY=oEvent.offsetY; varmirrorLeft=disX-mirror.offsetWidth/2; varmirrorTop=disY-mirror.offsetHeight/2; if(mirrorLeft<0){ mirrorLeft=0; } elseif(mirrorLeft>mask.offsetWidth-mirror.offsetWidth){ mirrorLeft=mask.offsetWidth-mirror.offsetWidth; } if(mirrorTop<0){ mirrorTop=0; } elseif(mirrorTop>mask.offsetHeight-mirror.offsetHeight){ mirrorTop=mask.offsetHeight-mirror.offsetHeight; } mirror.style.top=mirrorTop+"px"; mirror.style.left=mirrorLeft+"px"; varpaX=mirrorTop/(mask.offsetHeight-mirror.offsetHeight); varpaY=mirrorLeft/(mask.offsetWidth-mirror.offsetWidth); $("bigImg").style.top=-paX*($("bigImg").offsetHeight-$("big").offsetHeight)+"px"; $("bigImg").style.left=-paY*($("bigImg").offsetWidth-$("big").offsetWidth)+"px"; } } function$(id){ returndocument.getElementById(id); } function$Create(type){ returndocument.createElement(type); }
最后再onload小小的调用一下:
window.onload=function(){ createElement("Magnifier","images/Magnifier/small.jpg","images/Magnifier/big.jpg"); setMagnifierStyle({"width":"30px","height":"30px","backgroundColor":"#fff"},{"width":"250px","height":"250px"}); registerEvent(); }
效果总算出来了耶,
2.接下来咱们封装吧:
Magnifer类代码:
functionMagnifier( MagnifierId, //放大镜容器ID sImg, //小图片src bImg, //大图片src mirrorStyle, //小图片里镜片样式,json格式数据 ViewStyle //预览视窗样式,json格式数据 ){ var_this=this; this.MagnifierContainer=null; //容器 this.smallDiv=null; //小图容器 this.mask=null; //小图遮罩层 this.mirror=null; //小图镜片 this.smallImg=null; //小图 this.bigDiv=null; //预览视图 this.bigImg=null; //大图 varinit=function(){ _this.MagnifierContainer=_this.$(MagnifierId); _this.createElement(sImg,bImg); _this.setMagnifierStyle(mirrorStyle,ViewStyle); _this.MainEvent(); } init(); } Magnifier.prototype.createElement=function(sImg,bImg){ var_this=this; var$Create=this.$Create; this.MagnifierContainer.style.position='relative'; //脱离文档流,视情况修改 this.smallDiv=$Create("div"); this.smallDiv.setAttribute("id","small"); this.smallDiv.style.position="absolute"; this.mask=$Create("div"); this.mask.setAttribute("id","mask"); this.mask.style.position="absolute"; this.mirror=$Create("div"); this.mirror.setAttribute("id","mirror"); this.mirror.style.opacity=0.3; this.mirror.style.position="absolute"; this.mirror.style.display="none"; this.smallImg=$Create("img"); this.smallImg.setAttribute("src",sImg); this.smallImg.setAttribute("id","smallImg"); this.smallImg.onload=function(){ //如果没设置放大镜的height或者width根据小图大小设置放大镜大小 if(!_this.MagnifierContainer.offsetHeight){ _this.MagnifierContainer.style.width=this.offsetWidth+"px"; _this.MagnifierContainer.style.height=this.offsetHeight+"px"; } //遮罩层大小和小图一样 _this.mask.style.opacity="0"; _this.mask.style.width=this.offsetWidth+'px'; _this.mask.style.height=this.offsetHeight+"px"; _this.mask.style.zIndex=2; _this.bigDiv.style.left=this.offsetWidth+5+"px"; _this.bigDiv.style.top="-5px"; } this.smallDiv.appendChild(this.mask); this.smallDiv.appendChild(this.mirror); this.smallDiv.appendChild(this.smallImg); this.bigDiv=$Create("div"); this.bigDiv.setAttribute("id","big"); this.bigDiv.style.position="absolute"; this.bigDiv.style.overflow="hidden"; this.bigDiv.style.display="none"; this.bigImg=$Create("img"); this.bigImg.setAttribute("src",bImg); this.bigImg.setAttribute("id","bigImg"); this.bigImg.style.position="absolute"; this.bigDiv.appendChild(this.bigImg); this.MagnifierContainer.appendChild(this.smallDiv); this.MagnifierContainer.appendChild(this.bigDiv); } Magnifier.prototype.setMagnifierStyle=function(mirrorStyle,ViewStyle){ for(variteminmirrorStyle){ this.mirror.style[item]=mirrorStyle[item]; } deleteitem; for(variteminViewStyle){ this.bigDiv.style[item]=ViewStyle[item]; } } Magnifier.prototype.MainEvent=function(){ var_this=this; this.mask.onmouseover=function(){ _this.bigDiv.style.display="block"; _this.mirror.style.display="block"; } this.mask.onmouseout=function(){ _this.bigDiv.style.display="none"; _this.mirror.style.display="none"; } this.mask.onmousemove=function(evt){ varoEvent=evt||event; vardisX=oEvent.offsetX||oEvent.layerX; //兼容ff vardisY=oEvent.offsetY||oEvent.layerY; varmirrorLeft=disX-_this.mirror.offsetWidth/2; varmirrorTop=disY-_this.mirror.offsetHeight/2; if(mirrorLeft<0){ mirrorLeft=0; } elseif(mirrorLeft>this.offsetWidth-_this.mirror.offsetWidth){ mirrorLeft=this.offsetWidth-mirror.offsetWidth; } if(mirrorTop<0){ mirrorTop=0; } elseif(mirrorTop>this.offsetHeight-_this.mirror.offsetHeight){ mirrorTop=this.offsetHeight-_this.mirror.offsetHeight; } _this.mirror.style.top=mirrorTop+"px"; _this.mirror.style.left=mirrorLeft+"px"; varpaX=mirrorTop/(this.offsetHeight-_this.mirror.offsetHeight); varpaY=mirrorLeft/(this.offsetWidth-_this.mirror.offsetWidth); _this.bigImg.style.top=-paX*(_this.bigImg.offsetHeight-_this.bigDiv.offsetHeight)+"px"; _this.bigImg.style.left=-paY*(_this.bigImg.offsetWidth-_this.bigDiv.offsetWidth)+"px"; } } Magnifier.prototype.$=function(id){ returndocument.getElementById(id); } Magnifier.prototype.$Create=function(type){ returndocument.createElement(type); }
最后在onload调用下:
window.onload=function(){ newMagnifier( "Magnifier", "images/Magnifier/small.jpg", "images/Magnifier/big.jpg", {"width":"30px","height":"30px","backgroundColor":"#fff"}, {"width":"250px","height":"250px"} ); }
以上就是本文所述的全部内容了,希望大家能够喜欢。