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

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

13 187 в JavaScript , SEO 0

Всем привет друзья! Сегодня речь пойдет про отложенную загрузку скрытых изображений. Что это такое и зачем оно нам нужно?

Что такое отложенная загрузка изображений

Скрытые изображения — это картинки, которые находятся за пределами видимости веб-страницы (viewport), не прибегая к прокрутке. То есть те картинки, которые нам еще предстоит посмотреть, когда мы будем прокручивать страницу вниз или вверх. Отложенную загрузку еще называют ленивой загрузкой изображений (lazy load images).

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

Все эти действия сводятся к оптимизации сайта, то есть на ускорение загрузки отдельных страниц сайта. Этот фактор учитывается при тестировании сайта в сервисе pageSpeed Insights от гугла.

Давайте теперь разберем как этого можно добиться. Работать загрузка изображений будет следующим образом — при прокрутке страницы все картинки будут загружаться плавно по мере видимости. Посмотреть это можно на демке.

Если понравилось двигаемся дальше и представляю вашему вниманию небольшой скрипт под названием bLazy. Данный скрипт предназначен для отложенной загрузки изображений и написан на чистом javaScript. Он не зависит от других внешних библиотек, например, таких как jQuery. Blazy работает практически на всех браузерах, включая ИЕ 7+.

Как использовать bLazy?

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

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

Далее, задаем всем картинкам, загрузку которых необходимо отложить класс b-lazy. Адрес изображения в атрибуте src меняем на прозрачную gif-заглушку с прозрачным фоном, закодированную в base64. Это так называемый плейсхолдер (placeholder) — то, что показывается до загрузки изображения. Такая заглушка не будет создавать лишних http-запросов. Оригинальный адрес изображения указываем в атрибуте data-src.

<img class="b-lazy" 
src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="image.jpg" alt="альтернативный текст" />

Следующее, что мы сделаем — это подключим скрипт и инициализируем его.

<script src="blazy.min.js"></script>
<script>
    ;(function() {
        // Initialize
        var bLazy = new Blazy();
     })();
</script>

Мы создали экземпляр класса Blazy. Он может принимать некоторые опции.

Опции

Опции передаются в формате — ключ/значение. Примерно следующим образом:

// Format
var bLazy = new Blazy({ 
    key: value,
    key: value,
    key: value
});

breakpoints

breakpoints (array, по умолчанию — false) — применяется для адаптивных изображений, имеющие контрольные точки, т. е. в зависимости от размера экрана показываем ту или иную картинку.

container

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

error

error (функция function(ele, msg), по умолчанию возвращает false) — функция возвращает два сообщения: missing и invalid, если мы сделали что-то не так. Missing — если атрибут data-src пустой или вообще не указан. Invalid — если в атрибуте data-src указан не валидный адрес изображения.

errorClass

errorClass (строка, по умолчанию — b-error) — данный класс добавится элементу если пойдет что-то не так. Например, если параметр error выше вернет missing или invalid.

loadInvisible 

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

Читайте также:  Уведомление о КУКИ на сайте

offset

offset (число, по умолчанию — 100) — этот параметр отвечает за то, с каким отступом будут загружены изображения. По умолчанию — 100, значит изображение загрузится за 100 пикс до его появления в видимой части.

root

root (объект, по умолчанию — document) — корневой объект может быть изменен. Честно сказать, не совсем понял этот пункт, вернее его предназначение.

saveViewportOffsetDelay

saveViewportOffsetDelay (число, по умолчанию — 50) — задержка для срабатывания функции saveViewportOffsetDelay при изменении размера окна браузера. По умолчанию выставлено 50 мс.

selector

selector (строка, по умолчанию — b-lazy) — селектор для изображений, которые вы хотите загружать лениво. Например для всех изображений вы можете указать просто — img. Если хотите указать несколько селекторов, то перечислите их через запятую, например — .img-1, .img-2, .img-3…

separator

separator (символ, по умолчанию — |) — используется, если вы хотите указать несколько изображений в атрибуте data-src для retina-дисплеев. Например, data-src="image.jpg|image@2x.jpg".

src

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

success

success (функция function(ele), по умолчанию возвращает — false) — обратный вызов, когда изображения все загрузились. Полезно, если мы после загрузки изображений хотим выполнить какие либо действия.

successClass

successClass (строка, по умолчанию — b-loaded) — класс, который добавляется изображению, когда оно успешно загрузилось.

validateDelay

validateDelay (число, по умолчанию — 25) — как часто должна вызываться функция валидации при проктуртке/ресайзинге страницы. По умолчанию — 25 мс.

Некоторые подробные примеры реализации вышеописанных опций вы сможете найти на сайте разработчика. Я лишь приведу некоторые.

Отложенная загрузка фоновых изображений CSS

Вы можете отложить также и загрузку фоновых изображений. Вот это вообще круто, так как pageSpeed и на фоновые изображения ругается.

<div class="b-lazy" data-src="background-image.jpg"></div>

Если обычному div-блоку указать класс b-lazy и атрибут data-src с источником изображения, скрипт добавит этому блоку фоновое изображение.

Анимация и плавное появление

Функции анимации плавного появления не заложены в скрипте. Но можно это сделать посретсвом CSS.

