如何懒惰加载div背景图像

时间:2012-08-18 00:03:35

标签: javascript jquery image background lazy-loading

许多人都知道它被广泛用于延迟加载图片。

现在我想将它用作延迟加载div背景图像。

我该怎么做?

我目前能够使用http://www.appelsiini.net/projects/lazyload插件

所以我需要修改它以使用div背景

需要帮助。谢谢。

以下部分我认为延迟加载图片

$self.one("appear", function() {
    if (!this.loaded) {
        if (settings.appear) {
            var elements_left = elements.length;
            settings.appear.call(self, elements_left, settings);
        }
        $("<img />")
            .bind("load", function() {
                $self
                    .hide()
                    .attr("src", $self.data(settings.data_attribute))
                    [settings.effect](settings.effect_speed);
                self.loaded = true;

                /* Remove image from array so it is not looped next time. */
                var temp = $.grep(elements, function(element) {
                    return !element.loaded;
                });
                elements = $(temp);

                if (settings.load) {
                    var elements_left = elements.length;
                    settings.load.call(self, elements_left, settings);
                }
            })
            .attr("src", $self.data(settings.data_attribute));
    }
});

Jquery插件延迟加载

10 个答案:

答案 0 :(得分:25)

首先,您需要在想要交换时想一想。例如,每次加载div标签时都可以切换。在我的例子中,我只使用了一个额外的数据字段“背景”,每当它设置时,图像被应用为背景图像。

然后您只需使用创建的图像标记加载数据。而不是覆盖img标签而是应用css背景图像。

以下是代码更改的示例:

if (settings.appear) {
    var elements_left = elements.length;
    settings.appear.call(self, elements_left, settings);
}
var loadImgUri;
if($self.data("background"))
    loadImgUri = $self.data("background");
else
    loadImgUri  = $self.data(settings.data_attribute);

$("<img />")
    .bind("load", function() {
        $self
            .hide();
        if($self.data("background")){
            $self.css('backgroundImage', 'url('+$self.data("background")+')');
        }else
            $self.attr("src", $self.data(settings.data_attribute))

        $self[settings.effect](settings.effect_speed);

        self.loaded = true;

        /* Remove image from array so it is not looped next time. */
        var temp = $.grep(elements, function(element) {
            return !element.loaded;
        });
        elements = $(temp);

        if (settings.load) {
            var elements_left = elements.length;
            settings.load.call(self, elements_left, settings);
        }
    })
    .attr("src", loadImgUri );
}

装载保持不变

$("#divToLoad").lazyload();

在这个例子中你需要像这样修改html代码:

<div data-background="http://apod.nasa.gov/apod/image/9712/orionfull_jcc_big.jpg" id="divToLoad" />​

但如果您将开关更改为div标签,然后您可以使用“data-original”属性,它也会起作用。

这是一个小提琴示例:http://jsfiddle.net/dtm3k/1/

答案 1 :(得分:13)

我这样做:

<div class="lazyload" style="width: 1000px; height: 600px" data-src="%s">
    <img class="spinner" src="spinner.gif"/>
</div>

并加载

$(window).load(function(){

    $('.lazyload').each(function() {

        var lazy = $(this);
        var src = lazy.attr('data-src');

        $('<img>').attr('src', src).load(function(){
            lazy.find('img.spinner').remove();
            lazy.css('background-image', 'url("'+src+'")');
        });

    });

});

答案 2 :(得分:8)

我在插件的官方网站上找到了这个:

<div class="lazy" data-original="img/bmw_m1_hood.jpg" style="background-image: url('img/grey.gif'); width: 765px; height: 574px;"></div>

$("div.lazy").lazyload({
      effect : "fadeIn"
});

来源:http://www.appelsiini.net/projects/lazyload/enabled_background.html

答案 3 :(得分:4)

我已经创建了一个“延迟加载”插件,这可能有所帮助。以下是在您的案例中完成工作的可能方法:

$('img').lazyloadanything({
    'onLoad': function(e, LLobj) {
        var $img = LLobj.$element;
        var src = $img.attr('data-src');
        $img.css('background-image', 'url("'+src+'")');
    }
});

就像maosmurf的例子一样简单,但是当元素进入视图时,它仍然为你提供事件触发的“延迟加载”功能。

https://github.com/shrimpwagon/jquery-lazyloadanything

答案 4 :(得分:1)

我知道这与图像负荷无关,但是我在其中一次面试中做了什么。

HTML

<div id="news-feed">Scroll to see News (Newest First)</div>

CSS

