【问题标题】:lazy load with large number of images大量图像的延迟加载
【发布时间】:2018-05-14 14:44:46
【问题描述】:

我有这个延迟加载图像的代码:

$.fn.isInViewport = function() {
    var elementTop = $(this).offset().top;
    var elementBottom = elementTop + $(this).outerHeight();

    var viewportTop = $(window).scrollTop();
    var viewportBottom = viewportTop + $(window).height();

    return elementBottom > viewportTop && elementTop < viewportBottom;
};

$(window).on('scroll', function() {
    $('.imgli').each(function(){
        if ($(this).isInViewport()) {
            $(this).attr("src", $(this).attr("data-src")).removeAttr('data-src');
        }
    });
});

它适用于大约 700 张图片,但我很有趣 - 20.000 张图片(最多)呢?

有什么方法可以检查这一点,而无需真正加载 20.000 张图像,因为我现在还没有那么多。

每张图片最大约 100kb。

【问题讨论】:

    标签: javascript lazy-loading


    【解决方案1】:

    首先您可以随时复制现有图像以使其达到 20.000,尽管这有点毫无意义。

    其次您可以在每次出现在视口中时强制重新加载图片。

    $(window).on('scroll', function() {
        $('.imgli').each(function(){
            if ($(this).isInViewport()) {
                $(this).attr("src", $(this).attr("data-src") + "?" + $.now());
            }
        });
    });
    

    因此,您只需滚动页面,即可查看每次出现在视口中的图片是如何加载的。

    另外避免过度使用$(this)

    更好的方法是将其保存到变量中。这样可以节省内存。

    $(window).on('scroll', function() {
        $('.imgli').each(function() {
            var image = $(this);
            if (image.isInViewport()) {
                image.attr("src", image.attr("data-src") + "?" + $.now());
            }
        });
    });
    

    【讨论】:

    • 在这种情况下可能会更好 - var image = $('.imgli') - 并将其放在`$('.imgli').each(function() {...`之前
    • @puerto 实际上没有。因为那样你就不会指向当前的图像元素,而是指向所有。
    • 我明白了,但是在您的代码中,jquery 也每次都将imgli 作为一个对象并将它们转换为一个变量,不是吗?
    • @puerto 是的,但它需要当前元素,并且它会为出现在视口中的每个元素执行此操作。在您建议的解决方案中,您将为每个图像应用代码,而不仅仅是当前图像。它不会将其转换为变量,而只是将其保存为变量。
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2013-10-24
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多