lazyload - предварительная загрузка соседних изображений

В настоящее время я настраиваю купленную мной тему WordPess, которая использует функцию lazyload в своих галереях изображений.

Как и сейчас, функция lazyload загружает только видимое изображение (которое затем кэшируется). Смежные изображения скрыты снизу и будут загружены только после того, как станут видимыми, щелкнув СЛЕДУЮЩАЯ / ПРЕДЫДУЩАЯ в галерее.

Это приводит к тому, что между изображениями на секунду пропадает изображение, что кажется довольно неудобным. Как только изображения кэшируются, весь СЛЕДУЮЩИЙ / ПРЕДЫДУЩИЙ процесс кажется намного более плавным.

Кто-нибудь знает, есть ли способ настроить следующий код lazyload таким образом, чтобы он заранее загружал не только текущее, но также следующее и предыдущее изображение? Возможно ли это даже в этой части кода?

Я некоторое время пытался найти дорогу сам, но не смог ее решить...

Прошу прощения за ужасное форматирование, именно так и поступил файл с темой. РЕДАКТИРОВАТЬ: переформатировать код для лучшей читаемости.

/*
 * Lazy Load - jQuery plugin for lazy loading images
 *
 * Copyright (c) 2007-2012 Mika Tuupola
 *
 * Licensed under the MIT license:
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * Project home:
 *   http://www.appelsiini.net/projects/lazyload
 *
 * Version:  1.8.0
 *
 */
(function(a, b) {
    var c = a(b);
    a.fn.lazyload = function(d) {
        function h() {
            var b = 0;
            e.each(function() {
                var c = a(this);
                if (g.skip_invisible && !c.is(":visible")) return;
                if (!a.abovethetop(this, g) && !a.leftofbegin(this, g))
                    if (!a.belowthefold(this, g) && !a.rightoffold(this, g)) c.trigger("appear");
                    else if (++b > g.failure_limit) return !1
            })
        }
        var e = this,
            f, g = {
                threshold: 0,
                failure_limit: 0,
                event: "scroll",
                effect: "show",
                container: b,
                data_attribute: "original",
                skip_invisible: !0,
                appear: null,
                load: null
            };
        return d && (undefined !== d.failurelimit && (d.failure_limit = d.failurelimit, delete d.failurelimit), undefined !== d.effectspeed && (d.effect_speed = d.effectspeed, delete d.effectspeed), a.extend(g, d)), f = g.container === undefined || g.container === b ? c : a(g.container), 0 === g.event.indexOf("scroll") && f.bind(g.event, function(a) {
            return h()
        }), this.each(function() {
            var b = this,
                c = a(b);
            b.loaded = !1, c.one("appear", function() {
                if (!this.loaded) {
                    if (g.appear) {
                        var d = e.length;
                        g.appear.call(b, d, g)
                    }
                    a("<img />").bind("load", function() {
                        c.hide().attr("src", c.data(g.data_attribute))[g.effect](g.effect_speed), b.loaded = !0;
                        var d = a.grep(e, function(a) {
                            return !a.loaded
                        });
                        e = a(d);
                        if (g.load) {
                            var f = e.length;
                            g.load.call(b, f, g)
                        }
                    }).attr("src", c.data(g.data_attribute))
                }
            }), 0 !== g.event.indexOf("scroll") && c.bind(g.event, function(a) {
                b.loaded || c.trigger("appear")
            })
        }), c.bind("resize", function(a) {
            h()
        }), h(), this
    }, a.belowthefold = function(d, e) {
        var f;
        return e.container === undefined || e.container === b ? f = c.height() + c.scrollTop() : f = a(e.container).offset().top + a(e.container).height(), f <= a(d).offset().top - e.threshold
    }, a.rightoffold = function(d, e) {
        var f;
        return e.container === undefined || e.container === b ? f = c.width() + c.scrollLeft() : f = a(e.container).offset().left + a(e.container).width(), f <= a(d).offset().left - e.threshold
    }, a.abovethetop = function(d, e) {
        var f;
        return e.container === undefined || e.container === b ? f = c.scrollTop() : f = a(e.container).offset().top, f >= a(d).offset().top + e.threshold + a(d).height()
    }, a.leftofbegin = function(d, e) {
        var f;
        return e.container === undefined || e.container === b ? f = c.scrollLeft() : f = a(e.container).offset().left, f >= a(d).offset().left + e.threshold + a(d).width()
    }, a.inviewport = function(b, c) {
        return !a.rightofscreen(b, c) && !a.leftofscreen(b, c) && !a.belowthefold(b, c) && !a.abovethetop(b, c)
    }, a.extend(a.expr[":"], {
        "below-the-fold": function(b) {
            return a.belowthefold(b, {
                threshold: 0
            })
        },
        "above-the-top": function(b) {
            return !a.belowthefold(b, {
                threshold: 0
            })
        },
        "right-of-screen": function(b) {
            return a.rightoffold(b, {
                threshold: 0
            })
        },
        "left-of-screen": function(b) {
            return !a.rightoffold(b, {
                threshold: 0
            })
        },
        "in-viewport": function(b) {
            return !a.inviewport(b, {
                threshold: 0
            })
        },
        "above-the-fold": function(b) {
            return !a.belowthefold(b, {
                threshold: 0
            })
        },
        "right-of-fold": function(b) {
            return a.rightoffold(b, {
                threshold: 0
            })
        },
        "left-of-fold": function(b) {
            return !a.rightoffold(b, {
                threshold: 0
            })
        }
    })
})(jQuery, window)

2 ответа

Если вы используете Intersection Observer API (или плагин, который использует этот API), вы можете воспользоваться настройкой "rootMargin". Например, установив его на "800px", оно будет лениво загружать изображение 800px, прежде чем оно войдет в область просмотра.

Не модифицируйте библиотек. Вместо этого вызвать событие lazyload

Загрузка события от события Вы можете использовать событие jQuery, например: click или же mouseover, Вы также можете использовать пользовательские события, такие как sporty или же foobar, По умолчанию стоит подождать, пока пользователь не прокрутит вниз и изображение не появится в окне просмотра.

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

$("img.lazy").lazyload({
    event : "customloadimage" 
});

А потом в вашем JQuery использовать $image.trigger('customloadimage');(при условии, $image такое jQuery Object)

Рекомендации:

https://www.appelsiini.net/projects/lazyload

http://api.jquery.com/trigger/

Другие вопросы по тегам