Реализация отложенной загрузки

Значение отложенной загрузки (Зачем использовать ленивую загрузку)

Влияние на скорости загрузки страниц является большой картиной, общая картина может достигать размер нескольких М, и код, возможно, лишь несколько десятков KB. Когда загрузка страницы скорость много фотографий, страницы медленно, в течение нескольких часов S страницы не загружаются, вы можете потерять много пользователей. Так много для изображения страницы, для того, чтобы ускорить время загрузки страницы, так много раз, мы должны не появляться в видимой области в пределах страницы Изображение не загружено первым, а затем ждать, пока свитки в видимую область для загрузки. Для этого, как будет значительно улучшена производительность загрузки страницы, но и улучшить пользовательский опыт.

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

Таким образом, задача разбивается на две части:

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

# Вариант первый

Как определить, появляется изображение в текущем видовом clientTop, offsetTop, clientHeight и scrollTop различные высоты на картинке для сравнения

Это хорошо демонстрирует то, что это значит?

То, что я использовал, чтобы знать, что это возможно, то я более простой, как SIKE. Я понял теперь, но тогда вещи не оказаться

Так что есть проблема: сложная тривиальным трудно понять!

Просто знайте, что это статическая высота не достаточно, мы также должны знать динамику

Как динамически? Слушайте window.scroll событие

Как контролировать загрузку изображений

<Data-IMG Пульт SRC = «shanyue.jpg»>
 // ПРИМЕЧАНИЕ: Для того, чтобы указать ширину и высоту изображения

Вместо того чтобы использовать установки временных данных-Src атрибут SRC данных SRC, управление нагрузкой

# Вариант II

Вышеприведенная программа для улучшения его

Как определить текущие появления изображения во введении нового видового экрана на API,  Element.getBoundingClientRect ()  метод возвращает размер элемента и положение относительно окна просмотра.

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

// clientHeight весьма показательный текущего видовой экран 
img.getBoundingClientRect (). Top <document.documentElement.clientHeight

 

 

Слушайте window.scroll событие также оптимизировать

Добавить дроссель, чтобы улучшить производительность. Работа обычно используется lodash.throttle на нем, Вседержитель lodash ах!

_.throttle (FUNC, [ожидание = 0], [опция = {}])

 

# Вариант III

А затем улучшить его

Как определить, появляется изображение в текущей программе видового экрана используются два метода являются: window.scroll прослушивания Element.getBoundingClientRect () и использовать дроссельную _.throttle

Серия комбинированного действия слишком сложно, так что браузер из тройного события:  IntersectionObserver  API, а может контролировать ли текущий элемент окна просмотра на событие, в один шаг!

Событие Параметр обратного вызова является сбор IntersectionObserverEntry, будь то от имени диапазона значений в видимой области просмотра

Который, entry.isIntersecting представляет целевой элемент виден

Const наблюдатель = новый IntersectionObserver ((изменения) => {
   // изменения:目标元素集合 
  changes.forEach ((изменить) => {
     // intersectionRatio 
    если (change.isIntersecting) {
      Const IMG = change.target
      img.src = img.dataset.src
      observer.unobserve (IMG)
    }
  })
})

observer.observe (IMG)
<Script>
     вар NUM = document.getElementsByTagName ( 'IMG' ) .length;
     вар IMG = document.getElementsByTagName ( "IMG" );
     вар п = 0; // хранить фотографии , загруженные в положение, от первого , чтобы избежать каждый фотографии начинают обход 

    LazyLoad (); // страница загружена , но по окончанию загрузки изображений в области 

    window.onscroll = LazyLoad;

    Функция LazyLoad () { // слушать страницы прокрутки события 
        вар seeHeight = document.documentElement.clientHeight; // видимая область высота 
        вар scrollTop = document.documentElement.scrollTop || document.body.scrollTop; // высота полосы прокрутки сверху 
        для ( вар I = п, я <NUM, я ++ ) {
             ЕСЛИ (IMG [I] .offsetTop <+ seeHeight scrollTop) {
                 ЕСЛИ (IMG [I] , .getAttribute ( далее "SRC") == "default.jpg" ) {
                    IMG [я] .src = IMG [I] .getAttribute ( "данных SRC" );
                }
                п = + 1 ;
            }
        }
    }
</ Скрипт>

 

Или с помощью JQuery
<скрипт>
     вар п = 0 ,
        imgNum = $ ( "IMG" ) .length,
        IMG = $ ( 'IMG' );

    LazyLoad ();

    $ (Окна) .scroll (LazyLoad);

    Функция LazyLoad (событие) {
         для ( вар я = N; я <imgNum; я ++ ) {
             если . (img.eq (я) .offset () сверху <ParseInt ($ (окно) .height ()) + ParseInt ($ (окно) .scrollTop ())) {
                 если (img.eq (я) .attr ( "SRC") == "default.jpg" ) {
                     вар SRC = img.eq (я) .attr ( "данных SRC " );
                    img.eq (я) .attr ( "SRC" , SRC);

                    п = + 1 ;
                }
            }
        }
    }
</ Скрипт>
 

Использование функции оптимизации производительности дроссельной

Если функция непосредственно связана с событием прокрутки, когда страница прокручивается, функция будет вызвана высокой частотой, что влияет на производительность браузера.

Я хочу, чтобы достичь предел триггера частоты для оптимальной производительности.

Дроссельная функция: функция выполняется только один раз в N секунд. Вот функция простой дроссельный:

// простая функция дроссельной заслонки
 // Fun для выполнения функций
 // Задержки задержки
 // время должны быть выполнены в течение периода времени 
функции дроссельной заслонки (удовольствия, задержки, время) {
     вар тайм - аут,
        начальное время = новая Дата ();

    возвращение функции () {
         вар контекст = это ,
            арг = аргументы,
            CURTIME = новый Дата ();

        clearTimeout (тайм-аут);
        // Если триггер достигает заданный интервал времени, запускает обработчик 
        IF (CURTIME - начальный промежуток > = время) {
            fun.apply (контекст, арг);
            начальный промежуток = CURTIME;
             // не достигают интервал срабатывания, таймер сбрасывается 
        } остальное {
            Тайм - аут = SetTimeout (удовольствие, задержка);
        }
    };
};
// 实际想绑定在прокрутки事件上的обработчик 
функции LazyLoad ( событие ) {
         для ( вар я = п, я <imgNum; я ++ ) {
             если . (Img.eq (я) .offset () сверху <ParseInt ($ (окно) .height ()) + ParseInt ($ (окно) .scrollTop ())) {
                 если (img.eq (я) .attr ( " SRC " ) == " default.jpg " ) {
                     вар SRC = IMG .eq (я) .attr ( " данных SRC " );
                    img.eq (я) .attr ( " SRC " , SRC);

                    п = г + 1 ;
                }
            }
        }
    }
// использовать функцию дросселирующего 
window.addEventListener ( ' Scroll ' , дроссельная заслонка (LazyLoad, 500 , 1000 ));

 

 

рекомендация

отwww.cnblogs.com/thomas-yang-github/p/11839026.html
рекомендация