最近因为需要在手机网站开发一个图片放大缩小的效果。本来想用lightbox的框架代码的,但是代码实在太多,就自己写了一个。
主要是用到了样式中的透明度,还有div居中显示。
layout的具体样式
<style type="text/css"> .lay{position:absolute;z-index:998;margin:0 auto;top:0;height:100%;width:100%;background:rgba(0, 0, 0, 0.3);} </style>
在对多个图片绑定事件的时候遇到一个问题。就是我先用循环来判断img元素的个数,然后为每个元素绑定事件,由于我但是代码是这样写的
for(var i=0; i<$(".pic .img").length; i++) { $(".pic .img img").get(i).addEventListener("click", function() {
alert(i); $(".fuc").get(i).style.display = "none"; toBiggerPic(i); })
}
如果代码这么写会有一个问题。因为如果这么,加入图片个数为5的话,写那个i的值始终会是5。
这个主要是作用域的问题。绑定函数的上一级作用域为window,它的值在循环结束后为5,所以无论怎么样都会显示出5。解决办法就是重新设置下作用域,就是使用大家所谓的闭包。
新的代码:
for(var i=0; i<$(".pic .img").length; i++) { $(".pic .img img").get(i).addEventListener("click", (function(i) { return function() {
alert(i); $(".fuc").get(i).style.display = "none"; toBiggerPic(i); } })(i),false);
还有一处是我的div是需要在img图像完全加载完成后才能拥有大小,并进行居中设置。需要判断图片是否加载完全再进行判断。
因为在手机上页面判断图片是否加载完和pc端不同。它在首次加载图片会执行img.onload方法,但是在图片加载完成之后就直接从缓存中读取图片,不执行window.onload里的代码了。所以需要做一次判断图片是否是首次加载。具体代码:
function toBiggerPic(i) { $(".layout").get(0).style.display = "block"; $(".popOrigPic2").get(0).style.display = "block"; $(".popOrigPic2 img").get(0).setAttribute("src", $(".pic .img img").get(i).getAttribute("src").replace(/b/, "g")); /*因为浏览器只在第一次加载图片的时候执行onload函数。为了在之后也执行居中的代码。给图片是否加载完成加一个属性的判断。*/ if($(".popOrigPic2 img").get(0).getAttribute("complete") == "complete") { vMiddle($(".popOrigPic2").get(0)); } else { $(".popOrigPic2 img").get(0).onload = function() { $(".popOrigPic2 img").get(0).setAttribute("complete", "complete"); vMiddle($(".popOrigPic2").get(0)); } } }
最后在不同手机进行测试的时候在遮罩层的显示上出现一个问题。
在android的自带浏览器上,给遮罩层添加点击事件让它隐藏后,遮罩层会变亮黄色然后才消失。后来的解决方法是在遮罩层外部加一个div,给那个div添加点击事件来实现。
具体代码地址:http://www.cnblogs.com/zzcflying/admin/Files.aspx。testPic文件。