Добавление изображений к содержимому и перезагрузка каменной кладки

У меня есть файл 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 после завершения добавления и это jQuery Masonry и элементы добавления Ajax?

Мне просто интересно, должен ли плагин при перезагрузке ждать загрузки изображений? Если да, то каков синтаксис для этого?

Я также планирую скрыть блоки (видимость: скрытый), перетасовать их в случайном порядке, а затем выложить их, а затем затемнить.

Любая помощь была бы потрясающей, я в тупике. Большое спасибо


person Tara Irvine    schedule 19.09.2012    source источник


Ответы (3)


Функция jQuery .load() поможет решить проблему.

Попробуйте со следующим кодом,

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. В событии загрузки изображения я проверил, что все изображения загружены. Если totalImage и imageCount одинаковы, это означает, что загрузка завершена, тогда я вызвал функцию masonry('reload').

person sureshunivers    schedule 25.09.2012
comment
Спасибо, я чувствую, что мы справились. Вот тестовая страница, основанная на этом решении - underwaterpistol.co .uk/test/index.html, жаль, что материал подпрыгивает при первой загрузке, можно ли загружать только 10 или 15 изображений за раз? Я думал о том, чтобы добавить видимость: скрыто к изображениям, а когда страница загрузится, добавить видимость: видимость? это лучший способ остановить скачок при нагрузке? Большое спасибо за помощь - person Tara Irvine; 27.09.2012
comment
Да, лучше всего использовать visibility:hidden / visible:visible или display:none / display:initial для отображения изображений после завершения загрузки, чтобы избежать скачка - person sureshunivers; 03.10.2012

Похоже, Masonry работает с DOM до полной загрузки изображений. Используйте метод imagesLoaded, поставляемый с Masonry, чтобы исправить это:

Редактировать. Загружает изображения фрагментами, каждый фрагмент становится видимым, когда его изображения полностью загружены:

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...');
        });
    }
});
person Joe Coder    schedule 27.09.2012
comment
Спасибо за ответ, он выглядит хорошо, но плохо загружается underwaterpistol.co.uk/test/three .html у меня первые несколько раз он загружается все сразу, а затем сам разбирается, опять же мне нужна ленивая загрузка 10-15 изображений за раз, возможно ли это? Спасибо еще раз за помощь. - person Tara Irvine; 27.09.2012
comment
Просто для уточнения: вы хотите, чтобы 10-15 изображений загружались, затем появлялись сразу, затем начиналась загрузка следующего пакета и т. д.? Или вы хотите, чтобы они ВСЕ появились одновременно? - person Joe Coder; 28.09.2012
comment
Я предполагаю первое. Дайте мне знать, если вы хотите что-то другое :) - person Joe Coder; 28.09.2012
comment
Ваша текущая веб-страница не работает, потому что отсутствует <script>, определяющий shuffle(). - person Joe Coder; 28.09.2012
comment
Спасибо всем за ответы, эти ответы являются отличным пониманием того, как это можно сделать. - person Tara Irvine; 01.10.2012

Если вы можете сохранить высоту и ширину каждого элемента в вашем файле XML. Вы можете использовать эти размеры в своем операторе добавления. Это позволит masonry работать БЕЗ ожидания загрузки изображений в браузере. Таким образом, браузеру не придется «переформатировать» макет после загрузки изображений, что приведет к более плавному восприятию (меньше «дерганий» или подпрыгивания) и более быстрой воспринимаемой загрузке страницы.

Кроме того, его чертовски просто реализовать (особенно если учесть, что вам все равно нужно каким-то образом сгенерировать файл 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');
});

Теоретически изображения теперь будут очень красиво исчезать, как только они полностью загрузятся в браузерах с поддержкой css3.

person Fresheyeball    schedule 28.09.2012
comment
Это решение выглядит хорошо, но, к сожалению, я не могу получить доступ к XML, сгенерированному внешней системой. Но спасибо за это! - person Tara Irvine; 01.10.2012
comment
хромой, так у вас есть API, с которым вы работаете, который возвращает XML? - person Fresheyeball; 02.10.2012