2012-11-14 87 views
1

我的Jquery代碼有問題。我正在試着做一個畫廊。我希望當一個人點擊圖像時,將該圖像附加到div並將其顯示在屏幕的中心。我的問題是大於當前屏幕尺寸的圖像。我調整圖像的大小以匹配屏幕大小,但是當我將它淡入到div時,它滯後。我無法弄清楚爲什麼會出現這種情況,我相信這不僅僅是因爲圖像很大,如果我不調整它的大小,讓它離開屏幕就會消失。 的HTML:調整大小的圖像jquery

<!DOCTYPE HTML> 
<html lang="en-US"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Gallery</title> 
    <link rel="stylesheet" href="Gallery.css"> 
</head> 
<body> 

<div class="gallery"> 
    <div class="images"> 
     <ul class="resize"> 
      <li><img src="img/img1.jpg" alt="image1"></li> 
      <li><img src="img/img2.jpg" alt="image2"></li> 
      <li><img src="img/img3.jpg" alt="image3"></li> 
      <li><img src="img/img4.jpg" alt="image4"></li> 
      <li><img src="img/img5.jpg" alt="image5"></li> 
      <li><img src="img/img6.jpg" alt="image6"></li> 
      <li><img src="img/img7.jpg" alt="image7"></li> 
      <li><img src="img/img8.jpg" alt="image8"></li> 
     </ul> 
    </div> 
    <div class="backgroundOpacity"></div> 
    <div class="imageBox"> 
     <img class="displayImage" src="" alt="displayImage"> 
     <img class="loadingGif" src="img/loading.gif" alt="loadgindGif"> 
     <img class="closeImage" src="img/closeImage.png" alt="close"> 
     <p class="imageNumber">1</p> 
    </div> 
</div> 

<script type="text/javascript" src="jquery-1.8.2.js"></script> 
<script type="text/javascript" src="Gallery.js"></script> 
<script type="text/javascript"> 
    var content = $('.gallery'), 
     gallery = new Gallery(content); 
</script> 

</body> 
</html> 

的CSS:

*{ 
    margin: 0; 
    padding: 0; 
} 
/*-------------------------gallery-----------------------*/ 
.gallery{ 
    width: 1300px; 
    margin: 100px auto 0; 
}; 
/*------------------------------------------------*/ 
/*-------------------------images-----------------------*/ 
.images{ 
    width: inherit; 
    height: inherit; 
} 
.images li{ 
    list-style-type: none; 
    float: left; 
    margin: 0 20px 20px 0; 
    width: 300px; 
    height: 150px; 
    cursor: pointer; 
} 
.resize img{ 
    width: inherit; 
    height: inherit; 
} 
/*------------------------------------------------*/ 
/*-------------------------imageBox-----------------------*/ 
.imageBox{ 
    background-color: white; 
    clear: both; 
    width: 300px; 
    height: 150px; 
    display: none; 
    position: fixed; 
    overflow: visible; 
} 
.backgroundOpacity{ 
    background-color: black; 
    width: 5000px; 
    height: 5000px; 
    position: fixed; 
    left: 0px; 
    top: 0px; 
    opacity: 0.7; 
    display: none; 
} 
.loadingGif{ 
    display: block; 
    position: absolute; 
} 
.displayImage{ 
    display: none; 
} 
.closeImage{ 
    position: absolute; 
    top: -10px; 
    right: -10px; 
    cursor: pointer; 
} 
.imageNumber{ 
    position: absolute; 
    bottom: 0px; 
    left: 0px; 
    font-family: sans-serif; 
    font-size: 18px; 
    font-weight: bold; 
    opacity: 0.6; 
} 
/*------------------------------------------------ 

*/

和Java:

function Gallery (galleryDiv, resizeDuration, fadeInDuration) { 
    this.config = { 
     resizeDuration: 1000, 
     fadeInDuration: 500 
    }; 

    this.galleryDiv = galleryDiv; 

    this.imagesUl = this.galleryDiv.find('.images ul'); 
    this.images = this.imagesUl.find('img'); 
    this.backgroundOpacity = this.galleryDiv.find('.backgroundOpacity'); // the background div which when is clicked hides the imageBox 
    this.imageBox = this.galleryDiv.find('.imageBox'); // where the images will be displayed when they'r clicked 
    this.closeButton = this.imageBox.find('.closeImage'); // top-right x 
    this.loadingGif = this.imageBox.find('.loadingGif'); // the animated gif that gives the effect of 'loading' 
    this.imageNumber = this.imageBox.find('.imageNumber'); // bottom-left text 
    this.displayImage = this.imageBox.find('.displayImage'); // image to be displayed 


    this.imagesWidth = new Array(); // the images default widths 
    this.imagesHeight = new Array(); // the images default heights 
    this.imagesLength = this.images.length // number of images 
    this.imageBoxSize = new Array(); // [0] is width, [1] is height 
    this.loadingGifSize = new Array() // [0] is width, [1] is height 

    this.resizeDuration = resizeDuration || this.config.resizeDuration; // duration to resize imageBox 
    this.fadeInDuration = fadeInDuration || this.config.fadeInDuration; // duration for image to fadeIn 

    this.init(); 
}; 

