代码改变世界

Javascript动画系列之 —— lightbox实现(一)

2013-04-15 00:14  MoltBoy  阅读(666)  评论(0编辑  收藏  举报

  随着DOM和动态JS、CSS操作的出现,网页的交互性效果变得越来越强大,而比较明显的体会就是日渐丰富多样的图片查看和浏览方式。貌似印证了某句名言:只有你想不到的,没有你做不到的,当然前提是都在如今的技术规范之内。

  那lightbox是什么样的效果,内部的实现原理是什么,总结起来无非这么几点:

  ①、当点击图片时,就会弹出一个图片覆盖层,而不是直接进入实际图片;

  ②、图片覆盖层显示之时,一个半透明的灰层覆盖整个页面(opacity),模糊化被覆盖的页面内容;

  ③、图片覆盖层会有一些从图片到图片的导航方法。

  Lightbox的出现刺激了其他多种类似的图库的发展,这个图库并没有使用任何框架,后面出现的lightbox2使用了jquery。关于这个脚本的更多信息可以从http://www.huddletogether.com/projects/lightbox/中找到。二lightbox2可以从http://lokeshdhakar.com/projects/lightbox2/下载。这两个地址有详细地使用方法,跟使用一般的框架区别不大。

  其中关键点在于,rel="lightbox":

<a href="image.jpg" rel="lightbox" title=""></a>
title特性用来显示图片标题,一组相关图片可是如下方式:
<a href="image1.jpg" rel="lightbox[groupName]" title=""></a>

  使用如下代码可以定位所有Lightbox锚点元素并让它们正确地显示:

var anchors = document.getElementByTagName("a");
for(var i=0,len=anchors.length; i < len; ++i){
    var anchor = anchors[i];
    if(anchor.href && anchor.rel == "lightbox"){     //检测anchor是否存在href特性,跳过没有rel特性不是lightbox的anchor
        anchor.onclick = function(){
            showLightbox(this);
            return false;
        };
    }
}

  这个图库必须使用分离式脚步编程来完成的,你只需要在页面加载完成时动态注入一些HTML元素和CSS样式。在DOM中注入初始化的HTML并为每个元素绑定必要的事件处理程序,具体的过程如下使用:(注意:本文的代码并非实现代码,而是讲解思路过程,具体的实现过程还需自行完善)

var curImage = null;        //记录当前查看图片
window.onload = function(){
    /*添加如下DOM结构
     *<div id="overlay"></div>
     *<div id="gallery"> 
     *        <div id="gallery_image"></div>
     *        <div id="gallery_prev"><a href="">&laquo; Prev</a></div>
     *        <div id="gallery_next"><a href="">Next &raquo;</a></div>
     *        <div id="gallery_title"></div>
    */</div>
    
    //建立整个图库的外层支架
    var gallery = document.createElement("div");
    gallery.id="gallery";

    //添加所有子元素节点,避免多次操作
    gallery.innerHTML = '<div id="gallery_image"></div>' + 
        '<div id="gallery_perv"><a href="">&laquo; Prev</a></div>' +
     '<div id="gallery_next"><a href="">Next &raquo;</a></div>' +
     '<div id="gallery_title"></div>';
  document.body.appendChild(gallery);

  //上一张和下一张图片跳转处理事件
  id("gallery_next").onclick = nextImage;
  id("gallery_prev").onclick = prevImage;

  //定位到页面上的所有图库
  var g = byClass("gallery", "ul");
  //遍历所有的图库
  for(var i=0;i<g.length;i++){
    //并定位到幻灯图片的所有链接
    var link = tag("a", g[i]);
    //遍历所有图片链接
    for(var j=0;j<link.length;j++){
      //确保做到:当点击的时候,显示图库而不是跳转图片
      link[j].onclick = function(){
        showOverlay();    //显示灰色背景的覆盖层
        showImage(this.parentNode);    //在图库内显示图片
        //确保浏览器不会像普通情况下跳转图片
        return false;
      };
    }
    addSlideShow(g[i]);
  }
};
处理完这个重要的步骤之后,你就可以开始制作图库的各种组件。 
  半透明的覆盖层

  制作覆盖层的难点在于:让这个透明的覆盖层能够适合当前页面的高度和宽度。这里创建一个简单的div元素并插入DOM中:
//创建半透明、灰色的覆盖层
var overlay = document.createElement("div");
overlay.id="overlay";

//当点击覆盖层,把图库和它都隐藏
overlay.onclick = hideOverlay;

//把覆盖层插入DOM中
document.body.appendChild(overlay);

  接下来就是写两个函数来隐藏和出发覆盖层。此处需要注意的是,让覆盖层与当前页面保持一致的宽度和高度,避免用户点击到非覆盖层。

  隐藏和显示图库半透明覆盖层的两个函数:hideOverlay()、showOverlay()

function hideOverlay(){
    curImage = null;    //确保重置当前图片
    
    hide(id("overlay"));    //隐藏覆盖层和图库,display:none
    hide(id("gallery"));
}

function showOverlay(){
    var over = id("overlay");        //获取覆盖层
    
    over.style.height = pageHeight;    //让覆盖层和页面保持一致的大小
    over.style.width = pageWidth;
    fadeIn(over, 50, 10);      //并渐隐,实现代码此处略
}

  最后加上必要的CSS,正确地显示半透明的覆盖层,如下所示:

#overlay{
    background: #000;
    opacity: 0.5;
    display:none;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 100;
    cursor: hand;
}

  建立了覆盖层并附加到页面后,就可以准备在它上面显示图片了。整个图库需要被包裹在一个容器中,这个容器浮动在半透明覆盖层之上。我们还需要一个函数来显示图库的div,并把图片放到这个div中去。最常用的做法是,判断用户是否在图库中点击了其中图片,然后显示这张图片的大尺寸版本,覆盖在页面的其他元素。

//显示图库的当前图片
function showImage(){
    curImage = cur;    //记住当前处理的图片
    var img = id("gallery_image");        //获取图库图片

    //删除当前图片,若存在的话
    img.firstChild && img.removeChild(img.firstChild);

    //用新图片取而代之
    img.appendChild(cur.firstChild.cloneNode(true));

    //设置图库图片的说明为该图片的alt特性内容
    id("gallery_title").innerHTML = cur.firstChild.firstChild.alt;
    //定位到主图库中
    var gallery = id("gallery");
    
    //设置正确的class
    gallery.className = cur.className;
    fadeIn(gallery, 100, 10);    //平滑地渐隐
    adjust();        //确保图片在屏幕中的位置正确
}

未完待续...