Интернет Windows Android

Ленивая загрузка. Ленивая загрузка изображений

  • Перевод

В наши дни главным камнем преткновения на пути к высокой скорости загрузки сайтов являются изображения. Это особенно характерно для проектов из сферы электронной коммерции. На них изображения, обычно довольно «тяжёлые», составляют основную часть содержимого страниц. Это, как правило, приводит к тому, что для того, чтобы показать пользователю страницу, его браузеру требуется загрузить несколько мегабайт графических данных. Как ускорить загрузку страниц в такой ситуации? Ответу на этот вопрос и посвящён материал, перевод которого мы сегодня публикуем.

Общие положения Рассмотрим, для примера, стартовую страницу отдела Home на сайте Walmart.


Страница, на которой имеется множество изображений

Вот сведения о том, сколько изображений загружается для формирования этой страницы:


Изображения, загружаемые при формировании страницы

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

Проанализируем теперь сетевые запросы, выполняемые при загрузке страницы:


Сетевые запросы, выполняемые при формировании страницы

В данном случае файлы, полученные в результате разделения кода проекта, загружаются позже, чем могли бы. Происходит это из-за того, что сначала нужно загрузить главный бандл cp_ny.bundle . Этот бандл можно было бы загрузить куда быстрее, если бы ему не мешали 18 изображений, соревнующихся друг с другом за полосу пропускания.

Как это исправить? На самом деле, по-настоящему «исправить» это не получится, но можно сделать много всего для того, чтобы оптимизировать загрузку изображений. Существует немало подходов к оптимизации изображений, используемых на веб-страницах. Среди них - использование различных форматов графических файлов, сжатие данных, применение техники blur animation, использование CDN. Мне хотелось бы остановиться на так называемой «ленивой загрузке» изображений (lazy loading). В частности, речь пойдёт о том, как реализовать эту технику на React-сайтах, но, так как основана она на механизмах JavaScript, её можно интегрировать в любой веб-проект.

Экспериментальный проект Начнём с такого вот предельно простого React-компонента Image:

Class Image extends PureComponent { render() { const { src } = this.props; return ; } }
Он принимает, в качестве свойства, URL, и использует его для рендеринга HTML-элемента img . Вот соответствующий код на JSFiddle. На следующем изображении показана страница, содержащая этот компонент. Обратите внимание на то, что для того, чтобы увидеть выводимое им изображение, нужно прокрутить содержимое страницы.