Gallery.prototype.init = function() { // puts things into move 
    this.getImageSize(); 
    this.bind(); 
}; 

Gallery.prototype.bind = function() { // bind events 
    var self = this; 
    this.images.on('click', function() { 
     var index = $(self.images).index($(this)); 
     self.showImage(index); 
    }); 

    $(window).on('resize', function() { // center the imagebox whenever the window is resized 
     self.centerImageBox(self.imageBoxSize[0], self.imageBoxSize[1]); 
    }); 

    $(this.closeButton).on('click', function() { // hide the image 
     // self.hideImage(); 
     self.displayImage.hide(); 
     self.displayImage.fadeIn(500); 
    }); 

    $(this.backgroundOpacity).on('click', function() { 
     self.hideImage(); 
    }); 
    return this; 
}; 

Gallery.prototype.getImageSize = function() { // get the default images sizes 
    var self = this; 

    this.imagesUl.removeClass('resize'); 
    $.each(this.images, function (index, value) { 
     self.imagesWidth[index] = value.width; 
     self.imagesHeight[index] = value.height; 
    }); 
    this.imagesUl.addClass('resize'); 

    this.imageBox.show(); 
    this.loadingGifSize = [this.loadingGif.width(), this.loadingGif.height()]; 
    this.imageBox.hide(); 

    return this; 
}; 

Gallery.prototype.showImage = function (index) { // shows the image when it is clicked 
    var self = this, 
     imageWidth = this.imagesWidth[index], imageHeight = this.imagesHeight[index], 
     imageSrc = $(this.images[index]).attr('src'), 
     windowWidth = $(window).width(), windowHeight = $(window).height(), 
     ratio = imageWidth/imageHeight, margin = 100, // margin - the distance from the image borders to the window borders (if image is to big) 
     imageBoxHeight, imageBoxWidth; 
    // resize the image to the current monitor size 
    while(imageWidth > (windowWidth - margin) || imageHeight > (windowHeight-margin)){ 
     if(imageWidth > windowWidth){ 
      imageWidth = windowWidth - margin; 
      imageHeight = imageWidth/ratio; 
     } 
     else{ 
      imageHeight = windowHeight - margin; 
      imageWidth = imageHeight * ratio; 
     } 
    } 
    //show imageBox and resize it 
    this.imageBoxSize = [imageWidth, imageHeight]; // captures the current imageBox size 
    this.imageNumber.text('Image ' + (index+1) + ' of ' + this.imagesLength) // set bottom-left text 
    this.displayImage.attr('src', imageSrc).css({ 
     'width': imageWidth, 
     'height': imageHeight 
    }); 

    this.backgroundOpacity.show(); 
    this.imageBox.show(); 
    this.loadingGif.show(); 

    this.imageBox.animate({ 
     'width': imageWidth, 
     'height': imageHeight 
    },{ 
     duration: self.resizeDuration, 
     step: function() { 
      // center the image box with every resize; 
      imageBoxWidth = self.imageBox.width(); 
      imageBoxHeight = self.imageBox.height(); 
      self.centerImageBox(imageBoxWidth, imageBoxHeight); 
      // center the loadingGif 
      self.loadingGif.css({ 
       'right': (imageBoxWidth - self.loadingGifSize[0])/2, 
       'top': (imageBoxHeight - self.loadingGifSize[1])/2 
      }); 
     }, 
     complete: function() { 
      self.closeButton.show(); 
      self.imageNumber.show(); 
      self.loadingGif.hide(); 
      self.displayImage.fadeIn(500); 
     } 
    }); 


    return this; 
}; 

Gallery.prototype.hideImage = function() { // hide the image 
    this.imageBox.hide(); 
    this.backgroundOpacity.hide(); 
    this.closeButton.hide(); 
    this.imageNumber.hide(); 
    this.displayImage.hide(); 

    return this; 
}; 

Gallery.prototype.centerImageBox = function (width, height) { 
    var windowWidth = $(window).width(), 
     windowHeight = $(window).height(); 

    this.imageBox.css({ 
     'right': (windowWidth - width)/2, 
     'top': (windowHeight - height)/2 
    }); 

    return this; 
}; 

嘗試用一個大的圖像,大於2000×2000

+0

我建議預先加載圖像。 jQuery無法獲取圖像的大小以進行任何修改,因爲圖像最初並未顯示(display:none;) –

回答

0

這是由於圖像太大的緣故。實際上jQuery的動畫效果很慢。我建議你在你的服務器上使用imagemagick來創建小圖片,大小可以是任何你想要的圖片寬。之後動畫將順利運行。