.b-lazy {
    -webkit-transition: opacity 500ms ease-in-out;
       -moz-transition: opacity 500ms ease-in-out;
          -o-transition: opacity 500ms ease-in-out;
             transition: opacity 500ms ease-in-out;
               max-width: 100%;
                 opacity: 0;
}
.b-lazy.b-loaded {
    opacity: 1;
}

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

Прелодер

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

<div class="image-container loading">
    <img class="b-lazy" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="image.jpg" alt="Показываем прелодер во время загрузки картинки">
</div>

Задаем родительскому контейнеру класс loading. Для данного класса прописываем фоновое gif-изображение в стилях CSS. Далее удаляем его, когда картинка была загружена посредством callback-функции success.

var bLazy = new Blazy({
    success: function(element) {
        setTimeout(function() {
            // Удаляем прелодер gif-картинку
            // Сначала определим родительский контейнер
            // затем удалим класс "loading", когда картинка была загружена
            var parent = element.parentNode;
            parent.className = parent.className.replace(/\bloading\b/, '');
        }, 200);
    }
});
.loading {
    background: #1E1E1E url("assets/loader.gif") center center no-repeat;
}

Еще немного о плейсхолдерах

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

В примере выше в качестве заглушки мы использовали прозрачную gif-картинку, закодированную в base64. Вообще, если не использовать прелодер, то во время загрузки мы вообще ничего не увидим. Есть варианты разнообразить этот момент.

Плейсхолдер доминирующего цвета

Данная техника состоит в том, чтобы взять в оригинале картинки доминирующий (базовый) цвет и показывать его до загрузки. Такой подход используют сайты Pinterest и Google картинки. Вот как это выглядит.

Читайте также:  Оптимизация картинок для сайта - как?
Плейсхолдер доминирующего цвета
Источник изображения — https://manu.ninja/dominant-colors-for-lazy-loading-images

Извлечь доминирующий цвет можно, как с помощью JavaScript, так и с помощью PHP, используя расширение GraphicsMagick. Наиболее подробнее об этом можете почитать здесь. Я не буду тут останавливаться подробно, так как это тема для отдельного разговора. Может быть как нибудь в отдельной статье…

Плейсхолдер низкого качества (LQIP)

Также, до загрузки изображения мы в качестве заглушки можем показывать мутное оригинальное изображение. Такой трюк использует Facebook для изображений. Это дает некое представление о том, какая будет загружаемая картинка, да и выглядит довольно не плохо. Рабочий пример можете посмотреть на CodePen.

Плейсхолдер низкого качества (LQIP)
Плейсхолдер низкого качества (LQIP)

Вот HTML-код изображения.

<img class="lazy" src="https://ik.imagekit.io/demo/img/image4.jpeg?tr=w-400,h-300,bl-30,q-50" data-src="https://ik.imagekit.io/demo/img/image4.jpeg?tr=w-400,h-300" />

Какие еще есть инструменты?

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

yall.js (Yet Another Lazy Loader)

Yall.js — отличный инструмент для ленивой загрузки изображений, поддерживающий элементы img, picture, video, iframe, а также фоновые CSS изображения. Работает во всех современных браузерах, включая ИЕ 11+. Использует в своей работе Intersection Observer API там, где это возможно. Также есть возможность отслеживать изменения DOM и работать с объектами, которые были добавлены после полной загрузки страницы.

jQuery Lazy

jQuery Lazy — легкий, многофункциональный и расширяемый плагин библиотеки jQuery для отложенной загрузки контента на ваших сайтах. Данный плагин позволяет ускорить загрузку страниц, показывая тот контент, что виден в области просмотра пользователя. Полное описание и работу с данным плагином можете почитать на официальном сайте разработчика.

A3 Lazy Load — плагин для WordPress

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

Ленивая загрузка с прогрессивным улучшением

Еще один метод загрузки картинок с прогрессивным улучшением. Его автор Robin Osborne. Что значит прогрессивное улучшение? Как утверждает автор — не стоит полагаться на javaScript, так как любой js-код подвержен ошибкам. Если какая-либо программа вызовет ошибку, то вы можете не увидеть отложенный контент (ошибки прерывают выполнение скриптов), как бы не крутили страницу. Также у клиента может быть просто отключен javaScript. Данная техника не опирается на внешние зависимости и при всем этом работает также, как и вышеописанные методы — загрузка при прокрутке страницы, если не прокрутили, то загрузка не происходит. Наиболее подробнее можете ознакомиться на блоге автора по ссылке выше.

Dominant Colors Lazy Loading

Dominant Colors Lazy Loading — eще один плагин ленивой загрузки изображений для cms WordPress. Основная фишка данного плагина — это показ доминирующих цветов пока изображения не загрузились. Также есть возможность в качестве плейсхолдера использовать крошечные миниатюры, увеличенные до оригинала, таким образом создавая эффект размытости во время загрузки. Такую технику используют Pinterest и Google картинки. Честно сказать, мне это стало интересно. Потестирую как нибудь…

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

Применяйте данные решения. Буду признателен, если поделитесь данной статьей со своими друзьями. Задавайте вопросы в комментариях. До встречи в других постах. Удачи!

Оцените пост
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (2 оценок, среднее: 3,00 из 5)
Загрузка...
Заур Магомедов
Заур Магомедов
Занимаюсь созданием сайтов с 2009 года. Постоянно обучаюсь и совершенствуюсь, шагая в ногу со временем. Владею такими навыками, как: Html5, Css3, JavaScript, Vue, Git, БЭМ, Gulp.
Другие материалы той же категории