Значение отложенной загрузки (Зачем использовать ленивую загрузку)
Влияние на скорости загрузки страниц является большой картиной, общая картина может достигать размер нескольких М, и код, возможно, лишь несколько десятков KB. Когда загрузка страницы скорость много фотографий, страницы медленно, в течение нескольких часов S страницы не загружаются, вы можете потерять много пользователей. Так много для изображения страницы, для того, чтобы ускорить время загрузки страницы, так много раз, мы должны не появляться в видимой области в пределах страницы Изображение не загружено первым, а затем ждать, пока свитки в видимую область для загрузки. Для этого, как будет значительно улучшена производительность загрузки страницы, но и улучшить пользовательский опыт.
Ленивая загрузка, по определению, в текущей веб-страницы, вставьте страницу, чтобы иметь возможность увидеть картину, когда изображение перезарядка
Таким образом, задача разбивается на две части:
- Как определить, появляется изображение в текущем видовом экране (то есть, как мы можем судить, чтобы посмотреть фотографии)
- Как контролировать загрузку изображений
# Вариант первый
Как определить, появляется изображение в текущем видовом 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 ; } } } </ Скрипт>
<скрипт> вар п = 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 ));