2012-09-19 17 views
6

イメージのリストを含むXMLファイルがあります。これらのイメージをコンテナにロードしてから、石積みを適用したいと考えています。コンテンツにイメージを追加して石積みをリロードする

イメージがロードされるまで待つことを試みました。http://masonry.desandro.com/demos/images.html。 各画像が追加されたらリロードを試しました - http://masonry.desandro.com/docs/methods.html#reload

どれも動作していません。

ここは私のコードですが、どこが間違っているのか分かりません。

$('.content').masonry(); 
    var elements = ''; 


    $.ajax({ 
     type: "GET", 
     url: "/galleries/_archive/PhotoGallery.xml", // replace with absolute URL of your gallery's xml file 
     dataType: "xml", 
     success: function(xml) { 
      jQuery(xml).find('img').each(function(i) { 
       var location = "/galleries/_archive/"; // replace with absolute path to the directory that holds your images 
       var url = jQuery(this).attr('src'); 
       var alt = jQuery(this).attr('alt'); 

      elements+= '<div class="image-div"><img class="round'+i+'" src="'+location+''+url+'" alt="'+alt+'"/></div>'; 

     }); 

     $('.content').append(elements).shuffle().masonry('reload'); 
     //$(".content .image-div").shuffle(); 
     } 
    }); 

私はこれを見てきました - jquery, masonry after append complete このjQuery Masonry and Ajax Append Items?

をリロード上のプラグインがロードするために、画像のを待つ必要がある場合、私はちょうど思ったんだけど?もしそうなら、これの構文は何ですか?

私もブロック(可視性:隠された)を非表示にする予定。、ランダムな順序にそれらをシャッフルし、その後でそれらをフェードインし、それらを石工

すべてのヘルプは素晴らしいだろう、私は困惑します。 ありがとう非常にありがとう

答えて

0

jQuery​​関数は、問題を解決するのに役立ちます。

は、私がtotalImageimageCount変数を作成し、次のコード、

