Помощь Проблемы с lazy load и fancybox

Статус
В этой теме нельзя размещать новые ответы.

kira1992

Создатель
Регистрация
17 Май 2013
Сообщения
34
Реакции
11
Всем привет!
Суть проблемы:
*Есть скачанный из интернета шаблон для Джумлы 3.6
*В этом шаблоне есть подключенная галерея Fancybox (написанная на js)
*Также подключен и плагин lazy load - ленивая загрузка изображений (написанный на js)

Но к сожалению авторы шаблона не настроили все это и поэтому мне самому сейчас приходится ломать голову и дорабатывать шаблон.
Все бы ничего, но проблема усугубляется еще тем, что мои значения JavaScript - а находятся на уровне: "Прочитал мануал, сделал копипаст...".

Вот ссылка на сайт:

Ссылка на сайт удалена т.к. проблема решена.

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

Значит проблемы тут две:
1) Основная проблема связана с lazy load и заключается в том, что изображения появляются только в том случае, если сделать scrolling мышкой хотя бы на 1 пиксель. Если же ничего не прокручивать, то не появляются вовсе, хоть и на этот момент они уже полностью загружены.

Вы можете это увидеть, если перейдете на сайте в:
Портфолио ---> Категории: Индивидуальная---> Галерея 01 (та, что слева)

В первой галерее включен lazy load и изображения появляются только после скроллинга.

Вот Код lazy load:
Код:
(function($, window, document, undefined) {
    var $window = $(window);

    $.fn.lazyload = function(options) {
        var elements = this;
        var $container;
        var settings = {
            threshold       : 0,
            failure_limit   : 0,
            event           : "scroll",
            effect          : "show",
            container       : window,
            data_attribute  : "original",
            skip_invisible  : true,
            appear          : null,
            load            : null,
            //placeholder     : "images/blank.gif"
        };

        function update() {
            var counter = 0;

            elements.each(function() {
                var $this = $(this);
                if (settings.skip_invisible && !$this.is(":visible")) {
                    return;
                }
//                if(settings.skip_invisible && $($this).parents('.isotope-item').hasClass('isotope-hidden')){ return; }
                if ($.abovethetop(this, settings) ||
                    $.leftofbegin(this, settings)) {
                        /* Nothing. */
                } else if (!$.belowthefold(this, settings) &&
                    !$.rightoffold(this, settings)) {
                        $this.trigger("appear");
                        /* if we found an image we'll load, reset the counter */
                        counter = 0;
                } else {
                    if (++counter > settings.failure_limit) {
                        return false;
                    }
                }
            });

        }

        if(options) {
            /* Maintain BC for a couple of versions. */
            if (undefined !== options.failurelimit) {
                options.failure_limit = options.failurelimit;
                delete options.failurelimit;
            }
            if (undefined !== options.effectspeed) {
                options.effect_speed = options.effectspeed;
                delete options.effectspeed;
            }

            $.extend(settings, options);
        }

        /* Cache container as jQuery as object. */
        $container = (settings.container === undefined ||
                      settings.container === window) ? $window : $(settings.container);

        /* Fire one scroll event per scroll. Not one scroll event per image. */
        if (0 === settings.event.indexOf("scroll")) {
            $container.bind(settings.event, function() {
                return update();
            });
        }

        this.each(function() {
            var self = this;
            var $self = $(self);

            self.loaded = false;

            /* If no src attribute given use data:uri. */
            if ($self.attr("src") === undefined || $self.attr("src") === false) {
                if ($self.is("img")) {
                    $self.attr("src", settings.placeholder);
                }
            }

            /* When appear is triggered load original image. */
            $self.one("appear", function() {
                if (!this.loaded) {
                    if (settings.appear) {
                        var elements_left = elements.length;
                        settings.appear.call(self, elements_left, settings);
                    }
                    $("<img />")
                        .bind("load", function() {

                            var original = $self.attr("data-" + settings.data_attribute);
                            $self.hide();
                            if ($self.is("img")) {
                                $self.attr("src", original);
                            } else {
                                $self.css("background-image", "url('" + original + "')");
                            }
                            $self[settings.effect](settings.effect_speed);

                            self.loaded = true;

                            /* Remove image from array so it is not looped next time. */
                            var temp = $.grep(elements, function(element) {
                                return !element.loaded;
                            });
                            elements = $(temp);

                            if (settings.load) {
                                var elements_left = elements.length;
                                settings.load.call(self, elements_left, settings);
                            }
                        })
                        .attr("src", $self.attr("data-" + settings.data_attribute));
                }
            });

            /* When wanted event is triggered load original image */
            /* by triggering appear.                              */
            if (0 !== settings.event.indexOf("scroll")) {
                $self.bind(settings.event, function() {
                    if (!self.loaded) {
                        $self.trigger("appear");
                    }
                });
            }
        });

        /* Check if something appears when window is resized. */
        $window.bind("resize", function() {
            update();
        });

        /* With IOS5 force loading images when navigating with back button. */
        /* Non optimal workaround. */
        if ((/(?:iphone|ipod|ipad).*os 5/gi).test(navigator.appVersion)) {
            $window.bind("pageshow", function(event) {
                if (event.originalEvent && event.originalEvent.persisted) {
                    elements.each(function() {
                        $(this).trigger("appear");
                    });
                }
            });
        }

        /* Force initial check if images should appear. */
        $(document).ready(function() {
            update();
        });

        return this;
    };

    /* Convenience methods in jQuery namespace.           */
    /* Use as  $.belowthefold(element, {threshold : 100, container : window}) */

    $.belowthefold = function(element, settings) {
        var fold;

        if (settings.container === undefined || settings.container === window) {
            fold = (window.innerHeight ? window.innerHeight : $window.height()) + $window.scrollTop();
        } else {
            fold = $(settings.container).offset().top + $(settings.container).height();
        }

        return fold <= $(element).offset().top - settings.threshold;
    };

    $.rightoffold = function(element, settings) {
        var fold;

        if (settings.container === undefined || settings.container === window) {
            fold = $window.width() + $window.scrollLeft();
        } else {
            fold = $(settings.container).offset().left + $(settings.container).width();
        }

        return fold <= $(element).offset().left - settings.threshold;
    };

    $.abovethetop = function(element, settings) {
        var fold;

        if (settings.container === undefined || settings.container === window) {
            fold = $window.scrollTop();
        } else {
            fold = $(settings.container).offset().top;
        }

        return fold >= $(element).offset().top + settings.threshold  + $(element).height();
    };

    $.leftofbegin = function(element, settings) {
        var fold;

        if (settings.container === undefined || settings.container === window) {
            fold = $window.scrollLeft();
        } else {
            fold = $(settings.container).offset().left;
        }

        return fold >= $(element).offset().left + settings.threshold + $(element).width();
    };

    $.inviewport = function(element, settings) {
         return !$.rightoffold(element, settings) && !$.leftofbegin(element, settings) &&
                !$.belowthefold(element, settings) && !$.abovethetop(element, settings);
     };

    /* Custom selectors for your convenience.   */
    /* Use as $("img:below-the-fold").something() or */
    /* $("img").filter(":below-the-fold").something() which is faster */

    $.extend($.expr[":"], {
        "below-the-fold" : function(a) { return $.belowthefold(a, {threshold : 0}); },
        "above-the-top"  : function(a) { return !$.belowthefold(a, {threshold : 0}); },
        "right-of-screen": function(a) { return $.rightoffold(a, {threshold : 0}); },
        "left-of-screen" : function(a) { return !$.rightoffold(a, {threshold : 0}); },
        "in-viewport"    : function(a) { return $.inviewport(a, {threshold : 0}); },
        /* Maintain BC for couple of versions. */
        "above-the-fold" : function(a) { return !$.belowthefold(a, {threshold : 0}); },
        "right-of-fold"  : function(a) { return $.rightoffold(a, {threshold : 0}); },
        "left-of-fold"   : function(a) { return !$.rightoffold(a, {threshold : 0}); }
    });

})(jQuery, window, document);