article {
   margin-top: 500px;
   opacity: 0;
   border: 2px solid #864488;
   padding: 5px 10px 10px 5px;
   background-image: -webkit-gradient(
   linear,
   left top,
   left bottom,
   color-stop(0, #DCD3E8),
   color-stop(1, #BCA3CC)
   );
   background-image: -o-linear-gradient(bottom, #DCD3E8 0%, #BCA3CC 100%);
   background-image: -moz-linear-gradient(bottom, #DCD3E8 0%, #BCA3CC 100%);
   background-image: -webkit-linear-gradient(bottom, #DCD3E8 0%, #BCA3CC 100%);
   background-image: -ms-linear-gradient(bottom, #DCD3E8 0%, #BCA3CC 100%);
   background-image: linear-gradient(to bottom, #DCD3E8 0%, #BCA3CC 100%);
   color: gray;
   font-family: arial;    
}

article h4 {
   font-family: "Times New Roman";
   margin: 5px 1px;
}

.main-news {
   border: 5px double gray;
   padding: 15px;
}

的JavaScript

var newsData,
    SortData = '',
    i = 1;

$.getJSON("http://www.stellarbiotechnologies.com/media/press-releases/json", function(data) {

   newsData = data.news;

   function SortByDate(x,y) {
     return ((x.published == y.published) ? 0 : ((x.published < y.published) ? 1 : -1 ));
   }

   var sortedNewsData = newsData.sort(SortByDate);

   $.each( sortedNewsData, function( key, val ) {
     SortData += '<article id="article' + i + '"><h4>Published on: ' + val.published + '</h4><div  class="main-news">' + val.title + '</div></article>';
     i++;    
   });

   $('#news-feed').append(SortData);
});

$(window).scroll(function() {

   var $window = $(window),
       wH = $window.height(),
       wS = $window.scrollTop() + 1

   for (var j=0; j<$('article').length;j++) {
      var eT = $('#article' + j ).offset().top,
          eH = $('#article' + j ).outerHeight();

          if (wS > ((eT + eH) - (wH))) {
             $('#article' + j ).animate({'opacity': '1'}, 500);
          }
    }

});

我按日期对数据进行排序,然后对窗口滚动功能进行延迟加载。

我希望它有所帮助:)

Demo

答案 5 :(得分:1)

已经有人问这个问题了,但这并不意味着我们不能在2020年分享其他答案。这是一个很棒的jquery插件:jQuery Lazy

Lazy的基本用法:

HTML

<!-- load background images of other element types -->
<div class="lazy" data-src="path/to/image.jpg"></div>
enter code here

JS

 $('.lazy').Lazy({
    // your configuration goes here
    scrollDirection: 'vertical',
    effect: 'fadeIn',
    visibleOnly: true,
    onError: function(element) {
        console.log('error loading ' + element.data('src'));
    }
});

,并且您的背景图片正在延迟加载。仅此而已!

要查看真实示例和更多详细信息,请查看此链接lazy-doc

答案 6 :(得分:1)

去年年中 2020 web.dev 发布了一篇文章,该文章分享了一些使用新 IntersectionObserver 执行此操作的新方法,在撰写此答案时支持所有主流浏览器。这将允许您在等待图像到达视口边缘然后加载时使用非常轻量级的背景图像或背景颜色占位符。

CSS

.lazy-background {
  background-image: url("hero-placeholder.jpg"); /* Placeholder image */
}

.lazy-background.visible {
  background-image: url("hero.jpg"); /* The final image */
}

Javascript

document.addEventListener("DOMContentLoaded", function() {
  var lazyBackgrounds = [].slice.call(document.querySelectorAll(".lazy-background"));

  if ("IntersectionObserver" in window) {
    let lazyBackgroundObserver = new IntersectionObserver(function(entries, observer) {
      entries.forEach(function(entry) {
        if (entry.isIntersecting) {
          entry.target.classList.add("visible");
          lazyBackgroundObserver.unobserve(entry.target);
        }
      });
    });

    lazyBackgrounds.forEach(function(lazyBackground) {
      lazyBackgroundObserver.observe(lazyBackground);
    });
  }
});

答案 7 :(得分:0)

我必须为我的响应式网站处理这个问题。我有很多不同背景的相同元素来处理不同的屏幕宽度。我的解决方案非常简单,将所有图像限定为css选择器,例如“zoinked”。

逻辑:

如果用户滚动,则加载带有与之关联的背景图像的样式。 完成!

这是我在库中写的我称之为“zoinked”我不知道为什么。它发生了好吗?

(function(window, document, undefined) {   var Z = function() {
    this.hasScrolled = false;

    if (window.addEventListener) {
      window.addEventListener("scroll", this, false);
    } else {
      this.load();
    }   };
     Z.prototype.handleEvent = function(e) {
    if ($(window).scrollTop() > 2) {
      this.hasScrolled = true;
      window.removeEventListener("scroll", this);
      this.load();
    }   };
     Z.prototype.load = function() {
    $(document.body).addClass("zoinked");   };
     window.Zoink = Z; 
})(window, document);

对于CSS,我将拥有这样的所有样式:

.zoinked #graphic {background-image: url(large.jpg);}

@media(max-width: 480px) {.zoinked #graphic {background-image: url(small.jpg);}}

我的技巧是在用户开始滚动后立即加载顶部图像。如果你想要更多控制,你可以使“缩放”更加智能化。

答案 8 :(得分:0)

  

使用上述插件延迟加载图像使用传统方式将侦听器附加到滚动事件或使用setInterval,并且每次调用getBoundingClientRect()都会强制浏览器re-layout整个页面,因此非常高性能并将为您的网站引入相当多的jank。

使用 Lozad.js (只有569个字节,没有依赖项),使用InteractionObserver延迟加载图片。

答案 9 :(得分:0)

使用jQuery,我可以加载图像并检查其是否存在。将src添加到具有原始图像高度宽度的平面base64哈希字符串中,然后将其替换为所需的url。

$('[data-src]').each(function() {
  var $image_place_holder_element = $(this);
  var image_url = $(this).data('src');
  $("<div class='hidden-class' />").load(image_url, function(response, status, xhr) {
    if (!(status == "error")) {
      $image_place_holder_element.removeClass('image-placeholder');
      $image_place_holder_element.attr('src', image_url);
    }
  }).remove();
});

我当然使用和修改了一些堆栈答案。希望对别人有帮助。