Nano Hash - криптовалюты, майнинг, программирование

Как загрузить изображение только тогда, когда пользователь прокручивает его?

Многие сайты загружают только изображения или генерируют части документа (например, для отзывов), когда пользователь прокручивает страницу достаточно далеко вниз, чтобы увидеть их.

Это, очевидно, ускорит загрузку страниц и сэкономит трафик для тех, кто не утруждает себя прокруткой вниз.

Как это сделать, в идеале с помощью jquery? Или, по-другому, как определить, что отсутствующее изображение только что появилось в поле зрения и его нужно извлечь?


  • Хотя я могу понять причины, по которым разработчики хотят это сделать, меня очень раздражает ожидание загрузки части страницы. Кроме того, если вы сразу же прокручиваете страницу вниз, когда контент загружается, страница прыгает, поэтому обязательно установите для своих элементов блоки, чтобы контент не прыгал и не заставлял меня плакать;) 29.06.2010
  • Этот скачок легко исправить, установив высоту и ширину изображения в HTML, например, ‹img height='100' width='100' /›. Это тоже лучшая практика 29.06.2010

Ответы:


1

Для этого есть плагины. Вот один...

29.06.2010
  • от автора: Lazy Load is currently not usable. It does not work with the latest browsers as expected. I have currently no time updating the code myself... 07.05.2011

  • 2

    Вот мой собственный. Развлекайся. (не требует jQuery!)

    Протестировано: IE 5.5+, FF 2+, Chrome, Opera 9.6+

    Использование:

    1. ваши отложенные изображения должны иметь свой реальный src в атрибуте thumb

    2. Просто включите встроенный или внешний файл javascript.

    3. Если вы не хотите использовать его на всей странице, вы можете сделать следующее:

       LazyImg().destroy(); // stop global fetching
       LazyImg("watch-only-this-div");
      

      Примечание: когда вы включаете файл, глобальный экземпляр уже создается во всем документе. Сначала вам нужно остановить это и запустить свой собственный экземпляр.

      1. установить пользовательское смещение для предварительной выборки (насколько ниже сгиба изображение должно быть извлечено)

         // watch the whole document
         // prefetch offset: 300px
         LazyImg(document, 300); 
        

    Код:

    //
    //  LAZY Loading Images 
    //
    //  Handles lazy loading of images in one or more targeted divs, 
    //  or in the entire page. It also keeps track of scrolling and 
    //  resizing events, and removes itself if the work is done. 
    //
    //  Licensed under the terms of the MIT license.
    //
    //  (c) 2010 Balázs Galambosi
    //
    
    (function(){
    
    // glocal variables
    var window    = this, 
        instances = {},
        winH;
    
    // cross browser event handling
    function addEvent( el, type, fn ) {
      if ( window.addEventListener ) {
        el.addEventListener( type, fn, false );
      } else if ( window.attachEvent ) {
        el.attachEvent( "on" + type, fn );
      } else {
        var old = el["on" + type];
        el["on" + type] = function() { old(); fn(); };
      }
    }
    
    // cross browser event handling
    function removeEvent( el, type, fn ) {
      if ( window.removeEventListener ) {
        el.removeEventListener( type, fn, false );
      } else if ( window.attachEvent ) {
        el.detachEvent( "on" + type, fn );
      }
    }
    
    // cross browser window height
    function getWindowHeight() {
      if ( window.innerHeight ) {
        winH = window.innerHeight;
      } else if ( document.documentElement.clientHeight ) {
        winH = document.documentElement.clientHeight;
      } else if ( document.body && document.body.clientHeight ) {
        winH = document.body.clientHeight;
      } else {        // fallback:
        winH = 10000; // just load all the images
      }
      return winH;
    }
    
    // getBoundingClientRect alternative
    function findPos(obj) {
      var top  = 0;
      if (obj && obj.offsetParent) {
        do {
          top += obj.offsetTop || 0;
          top -= obj.scrollTop || 0;
        } while (obj = obj.offsetParent); // 
        return { "top" : top };
      }
    }
    
    // top position of an element
    var getTopPos = (function() {
      var dummy = document.createElement("div");
      if ( dummy.getBoundingClientRect ) {
        return function( el ) { 
          return el.$$top || el.getBoundingClientRect().top;
        };
      } else {
        return function( el ) { 
          return el.$$top || findPos( el ).top;
        };
      }
    })();
    
    // sorts images by their vertical positions
    function img_sort( a, b ) {
      return getTopPos( a ) - getTopPos( b );
    }
    
    // let's just provide some interface 
    // for the outside world
    var LazyImg = function( target, offset ) {
    
      var imgs,    // images array (ordered)
          last,    // last visible image (index)
          id,      // id of the target element
          self;    // this instance
    
      offset = offset || 200; // for prefetching
    
      if ( !target ) {
        target = document;
        id = "$document";
      } else if ( typeof target === "string" ) {
        id = target;
        target = document.getElementById( target );
      } else {
        id = target.id || "$undefined";
      }
    
      // return if this instance already exists
      if ( instances[id] ) {
        return instances[id];
      }
    
      // or make a new instance
      self = instances[id] = {
    
        // init & reset
        init: function() {
          imgs = null;
          last = 0;
          addEvent( window, "scroll", self.fetchImages );
          self.fetchImages();
          return this;
        },
    
        destroy: function() { 
          removeEvent( window, "scroll", self.fetchImages );
          delete instances[id];
        },
    
        // fetches images, starting at last (index)
        fetchImages: function() {
    
          var img, temp, len, i;
    
          // still trying to get the target
          target = target || document.getElementById( id );
    
          // if it's the first time
          // initialize images array
          if ( !imgs && target ) {
    
            temp = target.getElementsByTagName( "img" ); 
    
            if ( temp.length ) {
              imgs = [];
              len  = temp.length;
            } else return;
    
            // fill the array for sorting
            for ( i = 0; i < len; i++ ) {
              img = temp[i];
              if ( img.nodeType === 1 && img.getAttribute("thumb") ) {
    
                  // store them and cache current
                  // positions for faster sorting
                  img.$$top = getTopPos( img );
                  imgs.push( img );
              }
            }
            imgs.sort( img_sort );
          }
    
          // loop through the images
          while ( imgs[last] ) {
    
            img = imgs[last];
    
            // delete cached position
            if ( img.$$top ) img.$$top = null;
    
            // check if the img is above the fold
            if ( getTopPos( img ) < winH + offset )  {
    
              // then change the src 
              img.src = img.getAttribute("thumb");
              last++;
            }
            else return;
          }
    
          // we've fetched the last image -> finished
          if ( last && last === imgs.length )  {
            self.destroy();
          }
        }  
      };
      return self.init();
    };
    
    // initialize
    getWindowHeight();
    addEvent( window, "load",   LazyImg().fetchImages );
    addEvent( window, "resize", getWindowHeight       ); 
    LazyImg();
    
    window.LazyImg = LazyImg;
    
    }());
    
    29.06.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..