jQuery(function() {
     jQuery("img.lazy").lazyload({
         effect : "fadeIn"
     });
  });
 
Последнее редактирование:
Теперь о том, как я пытался решить проблему:

Я пробовал заменить тут в коде

event : "scroll",
на
event : "load",

Но такой вариант решения проблемы не подходит т.к. в этом шаблоне все разделы на сайте загружаются сразу с загрузкой главной страницы сайта и если сделать так, то вес главной страницы получается просто огромным (загружаются все изображения из галерей).
Я также пробовал прописывать width и height для <img> прямо в html, но и это не помогло.

Единственное, что мне помогло это
добавить такой код в js:

Код:
function myFunction() {
  setTimeout(function() {
    window.scrollBy(0, 1)
  }, 400);;
}

И ссылку ведущую на содержимое первой галереи сделать такой:

<a href="#gallery01" onClick="myFunction()"></a>

Но это не решение проблемы, а ее маскировка. Страница постоянно будет съезжать туда-сюда на 1 пиксель и при обновлении страницы через кнопку в браузере это не работает (в мобильной версии сайта тоже проблемы).
Очень прошу, подскажите что именно поменять в коде lazy load, чтобы изображения появлялись сразу после того, как они загружены.
Я также пробовал сделать ленивую загрузку изображений с помощью расширений для Джумлы. К примеру с помощью расширения под названием JCH Optimize Pro. Но и там без скроллинга не обошлось...
Если кто-то знает и другие расширения, которые делают что-то отличное от данного расширения, то пишите названия... Я буду очень благодарен.
Но все же лучше через js решить проблему.

2) Теперь вторая проблема. Она уже не такая серьезная и ее можно даже не решать. Основная проблема все же первая. Но и про эту напишу.
Проблема заключается в том, что при нажатии на обложку любой из галерей, мы попадаем в нее, но окно браузера находится в том же месте, где и была обложка галереи. То есть фотки в галерее получается увидеть сначала откуда-то снизу, а потом приходится подниматься наверх. Это особенно заметно, если нажать на обложку одной из находящихся снизу галерей или же в мобильной версии сайта.
Я уже писал, что в js я полный ноль и поэтому пока не знаю как эту проблему решить.
Если бы тут был чистый html, то я просто назначил бы название какому-то элементу с верхней части страницы и ссылался бы на него, но тут ссылка на галерею уже выглядит как:
<a href="#gallery01"></a>
То есть сама галерея уже на этой странице. А значит таким способом тут не получится.
Если у кого есть идеи, то буду очень благодарен! Заранее спасибо!

Код Fancybox - а можно посмотреть тут:

Ссылка на сайт удалена т.к. проблема решена.
 
Последнее редактирование:
Флуд
Проблема решена. Тема более не актуальна.
 
Проблема решена. Тема более не актуальна.
За то, что не описано окончательное решение проблемы выдано нарушение.
На первый раз легкое.
Ибо тема просто флуд. Базар самим с собой.
Впредь за подобные ответы буду наказывать серьёзнее
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху