Помогите с плагином Jquery + Masonry: как развернуть / свернуть блоки для раскрытия контента - PullRequest
2 голосов
/ 13 июня 2010

Я использую плагин masonry jquery для проекта: (http://desandro.com/resources/jquery-masonry)

По сути, у меня есть набор ящиков (миниатюр) в сетке. Когда щелкаешь по одному, я хочу его развернуть добольший размер, чтобы показать больше контента (дополнительные изображения и текст). Я борюсь с тем, как заставить миниатюру исчезать, а затем отображать новый контент в расширенном окне. Я не знаю, как заставить новый контент появляться или гдечтобы сохранить его на моей странице - и на нем должна быть кнопка закрытия? Создатель плагина дал мне быстрый совет для расширяющейся части, но код, который я использую, имеет заданную высоту и ширину, и я хочу, чтобы онибыть переменным в зависимости от того, сколько контента находится в развернутом состоянии.

Вот мой код jquery: http://pastie.org/1002101

Это аналогичный пример поведения, которого я хочу достичь (кроме моегоящики будут иметь различные расширенные размеры): (http://www.learnsomethingeveryday.co.uk)

Вы также заметите из этого примера, что он позволяет расширять только 1 ящик за раз - я также хотел бы иметь эту функциюрациональность.

Извините за все вопросы - я довольно новичок в jquery, любая помощь будет потрясающей!

Ответы [ 3 ]

3 голосов
/ 13 июня 2010

Попробуйте это ( демо здесь ):

$(document).ready(function(){

 $('#grid').masonry({
    singleMode: false,
    itemSelector: '.box',
    animate: true
 });

 $('.box').click(function(){
  if ($(this).is('.expanded')){
   restoreBoxes();
  } else {
   restoreBoxes();
   $(this)
    // save original box size
    .data('size', [ $(this).width(), $(this).height() ])
    .animate({
      width: 335,
      height: 335
     }, function(){
      $('#grid').masonry();
    })
    .addClass('expanded');
  }

  function restoreBoxes(){
   var len = $('.expanded').length - 1;
   $('.expanded').each(function(i){
    var box = $(this).data('size');
    $(this).animate({
      width: ( box[0] || 100 ),
      height: ( box[1] || 'auto' )
     }, function(){
        if (i >= len) {
       $('#grid').masonry();
      }
    })
    .removeClass('expanded');
   })
  }
 });
});

Обновление: Привет, Джем, я не знал, что ты оставил комментарий для меня, в следующий раз, пожалуйста, добавь комментарии под ответом или обнови свой вопрос. Также вы можете поставить «@» перед именем человека, и он получит флаг сообщения.

В ответ на ваш вопрос о размере набора и скрытом контенте я изменил демо 1010 * (в основном все HTML и CSS включены), чтобы отображать блоки различной ширины. Если щелкнуть поле, чтобы развернуть все скрытое содержимое, возникает небольшая проблема. Обычно скрытый контент имеет высоту и ширину ноль. Но jQuery может определить размер скрытого контента, но у него все еще есть некоторые проблемы, потому что вам может потребоваться ограничить ширину или высоту скрытого контента. Так что я закончил тем, что добавил скрытое содержимое внутри блока и добавил атрибут data-size в блок, который содержит ширину и высоту раскрытого скрытого содержимого, например:

<div class="box" data-size="380,380">
    <p>This is the visible content.</p>
    <div class="expandable">
        This is the hidden content which shows when the box is clicked.
    </div>
</div>

Я также включил способ скрытия видимого содержимого при развертывании поля, добавив класс hideable к содержимому, поскольку на предоставленном изображении, по-видимому, скрыто исходное содержимое:

<div class="box" data-size="380,380">
    <p class="hideable">This is the visible content.</p>
    <div class="expandable">
        This is the hidden content which shows when the box is clicked.
    </div>
</div>

Если атрибут data-size не установлен, сценарий по умолчанию установит defaultSize:

Примечание в демоверсии используется $(document).ready(function(){...}) вместо $(window).load(function(){...}), как рекомендовано автором кладки, поскольку jFiddle просто не хочет работать с загрузкой окна.

$(window).load(function () {

    var defaultSize = [180, 180]; // expanded box size: [width , height]
    $('#grid').masonry({
        singleMode: false,
        columnWidth: 100,
        resizeable: true,
        itemSelector: '.box',
        animate: true
    });

    $('.box').click(function () {
        if ($(this).is('.expanded')) {
            restoreBoxes();
        } else {
            var size = ($(this).attr('data-size')) ? $(this).attr('data-size').split(',') : defaultSize;
            $(this)
            // save original box size
            .data('size', [$(this).width(), $(this).height()]).animate({
                width: size[0],
                height: size[1]
            }, function () {
                // show hidden content when box has expanded completely
                $(this).find('.expandable').show('slow');
                $(this).find('.hideable').hide('slow');
                $('#grid').masonry();
            });
            restoreBoxes();
            $(this).addClass('expanded');
        }

        function restoreBoxes() {
            var len = $('.expanded').length - 1;
            $('.expanded').each(function (i) {
                var box = $(this).data('size');
                $(this).find('.expandable').hide('slow');
                $(this).find('.hideable').show('slow');
                $(this).animate({
                    width: (box[0] || 100),
                    height: (box[1] || 'auto')
                }, function () {
                    if (i >= len) {
                        $('#grid').masonry();
                    }
                }).removeClass('expanded');
            })
        }
    });
});
0 голосов
/ 08 декабря 2010

У меня есть идея для этого.Вы можете изменить код так:

$('.box').click(function(){
   restoreBoxes();
   $(this)
    // save original box size
    .data('size', [ $(this).width(), $(this).height() ])
    .animate({
      width: 335,
      height: 335
     }, function(){
      $('#grid').masonry();
    })
    .addClass('expanded');
  }

 $( '.expanded' ).find('.main_img').click(function() {
    restoreBoxes();
 });

Вам все еще понадобится код, который определяет функцию restoreBoxes и вызов Masonry сверху, я включил только код, который нужно добавить.Таким образом, полный код будет выглядеть так:

$(document).ready(function(){

 $('#grid').masonry({
    singleMode: false,
    itemSelector: '.box',
    animate: true
 });

 $('.box').click(function(){
   restoreBoxes();
   $(this)
    // save original box size
    .data('size', [ $(this).width(), $(this).height() ])
    .animate({
      width: 335,
      height: 335
     }, function(){
      $('#grid').masonry();
    })
    .addClass('expanded');
  }

  $( '.expanded' ).find('.main_img').click(function() {
      restoreBoxes();
  });

  function restoreBoxes(){
   var len = $('.expanded').length - 1;
   $('.expanded').each(function(i){
    var box = $(this).data('size');
    $(this).animate({
      width: ( box[0] || 100 ),
      height: ( box[1] || 'auto' )
     }, function(){
        if (i >= len) {
       $('#grid').masonry();
      }
    })
    .removeClass('expanded');
   })
  }
 });
});

Я не уверен, является ли это наиболее эффективным способом, но я попробовал версию этого на сайте, над которым я работаю, и был успешным.Это должно привести к сбою div только при нажатии на изображение в расширенном div с классом «.main_img».Вы можете заменить это любым именем класса, которое хотите, но убедитесь, что изображение, на котором вы хотите щелкнуть, чтобы закрыть div, имеет этот класс.Если вы хотите, чтобы любое изображение в расширенном div закрывало div, вы можете просто использовать «img» вместо «.main_img».Дайте мне знать, как это работает, и если вы обнаружите какие-либо ошибки, опубликуйте их здесь.

0 голосов
/ 22 июня 2010
  • извините, я пока не могу комментировать другие вопросы (отсюда и поле для ответов)

@ fudgey

У меня есть эта работа с фильтром jquery, помогла фуджимой с.Моя проблема в том, что по какой-то причине в Google Chrome элементы каменной кладки, похоже, не заканчивают позиционироваться при загрузке страницы.После того, как что-то щелкнуло, все в порядке, просто начальная загрузка страницы проблематична.Где / как бы установить время загрузки для кладки?

Кроме того, есть ли способ заставить работать курсор над этим?В настоящее время пользователь не знает, как щелкать элементы.

...