var totalImage = 0, imageCount = 0; 
$.ajax({ 
    type: "GET", 
    url: "/galleries/_archive/PhotoGallery.xml", // replace with absolute URL of your gallery's xml file 
    dataType: "xml", 
    success: function(xml) { 
     totalImage = jQuery(xml).find("img").length; 
     jQuery(xml).find('img').each(function(i) { 
      var location = "/galleries/_archive/"; // replace with absolute path to the directory that holds your images 
      var url = jQuery(this).attr('src'); 
      var alt = jQuery(this).attr('alt'); 

     elements+= '<div class="image-div"><img class="round'+i+'" src="'+location+''+url+'" alt="'+alt+'"/></div>'; 

    }); 

    $('.content').append(elements).shuffle(); 

    $('.image-div img').load(function() { 
     imageCount++; 
     if(totalImage == imageCount){ 
     $('.content').masonry('reload'); 
     } 
}); 

で試してみてください。イメージのロードイベントで、すべてのイメージがロード完了していることを確認しました。もしtotalImageとimageCountが同じであれば、すべてがロード完了したことを意味し、私はmasonry('reload')関数を呼び出しました。

+0

ありがとう私はそこに着いていると感じています。このソリューションに基づいたテストページです - http://underwaterpistol.co.uk/test/index.html、最初に読み込まれたときに哀れみが跳ね返り、とにかく一度に10枚または15枚の画像しかロードできませんか?私は可視性を追加することを考えていました:画像に隠されて、ページが読み込まれた時に視認性を追加:可視?これは負荷の急上昇を止める最善の方法ですか?助けを借りてありがとう –

+0

はい、最良の方法は可視性を使用しています:非表示/可視性:可視または表示:なし/表示:ジャンプを避けるために完了した後に画像を表示するためのイニシャル – sureshunivers

0

イメージが完全に読み込まれる前に、MasonryがDOM上で動作しているようです。この問題を解決するために石造が付属していますimagesLoadedメソッドを使用します。

編集:

CSS

:そのイメージが完全にロードされたときにチャンクで
ロード画像、各チャンクが見えるようになります
.hidden { 
    display: none; 
} 

JavaScript

/* 
* Splits an array into subarrays of length "len". 
* 
* see: http://stackoverflow.com/a/11764168/159570 
*/ 
function chunk(arr, len) { 
    var chunks = []; 
    var i = 0; 
    var n = arr.length; 
    while (i < n) { 
     chunks.push(arr.slice(i, i += len)); 
    } 
    return chunks; 
} 

var chunkSize = 10; // images per chunk 
var $content = $('.content').masonry(); 
$.ajax({ 
    type: "GET", 
    url: "/galleries/_archive/PhotoGallery.xml", 
    dataType: "xml", 
    success: function(xml) { 
     var allImages = $(xml).find('img').get(); 
     var imageArrayChunks = chunk(allImages, chunkSize); 
     $.each(imageArrayChunks, function(i, imageArray) { 
      var elements = ''; 
      $.each(imageArray, function(j, image) { 
       var location = "/galleries/_archive/"; 
       var $image = $(image); 
       var url = $image.attr('src'); 
       var alt = $image.attr('alt'); 
       var index = i*j + j; // original unchunked index 
       elements += '<div class="image-div hidden"><img class="round'+index+'" src="'+location+url+'" alt="'+alt+'"/></div>'; 
      }); 
      $content.append(elements).shuffle(); 
      $content.imagesLoaded(function(images) { 
       $content.masonry('reload'); 
       $(images).parent().removeClass('hidden'); 
      }); 
      console.log('Chunk #'+i+' loaded...'); 
     }); 
    } 
}); 
+0

これは良いですが、私のためにhttp://underwaterpistol.co.uk/test/three.html最初の数回はすべてを一度にロードしてから、それを並べ替えます。もう一度、一度に10〜15枚の画像を読み込む必要があります。これが可能です?助けてくれてありがとう。 –

+0

明確にする:10〜15枚の画像を読み込み、一度に表示してから、次のバッチなどの読み込みを開始しますか?または、あなたはそれらのすべてを同時に表示したいですか? –

+0

私は最初のものと仮定しています。 –

0

各要素の高さと幅をXMLファイル内に格納できる場合は、これらのディメンションは、append文で使用できます。そうすることで、画像がブラウザーに読み込まれるのを待たずに、メーソンリーが動作するようになります。このようにして、イメージがロードされた後にブラウザがレイアウトをリフローする必要がなくなり、スムーズな操作(「ジャンク」やバウンス)やページの読み込み速度が向上します。

さらに、実装するのも簡単です(特にXMLファイルをどうにか生成しなければならないと考えると)。ちょうど楽しみのため

var elements = ''; 

$.ajax({ 
    type: "GET", 
    url: "/galleries/_archive/PhotoGallery.xml", // replace with absolute URL of your gallery's xml file 
    dataType: "xml", 
    success: function(xml) { 
     jQuery(xml).find('img').each(function(i) { 
      var location = "/galleries/_archive/"; // replace with absolute path to the directory that holds your images 

      var that= jQuery(this), 
       url = that.attr('src'), 
       alt = that.attr('alt'), 
       h = that.attr('height'), 
       w = that.attr('width'); 

     elements+= '<div class="image-div"><img class="round'+i+'" src="'+location+''+url+'" alt="'+alt+'" height="'+h+'" width="'+w+'"/></div>'; 

    }); 

    $('.content').append(elements).shuffle().masonry(); 
    } 
}); 

理論画像で

CSS

.content img{ 
    opacity:0; 
    -moz-transition:opacity 1s; 
    -webkit-transition:opacity 1s; 
    transition:opacity 1s; 
} 

.content .loadedImg{ 
    opacity:1; 
} 

JS

$('.content').on('load', 'img', function(){ 
    $(this).addClass('loadedImg'); 
}); 

は今一度本当素敵にフェードインしますyはcss3でサポートされているブラウザに完全に読み込まれます。

+0

このソリューションはうまく見えますが、残念ながら私は外部システムによって生成されたXMLにアクセスできません。 –

+0

lameなので、XMLを返すAPIを持っていますか? – Fresheyeball

関連する問題