InfiniteScroll と Masonry がうまく連携することはわかっています。しかし、私は Yii の Infinite Scroll Extension (yiinfinite-scroll と呼ばれる) を使用しており、Masonry を適用しようとしました。Infinite Scroll 自体は完璧に機能し、Masonry 自体も完璧に機能します。しかし、InfiniteScroll が新しい一連の画像を読み込もうとした後 (私は画像ページを持っています)、InfiniteScroll のコールバック部分は起動していないようです。これは、新しく追加された要素には石積みのコードが含まれておらず、背後に表示されるためです。最初に見えるアイテム。(このバグが頻繁に報告されることは知っていますが、これまでに見つけた解決策はうまくいきませんでした)。
写真を表示するための私の構造は次のようになります。
<div class="items">
<div class="pic">...</pic>
<div class="pic">...</pic>
...
</div>
最初のページ読み込みは次のようになります
<div class="items masonry" style="...">
<div class="pic masonry-brick" ...></div>
<div class="pic masonry-brick" ...></div>
...
</div> // everything's fine, masonry is injected into the code
無限スクロールが動的に新しい画像をロードした後、これらは次のようになります。
<div class="items masonry" ...></div>
<div class="pic masonry-brick" ...></div>
...
// appended pics:
<div class="pic"></div>
<div class="pic"></div>
</div> // so no masonry functionality was applied
私のメーソンリーコード:
$(function (){
var $container = $('.items');
$container.imagesLoaded(function(){
$container.masonry({
itemSelector: '.pic',
columnWidth: 405
});
});
});
$container.infinitescroll({
// normally, the options are found here. but as I use infinitescroll as a Yii extension, the plugin is already initiated with options
}
},
// trigger Masonry as a callback
function( newElements ) {
// hide new items while they are loading
var $newElems = $( newElements ).css({ opacity: 0 });
// ensure that images load before adding to masonry layout
$newElems.imagesLoaded(function(){
// show elems now they're ready
$newElems.animate({ opacity: 1 });
$container.masonry( 'appended', $newElems, true );
});
});
});
また、拡張フォルダー内の現在の InfiniteScroll-min.js ファイルを最新のものにコピーして置き換えようとしました。同じ効果...
よろしく、 セバスチャン