【问题标题】:Is there a way to combine the lazyload js library with Picturefill?有没有办法将lazyload js库与Picturefill结合起来?
【发布时间】:2013-12-28 17:15:44
【问题描述】:

我想知道如何将lazyload.js 与Picturefill 结合起来,当lazyload 的图像语法需要img 标记和data-original 时,而Picturefill 的语法没有这些功能。

例如,这是我使用 Picturefill 对图像的标记:

  <span data-picture data-alt="Operating room 2 stands vacant in Dr. Tariq Mahmood's closed Renaissance Hospital in Terrell, Texas.">
            <span data-src="img/main1_small.jpg"></span>
            <span data-src="img/main1_small_x2.jpg"     data-media="(min-width: 300px) and (min-device-pixel-ratio: 2.0)"></span>
            <span data-src="img/main1_small.jpg"        data-media="(min-width: 300px)"></span>
            <span data-src="img/main1_medium_x2.jpg"    data-media="(min-width: 601px) and (min-device-pixel-ratio: 2.0)"></span>
            <span data-src="img/main1_medium.jpg"       data-media="(min-width: 601px)"></span>    
            <span data-src="img/main1_large.jpg"        data-media="(min-width: 1101px)"></span>                                       

            <!-- Fallback content for non-JS browsers. Same img src as the initial, unqualified source element. -->
            <noscript>
                <img src="img/main1_small.jpg" alt="Operarting room 2 stands vacatn in Dr. Tariq Mahmood's closed Renaissance Hospital in Terrell, Texas.">
            </noscript>
         </span>            

不确定我会将lazyload.js 所需的类属性放在图像标签上的哪个位置,或者是data-original 属性。关于如何实现lazyload.js 和Picturefill 的任何想法,或任何其他在保持使用Picturefill 的同时延迟加载图像的方法?

【问题讨论】:

标签: lazy-loading jquery-lazyload picturefill


【解决方案1】:

我做了一个定制版的picturefill,js来实现这个:

https://gist.github.com/sheadawson/dd4891fa13f82f6a9b20

演示在

codepen.io/sheadawson/pen/fvFLc

【讨论】:

    【解决方案2】:

    查看this issue。评论者 Golodhros 有这样的想法:

    根据我的经验,通过不添加 所有图像包装器的 data-picture 属性。

    您可以收听滚动/滑动/标签事件并添加数据图片 属性,之后执行 picturefill() 以获取延迟加载 功能。

    这也在this tweet by joel_birch中得到回应:

    Lazy-load Picturefill:如果图像在,则仅应用 data-picture 属性 视口,然后调用图片填充()。在滚动上重复。真的很简单。

    所以基本上,您设置自己的滚动侦听器(或为此使用库或脚本),当每个图片填充跨度出现时,您将data-picture 属性添加到其容器span,然后手动调用window.picturefill()(根据文档,该方法有意暴露在全局命名空间中)。这将导致图片填充脚本再次运行,此时它将检测到您新滚动到视图中的元素,并对其执行正常操作,下载正确大小的图像。

    更新

    这是一个概念证明:http://codepen.io/jonahx/pen/536957770caa3b5e3deb8d96bd421314

    【讨论】:

    • 谢谢乔纳。我也找到了这个解决方案,但是这样做会产生一些非常糟糕的后果,从而否定了使用这两个功能的好处。 1. 使用 window.scroll 会增加一些不必要的开销。 2. 每次将 data-picture 属性添加回 DOM 时,通过调用 window.picturefill(),为每个具有 data-picture 的元素发出 HTTP 请求,因此您正在为之前的每张图片调用 HTTP 请求'已经加载了那种方式。如果您使用此方法加载了 15 张图片,那么在您加载最后一张图片时,您已经调用了第一张图片 15 次。
    • 但是,在查看了您提供的 codepen 之后,这里似乎没有发生第二个问题,这是巨大的。再次感谢,这似乎至少解决了我在解决方案中遇到的第二个问题!
    • 没问题。我不确定这一点,但我想 jquery 在处理滚动事件方面非常聪明,所以我不认为 1. 是一个大问题。由于我们所做的只是检查处理程序中是否存在属性(如果我们没有找到它,我们只会发出一个 http 请求),这也应该是最小的。我确实认为有空间改进。请参阅 my comment here 了解我的一个想法,但还不确定如何最好地实施。
    • 乔纳,快速提问。那么,当在 activateVisiblePictureFills 函数结束时调用 window.picturefill 时,为什么它只在要显示的最新跨度上运行,而不是在 checkImage() 上返回 true 并具有 data-picture 属性的所有跨度上运行?正如我之前所说,当我试图解决这个问题时,运行 window.picturefill() 会导致所有带有 data-picture 的 span 重新加载它们的图像。
    • @JohnHancock,我对内部结构不够熟悉,无法回答原因,但我刚刚在我的概念证明中使用 chrome 开发工具验证了它不会重新加载现有图像——只有新的那些。
    猜你喜欢
    • 2011-08-24
    • 2015-04-05
    • 1970-01-01
    • 2021-07-28
    • 2013-09-15
    • 2017-12-14
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多