Loading an image using data-src and not just src

前端 未结 2 517
执念已碎
执念已碎 2021-02-04 19:33

I am trying to load an image using the img data-src tag instead of just the img src. I have created two simple JSFiddle\'s although only the one with t

2条回答
  •  孤街浪徒
    2021-02-04 20:22

    You are using HTML5 data attributes which don't replace the normal HTML attributes of an HTML element, such as src. So your image needs to have a src attribute, whether it has a data-src or not, they are both independent of each other.

    data-* attributes allow us to store extra information on standard, semantic HTML elements (...)


    • Loading an image when it appears on the screen:

    A common approach to lazy-loading images is to set the src to a very small image, sometimes a 1x1px gif, and once the user scrolls and the image is on the screen replace the src with the real one. Something like this:

    
    

    That data-src could be called data-whatever_you_want. The idea is that using JavaScript you track the scrollTop position of the page. Once the image is going to appear you replace the src value "fake_small_image.gif" with the data-src value "real_image.jpg". The example you post in the comments of this answer, is ignoring the assignment of an initial src which is invalid.

    var $window = $(window),
      window_height = $window.height() - 150, // I'm using 150 (a random number) so the image appears 150px after it enters the screen, so the effect can be appreciated
      $img = $('img.some_img'),
      img_loaded = false,
      img_top = $img.offset().top;
    
    $window.on('scroll', function() {
    
      if (($window.scrollTop() + window_height) > img_top && img_loaded == false) {
    
        $img.attr('src', $img.attr('data-src_of_original_img'));
    
      }
    
    });
    #container {
      width: 100%;
      height: 200vh;
      background-color: grey;
    }
    .some_img {
      position: absolute;
      top: 100vh;
      width: 100%;
    }
    body {
      margin: 0;
    }
    
    


    • Show an image as soon as it is loaded:

    A similar approach is to load the image virtually with JavaScript and once it is loaded assign the src to the image. This is done to prevent the image from showing before it is totally loaded.

    var $img = $('img.some_img'),
      $img_created_with_js = $('');
    
    $img_created_with_js
      .on('load', function() {
    
        $img.attr('src', $img.attr('data-src_of_original_img'));
    
      });
    .some_img {
      width: 100%;
    }
    
      


    Both methods could be applied to an image. For example: you could wait until the user scrolls where the image is and then start to load it, but not show until it is fully loaded.


    Resources:

    • Smallest data URI image possible for a transparent image
    • Image from Oskar Krawczyk

提交回复
热议问题