当用户将图像滚动到视图中时如何动态(或延迟)加载图像

IT技术 javascript jquery html scroll lazy-loading
2021-02-05 21:06:45

我已经在许多“现代”网站(例如 facebook 和 google 图像搜索)中注意到这一点,其中折叠下方的图像仅当用户向下滚动页面足以将它们带入可见视口区域<img>才会加载(在查看源时,页面显示X标签,但它们不会立即从服务器获取)。这种技术叫什么,它是如何工作的以及它在多少浏览器中工作。是否有一个 jQuery 插件可以用最少的编码实现这种行为。

编辑

奖励:有人可以解释一下 HTML 元素是否有“onScrolledIntoView”或类似事件。如果没有,这些插件如何工作?

6个回答

这里的一些答案适用于无限页面。Salman 要求的是延迟加载图像。

插入

演示

编辑:这些插件如何工作?

这是一个简化的解释:

  1. 查找窗口大小并找到所有图像的位置及其大小
  2. 如果图像不在窗口大小范围内,请将其替换为相同大小的占位符
  3. 当用户向下滚动,并且图像位置 < 滚动 + 窗口高度时,图像被加载
在应用中,它们的工作方式不一样吗?在单列图像上无限滚动与延迟加载它们相同,对吗?也许我很困惑。
2021-03-22 21:06:45
这在桌面浏览器和 iOS 上运行良好,但不适用于 android(包括 3.x/4.x)。知道为什么吗?不支持滚动事件吗?
2021-03-25 21:06:45
@jwegner 无限滚动可让您在用户到达(或接近)底部时将新项目添加到页面底部。延迟加载的图像可以在页面上具有相同尺寸的占位符,图像本身在滚动时加载。因此,后者可以在不影响页面布局的情况下延迟加载。
2021-03-29 21:06:45
我正在浏览这个插件的文档,它似乎非常棒。打算在我的下一个项目中使用它。
2021-04-09 21:06:45
这是一个相关的插件,它可能以相同的方式工作:afarkas.github.io/lazysizes,但我相信它更健壮,并且使用了更多已有的东西(例如,不需要占位符,但如果你想)。
2021-04-13 21:06:45

我想出了我自己的基本方法,它似乎工作正常(到目前为止)。一些流行的脚本可能有很多我没有想到的东西。

注意- 此解决方案快速且易于实施,但当然对性能不利。当然考虑新的十字路口观察由提到Apoorv和解释developers.google如果性能是一个问题。

JQuery

$(window).scroll(function() {
    $.each($('img'), function() {
        if ( $(this).attr('data-src') && $(this).offset().top < ($(window).scrollTop() + $(window).height() + 100) ) {
            var source = $(this).data('src');
            $(this).attr('src', source);
            $(this).removeAttr('data-src');
        }
    })
})

示例 html 代码

<div>
    <img src="" data-src="pathtoyour/image1.jpg">
    <img src="" data-src="pathtoyour/image2.jpg">
    <img src="" data-src="pathtoyour/image3.jpg">
</div>

解释

当页面滚动时,页面上的每个图像都会被检查..

$(this).attr('data-src') - 如果图像具有属性 data-src

以及这些图像离窗口底部有多远..

$(this).offset().top < ($(window).scrollTop() + $(window).height() + 100)

将 + 100 调整为您喜欢的任何值(例如 - 100)

var source = $(this).data('src');- 获取data-src=aka 图像 url的值

$(this).attr('src', source); - 将该值放入 src=

$(this).removeAttr('data-src'); - 删除 data-src 属性(这样你的浏览器就不会浪费资源来处理已经加载的图像)

添加到现有代码

要转换您的 html,只需在编辑器中搜索并替换src="src="" data-src="

完美的。祝福家人🙏
2021-03-19 21:06:45

编辑:用存档副本替换损坏的链接)

AOL 的 Dave Artz 去年在 jQuery Conference Boston 上发表了关于优化的精彩演讲。AOL 使用名为 Sonar 的工具根据滚动位置进行按需加载。检查代码以了解它如何将 scrollTop(和其他)与元素偏移量进行比较的细节,以检测元素的部分或全部是否可见。

jQuery 声纳

Dave 在这些幻灯片中谈到了声纳声纳从幻灯片 46 开始,而整体“按需加载”讨论从幻灯片 33 开始。

我想知道这与 Appelsinii 的lazyload 相比如何?是不是更轻了?它适用于所有浏览器吗?我记得lazyload 在Chrome 上不起作用。
2021-03-28 21:06:45

有一个相当不错的无限滚动的插件这里

我从来没有自己编程过,但我想这就是它的工作原理。

  1. 一个事件绑定到窗口滚动

    $(window).scroll(myInfinteScrollFunction);
    
  2. 被调用的函数检查滚动顶部是否大于窗口大小

    function myInfiniteScrollFunction() {  
        if($(window).scrollTop() == $(window).height())  
        makeAjaxRequest();  
    }
    
  3. 发出 AJAX 请求,指定从哪个结果开始,获取多少,以及数据拉取所需的任何其他参数。

    $.ajax({
        type: "POST",
        url:  "myAjaxFile.php",
        data: {"resultNum": 30, "numPerPage": 50, "query": "interesting%20icons" },
        success: myInfiniteLoadFunction(msg)
    });
    
  4. ajax 返回一些(最有可能是 JSON 格式的)内容,并将它们传递给 loadnig 函数。

希望这是有道理的。

通过将侦听器附加到滚动事件或使用 setInterval 来延迟加载图像的性能非常低,因为每次调用 getBoundingClientRect() 都会强制浏览器重新布局整个页面,并且会给您的网站带来相当大的卡顿。

使用Lozad.js(只有 569 字节,没有依赖项),它使用IntersectionObserver高效地延迟加载图像。

这些天浏览器支持好多了 -我可以使用吗
2021-03-16 21:06:45
如果浏览器支持不可用,可以动态添加Polyfill
2021-04-01 21:06:45