代码之家  ›  专栏  ›  技术社区  ›  nsilva

带有webp回退和数据src的背景图像

  •  -1
  • nsilva  · 技术社区  · 5 年前

    因此,我正在我的网站上做一些优化工作,以提高页面洞察力得分,我可以解决的两点是:

    • 以下一代格式提供图像
    • 延缓屏幕图像

    因此,下一代格式的图像,我决定使用webp,但需要包括回退,以便它们在所有浏览器/设备中工作。

    延迟屏幕外图像;我正在使用 data-src 使用一点js脚本将背景图像设置为数据src,js将替换初始src src="data:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="

    以下面的例子为例,我将如何在WebP中使用内联背景图像和回退,同时延迟屏幕外图像?

    HTML

    <div id="working-bg" class="parallax" data-src="/wp-content/uploads/2016/08/silva-planning-parralax.jpg" style="background-image: url(/wp-content/uploads/2016/08/silva-planning-parralax.jpg)"></div>
    

    数据src的js

    <script>
    function init() {
        var imgDefer = document.getElementsByTagName('img');
        for (var i=0; i<imgDefer.length; i++) {
        if(imgDefer[i].getAttribute('data-src')) {
            imgDefer[i].setAttribute('src',imgDefer[i].getAttribute('data-src'));
        } }
    
        var imgDeferSpan = document.querySelectorAll('span[data-src]');
        var styleSpan = "background-image: url({url})";
        for (var i = 0; i < imgDeferSpan.length; i++) {
            imgDeferSpan[i].setAttribute('style', styleSpan.replace("{url}", imgDeferSpan[i].getAttribute('data-src')));
        }
    
        var imgDeferDiv = document.querySelectorAll('div[data-src]');
        var styleDiv = "background-image: url({url})";
        for (var i = 0; i < imgDeferDiv.length; i++) {
            imgDeferDiv[i].setAttribute('style', styleDiv.replace("{url}", imgDeferDiv[i].getAttribute('data-src')));
        }
    
    }
    
    window.onload = init;
    
    </script>
    

    提前谢谢!

    0 回复  |  直到 5 年前
        1
  •  1
  •   Peter Svegrup    5 年前

    以下一代格式提供图像: 使用像imagekit.io这样的图像cdn,并自动完成它。大多数图片cdn都有一个免费的计划,非常适合测试和小型站点。

    延迟屏幕外图像: 使用像lozad.js这样既能处理图像又能处理背景图像的现成解决方案。对于背景图像,可以跳过设置初始内联样式,因为元素已设置其大小,并且在加载图像时不会导致任何回流。为了 <img> 使用空的 <svg> 作为开头 src 价值何处 6 9 viewBox 下面定义宽度(6)和高度(9)之间的关系=>更改这些值以适合您的上下文。

    data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 9'%3E%3C/svg%3E
    

    请注意,lozad.js使用仍然缺乏浏览器支持的intersection observer api,因此请确保添加polyfill。

    祝你好运!