Страница с компонентом, выводящим изображение

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

  • Не рендерить изображение сразу после загрузки.
  • Настроить средства обнаружения появления изображения в области просмотра содержимого страницы.
  • Вывести изображение после того, как будет обнаружено, что оно попало в область просмотра.
  • Разберём эти шаги.Шаг 1 На этом шаге изображение, сразу после загрузки не выводится.

    Render() { return ; }

    Шаг 2 Здесь мы настраиваем механизмы, которые позволяют обнаружить момент попадания изображения в область просмотра.

    ComponentDidMount() { this.observer = new IntersectionObserver(() => { // тут будет код для реализации третьего шага }, { root: document.querySelector(".container") }); this.observer.observe(this.element); } .... render() { return this.element = el} />; }
    Разберём этот код. Вот что здесь сделано:

    • К элементу img добавлен атрибут ref . Это позволяет позже обновить ссылку на изображение в src без необходимости проводить повторный рендеринг компонента.
    • Создан новый экземпляр IntersectionObserver (об этом мы поговорим ниже).
    • Объекту IntersectionObserver предложено наблюдать за изображением с использованием конструкции observe(this.element) .
    Что такое IntersectionObserver ? Учитывая то, что слово «intersection» переводится как «пересечение», а «observer» - это «наблюдатель», уже можно догадаться о роли этого объекта. Если же поискать сведения о нём на MDN , то можно узнать, что API Intersection Observer позволяет веб-приложениям асинхронно следить за изменением пересечения элемента с его родителем или областью видимости документа viewport.

    На первый взгляд такая характеристика API может показаться не особенно понятной, но, на самом деле, устроено оно очень просто. Экземпляру IntersectionObserver передаётся несколько параметров. В частности, мы использовали параметр root , который позволяет задать корневой DOM-элемент, рассматриваемый нами в качестве контейнера, о пересечении элемента с границей которого нам нужно узнать. По умолчанию это область, в которой находится видимый фрагмент страницы (viewport), но я явным образом установил его на использование контейнера, находящегося в элементе iframe JSFiddle. Сделано это для того, чтобы, позже, рассмотреть одну возможность, которая не рассчитана на использование элементов iframe .

    Причина, по которой использование IntersectionObserver для определения момента того, когда элемент становится видимым, популярнее более традиционных методов, вроде совместного применения onScroll и getBoundingClientRect() заключается в том, что механизмы IntersectionObserver выполняются за пределами главного потока. Однако, коллбэк, вызываемый после того, как IntersectionObserver обнаружит пересечение элемента с контейнером, выполняется, естественно, в главном потоке, поэтому его код не должен быть слишком тяжёлым.

    Шаг 3 Теперь нам надо настроить коллбэк, вызываемый при обнаружении пересечения элемента target (this.element в нашем случае) с контейнером root (в нашем случае это div -элемент.container).

    This.observer = new IntersectionObserver(entries => { entries.forEach(entry => { const { isIntersecting } = entry; if (isIntersecting) { this.element.src = this.props.src; this.observer = this.observer.disconnect(); } }); }, { root: document.querySelector(".container") }); ....
    В коллбэк, при обнаружении пересечения, передаётся массив элементов entries , который напоминает набор снимков состояния всех целевых элементов, для которых обнаружено пересечение заданной границы. Свойство isIntersecting указывает на направление пересечения. Если элемент, за которым организовано наблюдение, попадает извне в корневой элемент, оно равно true . Если элемент покидает корневой элемент, то оно равно false .

    Итак, когда выясняется, что элемент пересёкся с нижней границей контейнера, я вручную устанавливаю его свойство src и отключаю наблюдение за ним, в котором больше нет необходимости.

    Шаг 4 (секретный) Теперь, на четвёртом, секретном шаге нашей работы, можно полюбоваться результатом и порадоваться успеху. Вот код , в котором собрано то, о чём мы только что говорили.


    Результат применения методики ленивой загрузки изображений

    Однако если поближе рассмотреть то, что у нас получилось, окажется, что тут можно найти кое-что не очень хорошее. Для того чтобы это разглядеть, я быстро прокрутил страницу, замедлив при этом скорость сетевого соединения.


    Поведение страницы при её быстрой прокрутке и замедлении скорости сетевого соединения

    Так как мы загружаем изображение только после того, как оно достигло области, в которой оно уже должно быть видимым, у пользователя нет возможности прокрутить страницу и увидеть область, занимаемую изображением, и, естественно, само изображение, до его загрузки. Когда сайты смотрят с обычных компьютеров, подключённых к быстрому интернету, это проблем не вызывает. Но многие современные пользователи посещают сайты с телефонов, иногда они пользуются 3G-сетями или, что ещё хуже, EDGE-подключениями.

    С этой проблемой, правда, справиться не так уж и сложно. Сделать это можно благодаря тому, что API Intersection Observer предоставляет разработчику возможность расширять или сужать границы корневого элемента (в нашем случае это элемент.container). Для того чтобы этой возможностью воспользоваться, достаточно добавить одну строчку кода туда, где осуществляется настройка корневого контейнера:

    RootMargin: "0px 0px 200px 0px"
    В свойство rootMargin надо записать строку, структура которой соответствует правилам CSS, используемым для настройки параметров отступов элементов. В нашем случае мы сообщаем системе о том, что нижнюю границу, используемую для обнаружения пересечения элемента с контейнером, нужно увеличить на 200 пикселей. Это означает, что соответствующий коллбэк будет вызван, тогда, когда элемент попадёт в область, которая на 200 пикселей ниже нижней границы корневого элемента (по умолчанию здесь используется значение 0).

    Вот код, в котором реализована эта методика.


    Совершенствование методики ленивой загрузки изображений

    В результате оказывается, что когда мы прокручиваем страницу лишь к 4-му элементу списка, изображение загружается в области, которая на 200 пикселей ниже видимой области страницы.
    Теперь, казалось бы, сделано всё, что нужно. Но это не так.

    Проблема высоты изображения Если вы внимательно изучали приведённые выше GIF-иллюстрации, то вы могли заметить, что полоса прокрутки совершает «прыжок» после загрузки изображения. К счастью, с этой проблемой несложно справиться. Её причина заключается в том, что элемент, выводящий изображение, изначально имеет высоту 0, которая, после загрузки изображения, оказывается равной 300 пикселей. Поэтому для исправления проблемы достаточно задать элементу фиксированную высоту, добавив к изображению атрибут height={300} .О результатах оптимизации Каких результатов мы, в Walmart, добились после применения ленивой загрузки изображений на этой странице? На самом деле, конкретные результаты очень сильно варьируются в зависимости от множества обстоятельств, среди которых можно отметить скорость подключения клиента к сети, доступность CDN, количество изображений на странице и применяемые к ним правила обнаружения пересечения с корневым элементом. Другими словами, вам, для того, чтобы оценить воздействие ленивой загрузки изображений на собственный проект, лучше всего самим это реализовать и проверить. Но если вам всё же интересно взглянуть на то, что ленивая загрузка изображений дала нам, вот пара отчётов Lighthouse. Первый сформирован до оптимизации, второй - после.

    Добавить метки

    При работе в Интернете всем хочется, чтобы страницы сайтов загружались как можно быстрее, никому не нравится долго ждать завершения загрузки той или иной страницы. Причём это ожидание может затягиваться весьма существенно в тех случаях, когда изображений на странице великое множество. Присутствие изображений на странице делает страницу более привлекательной для посетителей, увеличивает наглядность и в конечном счёте, способствует повышению посещаемости вашего сайта. Однако приходится считаться с тем, что наличие изображений значительно утяжеляет страницы, увеличивая время их загрузки.

    Медленная загрузка страниц отрицательно сказывается на SEO оптимизации вашего сайта. В настоящее время многие сайты используют в своих постах изображения в GIF или PNG -формате. Такие изображения имеют больший объём, чем изображения в формате JPEG, в результате загрузка страниц может занять ещё больше времени. Для загрузки каждого такого изображения требуется отдельный HTTP-запрос, что также не способствует ускорению загрузки.

    Для решения этой проблемы применяется так называемая «ленивая» или отложенная загрузка, при которой загружаются только те изображения, которые необходимы пользователю. В данной статье приводится описание шести лучших бесплатных плагиновWordPress для “ленивой” загрузки, помогающих значительно повысить скорость загрузки страниц.

    1. a3 Lazy Load — лучший плагин ленивой загрузки

    Плагин ускоряет блог и повысить визуальный отклик страницы на ПК, планшетах и мобильных телефонах.

    a3 Lazy Load не создает нагрузки на сайт и при этом является мобильно ориентированным. Простой в использовании плагин, который ускорит работы сайта. Чем больше на сайте будет тяжелых элементов, тем лучше плагин будет выполнять свою работу и тем больше вы увидите улучшений в производительности.

    • Ленивая загрузка для всех изображений, граватары, видео и фреймов
    • Выбор эффектов загрузки
    • Поддержка WooCommerce
    • Высокая производительность и низкой нагрузкой
    • Можно делать исключения изображений и видео
    • Резервная подключение JavaScript
    • Поддержка всех браузеров
    2. Lazy Load

    Это плагин для отложенной загрузки изображений, разработанный WordPress.com, командой TechCrunch и Джеком Голдманом. Он имеет простой код, поэтому не перегружает ресурсы сервера.

    Lazy – простой в установке и настройке плагин. Он практически не требует настройки, начиная работу сразу после установки.

    Основные характеристики плагина:
    • Простой код.
    • Работает на WordPress.
    • Простота в использовании.
    • Использует jQuery.sonar.
    3. BJ Lazy Load

    BJ – ещё один бесплатный плагин WordPress для ленивой загрузки, который заменяет все ваши изображения, миниатюры, граватары и содержимое элементов iframe в отслеживаемой области “заглушкой”. Сами изображения подгружаются после появления в окне браузера. Такой способ позволяет ускорить загрузку страниц, а также сэкономить трафик пользователя.

    Плагин имеет отзывчивый дизайн, позволяющий работать с мобильными устройствами. На мобильных устройствах изображения автоматически масштабируются в соответствии с размером экрана. Этот плагин имеет поддержку Retina, что означает возможность работы на устройствах Apple.

    Основные характеристики плагина:
    • Замена изображений “заглушкой”.
    • Автоматическое изменение размеров изображений.
    • Поддержка Retina.
    • Экономия пользовательского трафика.
    4. jQuery Lazy Load

    jQuery – бесплатный плагин для “ленивой” загрузки, использующий Java-скрипт. Java-скрипт подгружает изображения только тогда, когда они оказываются в видимой области окна браузера.

    jQuery – весьма популярный плагин из WordPress репозитория.

    Основные характеристики плагина:
    • Популярность.
    • Использование Java-скрипта.
    • Небольшой объём.
    • Практически не нуждается в настройках.
    5. Advanced Lazy Load

    Это очень хороший плагин WordPress для ленивой загрузки, который подгружает изображения тогда, когда пользователь, прокручивая страницу, достигает области изображения. Этот плагин также использует jQuery-скрипт. Он позволяет уменьшать время загрузки, так как сначала загружается текст, а для изображений создаётся новое HTTP соединение.

    То, что страницы не загружаются одновременно, позволяет уменьшить количество HTTP соединений и значительно снизить нагрузку на сервер.

    Основные характеристики плагина:
    • Использует jQuery-скрипты.
    • Позволяет уменьшить количество HTTP соединений.
    • Позволяет ускорить загрузку страниц.
    • Имеет два типа настроек.
    6. Unveil Lazy Load

    Это очень небольшой плагин, использующий jQuery-скрипт. Он подгружает изображения с помощью скрипта объёмом всего 0.6 Кб. Плагин позволяет снизить нагрузку на сервер, уменьшая количество соединений.

    Изображение подгружается в HTML код страницы по схеме data: URL, благодаря чему не требуется дубликат изображения, необходимый для “ленивой” загрузки.

    Основные характеристики плагина:
    • Использует jQuery-скрипты.
    • Использует лёгкие скрипты.
    • Использует схему с data: URL.
    • Позволяет уменьшить количество соединений.
    Заключение

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

    «Ленивая загрузка» - это программный плагин jQuery, написанный на JavaScript, который откладывает загрузку изображений на (больших) веб-страницах. Таким образом, изображения, которые не попадают в поле зрения пользователя, не будут открываться до тех пор, пока пользователь не прокрутит страницу вниз. То же самое, что предварительная загрузка, только наоборот.

    Использование «ленивой загрузки» на сайтах, содержащих много изображений большого размера, позволяет ускорить загрузку страницы - браузер сообщит о полном открытии, как только откроются все видимые картинки. В некоторых случаях использование данного модуля помогает сократить нагрузку на сервер.

    Программа написана на основе модуля для загрузки изображений, который называется YUI ImageLoader Utility , автор программы - Мэтт Млинак.

    Прокручивайте страницы вниз для просмотра эффекта.

    Исходники пока не получилось собрать. Работаю над этим.

    Как работает программа?

    Программный плагин основан на jQuery (ну а как же?) и переменных, разработанных Брендоном Аароном, которые теперь включены в разметку jQuery. Укажите их в заголовке:


    $("img").lazyload();

    После этого все изображения будут загружаться по мере доступа пользователя к ним.

    Установка реагирования

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

    $("img").lazyload({ threshold: 200 });

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

    Метка-заполнитель для изображения

    Также можно установить метку-заполнитель для изображения и событие, с которого будет начинаться загрузка. Метка-заполнитель должна содержать адрес изображения. Программный модуль предлагает прозрачные, серые и белые изображения размером 1*1 пиксель.

    $("img").lazyload({ placeholder: "img/grey.gif" });

    Событие для начала загрузки

    Событие устанавливается в jQuery - им может стать что угодно, в том числе щелчок или движение мыши. Можете разработать свои собственные варианты. По умолчанию программа ждет, пока пользователь прокрутит страницу вниз - тогда в окне браузера появляются картинки. Чтобы изображения не загружались, пока пользователь не нажмет на метку-заполнитель, делаем вот что:

    $("img").lazyload({
    placeholder: "img/grey.gif",
    event: "click"
    });

    Использование эффектов

    По умолчанию плагин ждет полной загрузки изображения, а затем обращается к функции show(), чтобы его показать. Можете добавить к этой последовательности действий любой эффект, какой вам захочется. В нижеприведенном отрывке кода представлено добавление эффекта «постепенное проявление». На демо странице вы можете посмотреть, как это смотрится.

    $("img").lazyload({
    placeholder: "img/grey.gif",
    effect: "fadeIn"
    });

    Внутреннее хранение изображений

    Также вы можете использовать плагин для изображений, хранящихся внутри контейнеров со скроллами - для этого просто укажите контейнер в коде в качестве объекта jQuery. Есть демо-варианты для горизонтальных и вертикальных контейнеров.

    #container { height: 600px; overflow: scroll; } $("img").lazyload({ placeholder: "img/grey.gif", container: $("#container")
    });

    Если изображения отображаются не по порядку

    После прокрутки страницы программа начинает поиск незагруженных изображений, проверяя в процессе поиска, не стало ли изображение видимым. По умолчанию поиск прекращается при обнаружении первой видимой картинки - предполагается, что порядок изображений на странице такой же, как и в html-коде. Однако при некоторых вариантах разметки дело обстоит не совсем так - в этом случае следует воспользоваться функцией failurelimit, которая регулирует порядок отображения картинок.

    $("img").lazyload({ failurelimit: 10
    });

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

    Можно организовать отложенную загрузку изображений, хотя это и не входит в основной функционал программы. Если вы добавите нижеприведенный код, то программа будет ждать полной загрузки страницы, причем не только ее html-элементов, но и изображений. Через пять секунд после окончания загрузки невидимые картинки также будут автоматически загружены. Можете ознакомиться с demo-версией .

    $(function() { $("img:below-the-fold").lazyload({ placeholder: "img/grey.gif", event: "sporty"
    });
    });
    $(window).bind("load", function() { var timeout = setTimeout(function() {$("img").trigger("sporty")}, 5000); });

    На сегодня все! Спасибо за внимание.

    В то время как многие люди уже пожинает плоды понятий ленивой загрузки, некоторые из них до сих пор задаются вопросом о lazy загрузки. Если у вас небольшие представления об отложенной загрузки и что она может сделать, то эта статья для вас. Мы рассмотрели все, что вам нужно знать о отложенной загрузки. Итак, читайте статью и начинайте работу!

    Прежде, чем мы начнем с преимуществ lazy загрузки, дайте узнаем, что такое ленивая загрузка и как она работает.

    Что такое отложенная (lazy) загрузка?

    Отложенная загрузка представляет собой механизм, в котором мы не можем задержать загрузку конкретного объекта, это может быть видео или просто изображение до определенного момента, где мы могли это сделать. Проще говоря, отложенная загрузка означает, загрузка объектов по требованию, а не загрузки всех объектов по умолчанию. Так раздражает проблема автоматической загрузки. Это повышает скорость сайта , таким образом объекты загружаются быстрее.

    Влияние отложенной загрузки на SEOНе отображается в кэше Google,

    Поисковая система Google не могут просматривать объекты, которые лениво загрузится. Не уверенны? Вот пример. Если у вас есть какая-либо часть вашего сайта с изображением продукта в нижней части главной страницы и вы активировали отложенную загрузку, то специфическая секция не загружается, пока вы не выделите этот раздел. Следовательно, приводит к не показу исходного кода страницы. Таким образом, он не будет отображаться на кэше Google .

    Ленивые загруженные объекты будут убраны прочь

    Отложенное загруженное содержание не будет индексироваться поисковыми системами. Поскольку это содержимое не индексируется, что, очевидно, приведет к более низкому рейтингу этих объектов. Таким образом, SEO процесс не будет рассчитывать на ленивое загруженное содержимое, чтобы показать в результатах поиска.

    Теряет ли оптимизация сайта из-за отложенной загрузки?

    Это миф! Оптимизация сайта имеет мало общего с отложенной загрузкой. Сценарий Ajax все равно будет выполняться. Единственное отличие состоит в том, что он будет выполняется в фоновом режиме. Сайт будет загружаться быстрее! Нет сомнения в этом! На оптимизацию сайта не влияет.

    Как отложенная загрузка может помочь?Отложенная загрузка мешает вам, раздражает ощущение “ожидания”

    Отложенная загрузка представляет собой механизм, который может привести вас к чему-то, что каждый жаждет – веб-сайт молниеносно. Давайте признаем: мы все нетерпеливы в ожидании содержимого для загрузки. После того, как произошла задержка, даже на несколько секунд, заставит нас выйти из веб-страницы. С отложенной загрузкой, мы не должны ждать загрузки всего содержимого.

    Веб-страница загружает гораздо быстрее.

    Как загрузить меньше ресурсов, которые вам требуется, нет места для ненужной загрузки всего содержимого на веб-странице. Это делает вашу загрузку страницы намного быстрее.

    Как вы можете использовать отложенную загрузку в WordPress?При отложенной загрузки содержимого, вы можете избежать отдельного запроса HTTP для каждого изображения

    Если вы находитесь на странице, которая включает в себя 5 бесплатных и обновляемых полно-экранных , только начальные несколько изображений в посте WordPress будет загружаться, а остальные будут загружаться только если вы прокрутите вниз до нижней части страницы. Таким образом, вы можете предотвратить сайт от отправки запроса HTTP для каждого отдельного изображения. Предотвращение от значительного количества HTTP запросов означает, экономя массу времени для сайта WordPress.

    Более быстрый доступ к содержимому на WordPress

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

    Ненужные загрузки контента можно избежать и много ваших данных тоже могут быть сохранены. Содержание, которым вы обеспокоены, можно наблюдать с помощью прокрутки до конца страницы.

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

    Лучшие плагины для отложенной загрузки1. Image Lazy Load

    Этот ленивый плагин загрузки представляет собой легкий взвешенный вариант традиционной ленивой загрузки. Он имеет специальную систему поддержки, которая служит для изображений высокого разрешения с соответствующими сетчатке дисплеев. Плагин Image Lazy Load также включает в себя опции для загрузки изображений на смартфонах путем сжатия числа пикселей, которые достигают вас, прежде чем вы можете просматривать изображения.

    2. BJ Lazy Load

    Этот ленивый плагин загрузки позволяет пользователям выбрать в постах изображения и эскизы, Gravatar, фреймы и заменяет содержимое с заполнителем. При выборе конкретного заполнителя вы можете пропустить изображения с разными классами. BJ Lazy Load также обслуживает различные размеры оптимизированных изображений и автоматически служит HiDPI изображениям для различных экранов HiDPI, как у сетчатке отображения Apple.

    3.

    Добавляет Jquery отложенной загрузки различных изображений. Лучшая часть об этом плагине является то, что она очень проста в использовании. Все, что вам нужно сделать, это просто установить его и активировать. Изображения на сайте, которые вы посещаете будет автоматически загружаться, как вы прокрутите вниз до нижней части страницы. Вам не нужно ждать, чтобы изображения загружались в течение длительного времени. Как и при открытии веб-страницы и прокрутите до конца страницы, изображения уже загружены!

    Изображения на страницу загружаются двумя основными способами: посредством тега HTML и с помощью CSS свойства background-image . Поэтому мы сначала посмотрим на пример с тегом, а потом перейдем к рассмотрению фоновых изображений CSS .

    Ленивая загрузка изображений с помощью тега img

    Начнем с простой HTML разметки для вставки изображений на страницу.

    Разметка для лениво загружаемых изображений практически такая же.

    Второй шаг заключается в том, чтобы избежать преждевременной загрузки изображения. Браузер использует атрибут src тега img для запуска загрузки изображения. И не имеет значения, является ли это изображение первым или тысячным по счету. Если браузер находит атрибут src в разметке, он немедленно запускает загрузку изображения, даже, если оно находится за пределами области видимости.

    Для того чтобы отложить загрузку изображения, нужно поместить URL адрес изображения в атрибуте отличном от атрибута src, допустим в data-src. И так, как атрибут src пустой, то и браузер не будет загружать данное изображения.

    Теперь, так как мы предотвратили загрузку изображения стразу, нам необходим, какой-то способ сообщить браузеру, когда данное изображение надо загрузить. Иначе, это никогда не случится. Для этого, мы проверяем находиться ли изображение (в нашем случае, его заменитель – серый прямоугольник) в видимой области, и затем загружаем его.

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

    Первый метод. Запуск загрузки изображения, используя события JavaScript

    В этом методе используются обработчики для следующих событий: scroll, resize и orientationChange. Событие прокрутки (scroll ) определяет текущее положение пользователя на странице, когда он перематывает ее. События resize и orientationChange важны в одинаковой степени. Событие resize возникает, когда изменяется размер окна браузера, а событие orientationChange вызывается, когда ориентация устройства меняется с ландшафтного на портретный режим и обратно.

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

    Когда какое-либо из этих событий появляется, мы находим все изображения на странице, которые еще не загружены. Из этих изображений мы выбираем именно те, которые находятся в видимой области браузера. Выбор делается на основе расчетов верхнего смещения изображения, текущего верхнего положения документа и высоты окна. Поэтому, если изображение появилось в окне просмотра, мы выберем его URL-адрес из атрибута data-src и переместим его в атрибут src , после этого браузер загрузит изображение.

    Обратите внимание, что мы через JavaScript выбираем все изображения, у которых есть класс lazy . Как только изображение загрузится, мы удалим этот класс, потому что нам больше не нужно запускать событие. А как только все изображения будут загружены, мы удалим все обработчики событий.

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

    Вот рабочий пример этого подхода:

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