Задача
СкопированоЛенивая загрузка (lazy loadnig) — это асинхронная загрузка картинок на веб-странице. Это означает, что картинки загружаются после полной загрузки страницы или когда они появляются в видимой части окна браузера. Следовательно, если пользователь не будет прокручивать экран, то изображения, размещённые за пределами экрана, не будут загружаться.
Иногда хочется, чтобы изображение появлялось не внезапно, а чтобы пользователь заранее знал, что оно там будет благодаря превью.
Ленивую загрузку часто используют на сайтах с большим количеством изображений. Таким образом можно экономить трафик на сайт и повысить производительность.
При большом количестве изображений на сайте можно настроить приоритет их загрузки. Для этого можно использовать атрибут fetch в теге <img>. Всего у атрибута есть 3 значения:
high– высокий приоритет относительно других изображений.low– низкий приоритет относительно других изображений.auto– приоритет по умолчанию, который указывает на отсутствие предпочтения приоритета выборки. В таком случае браузер сам решает, что лучше для пользователя.
Также стоит помнить о том, что не стоит использовать атрибут loading если картинка гарантированно находится в области видимости.
Ленивую загрузку можно реализовать несколькими способами:
- Атрибут
loadingв теге<img>. - Intersection Observer API.
- Использовать прогрессивные изображения.
Прогрессивные изображения (progressive images) – метод, позволяющий постепенно загружать изображения, начиная с низкого разрешения и улучшая его качество постепенно.
Ниже разберём решение с использованием progressive images.
Готовое решение
СкопированоРазбор решения
СкопированоИспользуем атрибут data, чтобы хранить ссылку на полное изображение, и атрибут src, чтобы установить начальное изображение низкого разрешения, которое будет быстро загружено.
Разметка
Скопировано
<img src="low-resolution.jpg" data-src="high-resolution.jpg" alt="Лягушка" class="lazy-image" id="progressive-image">
<img
src="low-resolution.jpg"
data-src="high-resolution.jpg"
alt="Лягушка"
class="lazy-image"
id="progressive-image"
>
Стили
СкопированоСтоит добавить картинке размеры. Это позволит при отрисовке страницы оставлять нужное количество пространства ещё до загрузки самого изображения.
Для блюра изображения в низком качестве добавлено свойство filter.
.lazy-image { width: 300px; height: 250px; background-repeat: no-repeat; background-size: cover; filter: blur(20px);}
.lazy-image {
width: 300px;
height: 250px;
background-repeat: no-repeat;
background-size: cover;
filter: blur(20px);
}
Скрипт
СкопированоКод на JavaScript ожидает события DOM, чтобы убедиться, что весь DOM уже готов к обработке. Затем создаётся объект Image для загрузки изображения низкого разрешения (low). Когда это изображение загружено, мы изменяем атрибут src основного изображения (progressive) на ссылку на полное изображение, которое будет загружено вместо низкого разрешения и убираем блюр.
document.addEventListener('DOMContentLoaded', function() { const progressiveImage = document.getElementById('progressive-image') const lowResImage = new Image() lowResImage.src = progressiveImage.src lowResImage.onload = function() { progressiveImage.src = progressiveImage.getAttribute('data-src') progressiveImage.style.filter = 'none' } lowResImage.onerror = function() { progressiveImage.style.filter = 'none' }})
document.addEventListener('DOMContentLoaded', function() {
const progressiveImage = document.getElementById('progressive-image')
const lowResImage = new Image()
lowResImage.src = progressiveImage.src
lowResImage.onload = function() {
progressiveImage.src = progressiveImage.getAttribute('data-src')
progressiveImage.style.filter = 'none'
}
lowResImage.onerror = function() {
progressiveImage.style.filter = 'none'
}
})