lightbox.js
资源名称:eat.rar [点击查看]
上传用户:jisenq
上传日期:2014-06-29
资源大小:7216k
文件大小:20k
源码类别:
数据库编程
开发平台:
ASP/ASPX
- // -----------------------------------------------------------------------------------
- //
- // Lightbox v2.02
- // by Lokesh Dhakar - http://www.huddletogether.com
- // 3/31/06
- //
- // For more information on this script, visit:
- // http://huddletogether.com/projects/lightbox2/
- //
- // Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
- //
- // Credit also due to those who have helped, inspired, and made their code available to the public.
- // Including: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.org), Thomas Fuchs(mir.aculo.us), and others.
- //
- //
- // -----------------------------------------------------------------------------------
- /*
- Table of Contents
- -----------------
- Configuration
- Global Variables
- Extending Built-in Objects
- - Object.extend(Element)
- - Array.prototype.removeDuplicates()
- - Array.prototype.empty()
- Lightbox Class Declaration
- - initialize()
- - start()
- - changeImage()
- - resizeImageContainer()
- - showImage()
- - updateDetails()
- - updateNav()
- - enableKeyboardNav()
- - disableKeyboardNav()
- - keyboardAction()
- - preloadNeighborImages()
- - end()
- Miscellaneous Functions
- - getPageScroll()
- - getPageSize()
- - getKey()
- - listenKey()
- - showSelectBoxes()
- - hideSelectBoxes()
- - pause()
- - initLightbox()
- Function Calls
- - addLoadEvent(initLightbox)
- */
- // -----------------------------------------------------------------------------------
- //
- // Configuration
- //
- var fileLoadingImage = "images/loading.gif";
- var fileBottomNavCloseImage = "images/closelabel.gif";
- var resizeSpeed = 7; // controls the speed of the image resizing (1=slowest and 10=fastest)
- var borderSize = 10; //if you adjust the padding in the CSS, you will need to update this variable
- // -----------------------------------------------------------------------------------
- //
- // Global Variables
- //
- var imageArray = new Array;
- var activeImage;
- if(resizeSpeed > 10){ resizeSpeed = 10;}
- if(resizeSpeed < 1){ resizeSpeed = 1;}
- resizeDuration = (11 - resizeSpeed) * 0.15;
- // -----------------------------------------------------------------------------------
- //
- // Additional methods for Element added by SU, Couloir
- // - further additions by Lokesh Dhakar (huddletogether.com)
- //
- Object.extend(Element, {
- getWidth: function(element) {
- element = $(element);
- return element.offsetWidth;
- },
- setWidth: function(element,w) {
- element = $(element);
- element.style.width = w +"px";
- },
- setHeight: function(element,h) {
- element = $(element);
- element.style.height = h +"px";
- },
- setTop: function(element,t) {
- element = $(element);
- element.style.top = t +"px";
- },
- setSrc: function(element,src) {
- element = $(element);
- element.src = src;
- },
- setHref: function(element,href) {
- element = $(element);
- element.href = href;
- },
- setInnerHTML: function(element,content) {
- element = $(element);
- element.innerHTML = content;
- }
- });
- // -----------------------------------------------------------------------------------
- //
- // Extending built-in Array object
- // - array.removeDuplicates()
- // - array.empty()
- //
- Array.prototype.removeDuplicates = function () {
- for(i = 1; i < this.length; i++){
- if(this[i][0] == this[i-1][0]){
- this.splice(i,1);
- }
- }
- }
- // -----------------------------------------------------------------------------------
- Array.prototype.empty = function () {
- for(i = 0; i <= this.length; i++){
- this.shift();
- }
- }
- // -----------------------------------------------------------------------------------
- //
- // Lightbox Class Declaration
- // - initialize()
- // - start()
- // - changeImage()
- // - resizeImageContainer()
- // - showImage()
- // - updateDetails()
- // - updateNav()
- // - enableKeyboardNav()
- // - disableKeyboardNav()
- // - keyboardNavAction()
- // - preloadNeighborImages()
- // - end()
- //
- // Structuring of code inspired by Scott Upton (http://www.uptonic.com/)
- //
- var Lightbox = Class.create();
- Lightbox.prototype = {
- // initialize()
- // Constructor runs on completion of the DOM loading. Loops through anchor tags looking for
- // 'lightbox' references and applies onclick events to appropriate links. The 2nd section of
- // the function inserts html at the bottom of the page which is used to display the shadow
- // overlay and the image container.
- //
- initialize: function() {
- if (!document.getElementsByTagName){ return; }
- var anchors = document.getElementsByTagName('a');
- // loop through all anchor tags
- for (var i=0; i<anchors.length; i++){
- var anchor = anchors[i];
- var relAttribute = String(anchor.getAttribute('rel'));
- // use the string.match() method to catch 'lightbox' references in the rel attribute
- if (anchor.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))){
- anchor.onclick = function () {myLightbox.start(this); return false;}
- }
- }
- // The rest of this code inserts html at the bottom of the page that looks similar to this:
- //
- // <div id="overlay"></div>
- // <div id="lightbox">
- // <div id="outerImageContainer">
- // <div id="imageContainer">
- // <img id="lightboxImage">
- // <div style="" id="hoverNav">
- // <a href="#" id="prevLink"></a>
- // <a href="#" id="nextLink"></a>
- // </div>
- // <div id="loading">
- // <a href="#" id="loadingLink">
- // <img src="images/loading.gif">
- // </a>
- // </div>
- // </div>
- // </div>
- // <div id="imageDataContainer">
- // <div id="imageData">
- // <div id="imageDetails">
- // <span id="caption"></span>
- // <span id="numberDisplay"></span>
- // </div>
- // <div id="bottomNav">
- // <a href="#" id="bottomNavClose">
- // <img src="images/close.gif">
- // </a>
- // </div>
- // </div>
- // </div>
- // </div>
- var objBody = document.getElementsByTagName("body").item(0);
- var objOverlay = document.createElement("div");
- objOverlay.setAttribute('id','overlay');
- objOverlay.style.display = 'none';
- objOverlay.onclick = function() { myLightbox.end(); return false; }
- objBody.appendChild(objOverlay);
- var objLightbox = document.createElement("div");
- objLightbox.setAttribute('id','lightbox');
- objLightbox.style.display = 'none';
- objBody.appendChild(objLightbox);
- var objOuterImageContainer = document.createElement("div");
- objOuterImageContainer.setAttribute('id','outerImageContainer');
- objLightbox.appendChild(objOuterImageContainer);
- var objImageContainer = document.createElement("div");
- objImageContainer.setAttribute('id','imageContainer');
- objOuterImageContainer.appendChild(objImageContainer);
- var objLightboxImage = document.createElement("img");
- objLightboxImage.setAttribute('id','lightboxImage');
- objImageContainer.appendChild(objLightboxImage);
- var objHoverNav = document.createElement("div");
- objHoverNav.setAttribute('id','hoverNav');
- objImageContainer.appendChild(objHoverNav);
- var objPrevLink = document.createElement("a");
- objPrevLink.setAttribute('id','prevLink');
- objPrevLink.setAttribute('href','#');
- objHoverNav.appendChild(objPrevLink);
- var objNextLink = document.createElement("a");
- objNextLink.setAttribute('id','nextLink');
- objNextLink.setAttribute('href','#');
- objHoverNav.appendChild(objNextLink);
- var objLoading = document.createElement("div");
- objLoading.setAttribute('id','loading');
- objImageContainer.appendChild(objLoading);
- var objLoadingLink = document.createElement("a");
- objLoadingLink.setAttribute('id','loadingLink');
- objLoadingLink.setAttribute('href','#');
- objLoadingLink.onclick = function() { myLightbox.end(); return false; }
- objLoading.appendChild(objLoadingLink);
- var objLoadingImage = document.createElement("img");
- objLoadingImage.setAttribute('src', fileLoadingImage);
- objLoadingLink.appendChild(objLoadingImage);
- var objImageDataContainer = document.createElement("div");
- objImageDataContainer.setAttribute('id','imageDataContainer');
- objImageDataContainer.className = 'clearfix';
- objLightbox.appendChild(objImageDataContainer);
- var objImageData = document.createElement("div");
- objImageData.setAttribute('id','imageData');
- objImageDataContainer.appendChild(objImageData);
- var objImageDetails = document.createElement("div");
- objImageDetails.setAttribute('id','imageDetails');
- objImageData.appendChild(objImageDetails);
- var objCaption = document.createElement("span");
- objCaption.setAttribute('id','caption');
- objImageDetails.appendChild(objCaption);
- var objNumberDisplay = document.createElement("span");
- objNumberDisplay.setAttribute('id','numberDisplay');
- objImageDetails.appendChild(objNumberDisplay);
- var objBottomNav = document.createElement("div");
- objBottomNav.setAttribute('id','bottomNav');
- objImageData.appendChild(objBottomNav);
- var objBottomNavCloseLink = document.createElement("a");
- objBottomNavCloseLink.setAttribute('id','bottomNavClose');
- objBottomNavCloseLink.setAttribute('href','#');
- objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; }
- objBottomNav.appendChild(objBottomNavCloseLink);
- var objBottomNavCloseImage = document.createElement("img");
- objBottomNavCloseImage.setAttribute('src', fileBottomNavCloseImage);
- objBottomNavCloseLink.appendChild(objBottomNavCloseImage);
- },
- //
- // start()
- // Display overlay and lightbox. If image is part of a set, add siblings to imageArray.
- //
- start: function(imageLink) {
- hideSelectBoxes();
- // stretch overlay to fill page and fade in
- var arrayPageSize = getPageSize();
- Element.setHeight('overlay', arrayPageSize[1]);
- new Effect.Appear('overlay', { duration: 0.2, from: 0.0, to: 0.8 });
- imageArray = [];
- imageNum = 0;
- if (!document.getElementsByTagName){ return; }
- var anchors = document.getElementsByTagName('a');
- // if image is NOT part of a set..
- if((imageLink.getAttribute('rel') == 'lightbox')){
- // add single image to imageArray
- imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title')));
- } else {
- // if image is part of a set..
- // loop through anchors, find other images in set, and add them to imageArray
- for (var i=0; i<anchors.length; i++){
- var anchor = anchors[i];
- if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))){
- imageArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title')));
- }
- }
- imageArray.removeDuplicates();
- while(imageArray[imageNum][0] != imageLink.getAttribute('href')) { imageNum++;}
- }
- // calculate top offset for the lightbox and display
- var arrayPageSize = getPageSize();
- var arrayPageScroll = getPageScroll();
- var lightboxTop = arrayPageScroll[1] + (arrayPageSize[3] / 15);
- Element.setTop('lightbox', lightboxTop);
- Element.show('lightbox');
- this.changeImage(imageNum);
- },
- //
- // changeImage()
- // Hide most elements and preload image in preparation for resizing image container.
- //
- changeImage: function(imageNum) {
- activeImage = imageNum; // update global var
- // hide elements during transition
- Element.show('loading');
- Element.hide('lightboxImage');
- Element.hide('hoverNav');
- Element.hide('prevLink');
- Element.hide('nextLink');
- Element.hide('imageDataContainer');
- Element.hide('numberDisplay');
- imgPreloader = new Image();
- // once image is preloaded, resize image container
- imgPreloader.onload=function(){
- Element.setSrc('lightboxImage', imageArray[activeImage][0]);
- myLightbox.resizeImageContainer(imgPreloader.width, imgPreloader.height);
- }
- imgPreloader.src = imageArray[activeImage][0];
- },
- //
- // resizeImageContainer()
- //
- resizeImageContainer: function( imgWidth, imgHeight) {
- // get current height and width
- this.wCur = Element.getWidth('outerImageContainer');
- this.hCur = Element.getHeight('outerImageContainer');
- // scalars based on change from old to new
- this.xScale = ((imgWidth + (borderSize * 2)) / this.wCur) * 100;
- this.yScale = ((imgHeight + (borderSize * 2)) / this.hCur) * 100;
- // calculate size difference between new and old image, and resize if necessary
- wDiff = (this.wCur - borderSize * 2) - imgWidth;
- hDiff = (this.hCur - borderSize * 2) - imgHeight;
- if(!( hDiff == 0)){ new Effect.Scale('outerImageContainer', this.yScale, {scaleX: false, duration: resizeDuration, queue: 'front'}); }
- if(!( wDiff == 0)){ new Effect.Scale('outerImageContainer', this.xScale, {scaleY: false, delay: resizeDuration, duration: resizeDuration}); }
- // if new and old image are same size and no scaling transition is necessary,
- // do a quick pause to prevent image flicker.
- if((hDiff == 0) && (wDiff == 0)){
- if (navigator.appVersion.indexOf("MSIE")!=-1){ pause(250); } else { pause(100);}
- }
- Element.setHeight('prevLink', imgHeight);
- Element.setHeight('nextLink', imgHeight);
- Element.setWidth( 'imageDataContainer', imgWidth + (borderSize * 2));
- this.showImage();
- },
- //
- // showImage()
- // Display image and begin preloading neighbors.
- //
- showImage: function(){
- Element.hide('loading');
- new Effect.Appear('lightboxImage', { duration: 0.5, queue: 'end', afterFinish: function(){ myLightbox.updateDetails(); } });
- this.preloadNeighborImages();
- },
- //
- // updateDetails()
- // Display caption, image number, and bottom nav.
- //
- updateDetails: function() {
- Element.show('caption');
- Element.setInnerHTML( 'caption', imageArray[activeImage][1]);
- // if image is part of set display 'Image x of x'
- if(imageArray.length > 1){
- Element.show('numberDisplay');
- Element.setInnerHTML( 'numberDisplay', "Image " + eval(activeImage + 1) + " of " + imageArray.length);
- }
- new Effect.Parallel(
- [ new Effect.SlideDown( 'imageDataContainer', { sync: true, duration: resizeDuration + 0.25, from: 0.0, to: 1.0 }),
- new Effect.Appear('imageDataContainer', { sync: true, duration: 1.0 }) ],
- { duration: 0.65, afterFinish: function() { myLightbox.updateNav();} }
- );
- },
- //
- // updateNav()
- // Display appropriate previous and next hover navigation.
- //
- updateNav: function() {
- Element.show('hoverNav');
- // if not first image in set, display prev image button
- if(activeImage != 0){
- Element.show('prevLink');
- document.getElementById('prevLink').onclick = function() {
- myLightbox.changeImage(activeImage - 1); return false;
- }
- }
- // if not last image in set, display next image button
- if(activeImage != (imageArray.length - 1)){
- Element.show('nextLink');
- document.getElementById('nextLink').onclick = function() {
- myLightbox.changeImage(activeImage + 1); return false;
- }
- }
- this.enableKeyboardNav();
- },
- //
- // enableKeyboardNav()
- //
- enableKeyboardNav: function() {
- document.onkeydown = this.keyboardAction;
- },
- //
- // disableKeyboardNav()
- //
- disableKeyboardNav: function() {
- document.onkeydown = '';
- },
- //
- // keyboardAction()
- //
- keyboardAction: function(e) {
- if (e == null) { // ie
- keycode = event.keyCode;
- } else { // mozilla
- keycode = e.which;
- }
- key = String.fromCharCode(keycode).toLowerCase();
- if((key == 'x') || (key == 'o') || (key == 'c')){ // close lightbox
- myLightbox.end();
- } else if(key == 'p'){ // display previous image
- if(activeImage != 0){
- myLightbox.disableKeyboardNav();
- myLightbox.changeImage(activeImage - 1);
- }
- } else if(key == 'n'){ // display next image
- if(activeImage != (imageArray.length - 1)){
- myLightbox.disableKeyboardNav();
- myLightbox.changeImage(activeImage + 1);
- }
- }
- },
- //
- // preloadNeighborImages()
- // Preload previous and next images.
- //
- preloadNeighborImages: function(){
- if((imageArray.length - 1) > activeImage){
- preloadNextImage = new Image();
- preloadNextImage.src = imageArray[activeImage + 1][0];
- }
- if(activeImage > 0){
- preloadPrevImage = new Image();
- preloadPrevImage.src = imageArray[activeImage - 1][0];
- }
- },
- //
- // end()
- //
- end: function() {
- this.disableKeyboardNav();
- Element.hide('lightbox');
- new Effect.Fade('overlay', { duration: 0.2});
- showSelectBoxes();
- }
- }
- // -----------------------------------------------------------------------------------
- //
- // getPageScroll()
- // Returns array with x,y page scroll values.
- // Core code from - quirksmode.org
- //
- function getPageScroll(){
- var yScroll;
- if (self.pageYOffset) {
- yScroll = self.pageYOffset;
- } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict
- yScroll = document.documentElement.scrollTop;
- } else if (document.body) {// all other Explorers
- yScroll = document.body.scrollTop;
- }
- arrayPageScroll = new Array('',yScroll)
- return arrayPageScroll;
- }
- // -----------------------------------------------------------------------------------
- //
- // getPageSize()
- // Returns array with page width, height and window width, height
- // Core code from - quirksmode.org
- // Edit for Firefox by pHaez
- //
- function getPageSize(){
- var xScroll, yScroll;
- if (window.innerHeight && window.scrollMaxY) {
- xScroll = document.body.scrollWidth;
- yScroll = window.innerHeight + window.scrollMaxY;
- } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
- xScroll = document.body.scrollWidth;
- yScroll = document.body.scrollHeight;
- } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
- xScroll = document.body.offsetWidth;
- yScroll = document.body.offsetHeight;
- }
- var windowWidth, windowHeight;
- if (self.innerHeight) { // all except Explorer
- windowWidth = self.innerWidth;
- windowHeight = self.innerHeight;
- } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
- windowWidth = document.documentElement.clientWidth;
- windowHeight = document.documentElement.clientHeight;
- } else if (document.body) { // other Explorers
- windowWidth = document.body.clientWidth;
- windowHeight = document.body.clientHeight;
- }
- // for small pages with total height less then height of the viewport
- if(yScroll < windowHeight){
- pageHeight = windowHeight;
- } else {
- pageHeight = yScroll;
- }
- // for small pages with total width less then width of the viewport
- if(xScroll < windowWidth){
- pageWidth = windowWidth;
- } else {
- pageWidth = xScroll;
- }
- arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
- return arrayPageSize;
- }
- // -----------------------------------------------------------------------------------
- //
- // getKey(key)
- // Gets keycode. If 'x' is pressed then it hides the lightbox.
- //
- function getKey(e){
- if (e == null) { // ie
- keycode = event.keyCode;
- } else { // mozilla
- keycode = e.which;
- }
- key = String.fromCharCode(keycode).toLowerCase();
- if(key == 'x'){
- }
- }
- // -----------------------------------------------------------------------------------
- //
- // listenKey()
- //
- function listenKey () { document.onkeypress = getKey; }
- // ---------------------------------------------------
- function showSelectBoxes(){
- selects = document.getElementsByTagName("select");
- for (i = 0; i != selects.length; i++) {
- selects[i].style.visibility = "visible";
- }
- }
- // ---------------------------------------------------
- function hideSelectBoxes(){
- selects = document.getElementsByTagName("select");
- for (i = 0; i != selects.length; i++) {
- selects[i].style.visibility = "hidden";
- }
- }
- // ---------------------------------------------------
- //
- // pause(numberMillis)
- // Pauses code execution for specified time. Uses busy code, not good.
- // Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602
- //
- function pause(numberMillis) {
- var now = new Date();
- var exitTime = now.getTime() + numberMillis;
- while (true) {
- now = new Date();
- if (now.getTime() > exitTime)
- return;
- }
- }
- // ---------------------------------------------------
- function initLightbox() { myLightbox = new Lightbox(); }
- Event.observe(window, 'load', initLightbox, false);