masonry + Область видимости jquery

Главные вкладки

Аватар пользователя Dorian76453 Dorian76453 22 мая 2015 в 19:11

Всем привет.
Такое дело.
Использую masonry для вывода вьюшки сетки.
Второй день пытаюсь прикрутить скрипт для подгрузки контента который попадает в область видимости окна браузера.
пейдежры не подходят, т.к. мне нужно подгрузить не новую страницу, а просто повесить событие.а ниже постраничный пейджер.

Постараюсь немного подробней:

использую animate библиотеку.
для контейнера masonry-item установлен стиль

 .masonry-item{
     opacity: 0;
 }

подключил скрипт и библиотеку:
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

    $(window).scroll(function () {
        $('.masonry-item').each(function () {
            var imagePos = $(this).offset().top;
            var bottomOfWindow = $(window).scrollTop() + $(window).height();
            if (imagePos <= bottomOfWindow ) {
                $(this).addClass("fadeInUp");
            }
        });
    });

он назначает класс fadeInUp для создания анимации с помощью библиотеки animate, но суть не в этом.
тут все хорошо, все работает.

Проблема вот в чем, при загрузке страницы в область видимости попадает n число нод. Т.е. они должны при загрузке страницы уже иметь класс fadeInUp (который и делает анимацию).

в js я не силен, и попробовал использовать код выше долько установть $(document).ready

    $(document).ready(function () {
        $('.masonry-item').each(function () {
            var imagePos = $(this).offset().top;
            var bottomOfWindow = $(window).scrollTop() + $(window).height();
            if (imagePos <= bottomOfWindow ) {
                $(this).addClass("fadeInUp");
            }
        });
    });  

а теперь главная проблема. если зайдете сюда:
dideas.ru
увидите что класс установился только на 1. ноду. а при скроле появляются остальные...

поковырявшись немного, сделал следующее. в этом же скрипте вывел с помощью alert var imagePos, как я понял это положение top контейнера на странице.
тут я понял что по умолчанию вьюха выводит все ноды как unformated list и они идут друг за другом в одну колонку. и получается что вторая нода имеет imagePos +500px(высота контейнера с нодой) и не попадает во вьюпорт.
а вот если поставить opacity: 1 для контейнера, то они все отображаються нормально, но при этом анимация происходит так же криво.
как такое может быть?

Буду признателен за любую помощь в том вопросе.

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 23 мая 2015 в 9:11

В Drupal js way для отслеживания нового DOM контента в way используется конструкция типа:
- context принимает новые элементы
- once нужен чтобы не делать повторных действий

(function ($) {
...
/**
 * Field instance settings screen: force the 'Display on registration form'
 * checkbox checked whenever 'Required' is checked.
 */

Drupal.behaviors.fieldUserRegistration = {
  attach: function (context, settings) {
    var $checkbox = $('form#field-ui-field-edit-form input#edit-instance-settings-user-register-form');

    if ($checkbox.length) {
      $('input#edit-instance-required', context).once('user-register-form-checkbox', function () {
        $(this).bind('change', function (e) {
          if ($(this).attr('checked')) {
            $checkbox.attr('checked', true);
          }
        });
      });

    }
  }
};

})(jQuery);

Если библиотека не укладывается в эту религию или нужны дополнительные возможности, посмотрите в сторону использования своих событий выкидывая их через .trigger и отслеживания например через .bind