Атрибут loading в HTML: что это и как включить lazy

Атрибут loading (от английского loading, «загрузка») сообщает браузеру, когда загружать картинку или фрейм: сразу или только когда они приблизятся к экрану. Закрывающей части у атрибута нет, он записывается внутри открывающего тега: loading="lazy". Закрывающий тег нужен самому элементу не всегда: у <img> его нет, а у <iframe> он обязателен.

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

HTML
<img src="cat.jpg" alt="Кот" width="400" height="300"
  loading="lazy">
<iframe src="map.html" width="600" height="400"
  loading="lazy"></iframe>

Что такое атрибут loading в HTML и зачем он нужен

Обычно браузер начинает скачивать все картинки сразу, как только найдёт их в разметке, даже если до них нужно прокручивать страницу несколько экранов. Атрибут loading позволяет изменить это: файлы, которые пока никому не нужны, ждут своей очереди.

Это подсказка, а не команда. Браузер сам решает, на каком расстоянии от экрана начать загрузку, и вы это расстояние не задаёте. Размер картинки, как и раньше, задают width и height, а выбор файла среди нескольких вариантов делают srcset и sizes.

  • loading="lazy": загрузка откладывается, пока элемент далеко от экрана.
  • loading="eager": загрузка идёт сразу. Так работает любой тег, у которого атрибута нет.
  • Размер файла атрибут не уменьшает: он только выбирает момент, когда файл скачать.

Для каких тегов работает loading: img и iframe

В современном HTML атрибут loading есть у двух тегов. У других тегов, включая <picture> и <source>, его нет: ленивость включают у самого img.

Теги, у которых работает loading
ТегЧто откладывает loadingПример записи
<img>Скачивание файла картинки<img src="cat.jpg" alt="Кот" width="400" height="300" loading="lazy">
<iframe>Загрузку страницы во фрейме: карты, видео, виджетов<iframe src="map.html" width="600" height="400" loading="lazy"></iframe>

Картинки, записанные в CSS как background-image, под атрибут не попадают: у них нет тега, которому его можно записать. Обычное расположение атрибута рядом с src и alt: порядок записи в теге значения не имеет.

Какие значения принимает loading: lazy и eager

По стандарту у атрибута два значения: lazy и eager. Остальные записи браузер не принимает, но страницу не ломает. Он просто ведёт себя так, будто атрибута нет. Результаты замеров в браузере, на котором я проверял.

Что делает браузер с разными значениями loading
ЗаписьЧто показал браузерПример записи
lazyКартинка далеко внизу не загруженаloading="lazy"
eagerЗагружена сразуloading="eager"
LAZY, LazyРаботает как lazy: регистр значения не важенloading="LAZY"
autoЗагружена сразуloading="auto"
Пустое значениеЗагружена сразуloading=""
lazy с пробелом в началеЗагружена сразу: пробел делает значение невернымloading=" lazy"
Любой другой текстЗагружена сразуloading="garbage"

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

Пример: какие значения loading включают ленивую загрузку

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

Результат

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

Как далеко от экрана браузер начинает загрузку

«Ленивая» не значит «в момент появления». Браузер начинает загрузку заранее, чтобы картинка успела прийти к моменту, когда посетитель до неё долистает. Расстояние зависит от браузера и скорости сети, поэтому точной цифры нет. Вот что показал замер в браузере, на котором я проверял: окно высотой 600 пикселей, 9 ленивых картинок на разной глубине.

Какие ленивые картинки загрузились сразу
Расстояние до нижнего края окнаЗагружена сразу
В окне и до 1400 пикселейДа
1900 пикселейДа
2400 пикселейДа
3400 пикселейНет
5400 пикселейНет

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

Пример: как далеко вперёд загружает браузер

В ленте 100 ленивых картинок. Прокручивайте её и следите, сколько картинок ниже экрана уже загружено. Загруженные получают зелёную рамку.

Результат

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

Loading и размеры: зачем ленивой картинке width и height

Ленивая картинка без размеров ломает саму идею отложенной загрузки. Пока файл не загружен, у картинки нет высоты, и все такие картинки помещаются в первый экран одновременно. Браузер видит их «рядом» и загружает все. По результатам замеров 30 ленивых картинок без width и height загрузились все до единой, а из 60 ленивых картинок 100 на 100 пикселей с записанными размерами загрузилась 36 из них.

Второй довод про страницу: когда файл придёт, высота картинки изменится, и текст ниже сдвинется. Как этого избежать, рассказано на страницах про width и height. Для ленивой картинки это правило обязательно.

HTML
<img src="cat.jpg" alt="Кот"
  width="400" height="300"
  loading="lazy">

Пример: ленивые картинки без размеров и с размерами

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

Результат

Результат считает ваш браузер. Без размеров загружаются все картинки, с размерами только те, что ближе к экрану.

Какие картинки не делают ленивыми: первый экран и главная картинка

Ленивую загрузку включают не всем картинкам подряд. Картинка в первом экране загрузится сразу, даже с loading="lazy": при замере она была в окне, и её файл запросился при открытии страницы. Значит, выгоды атрибут не даёт, и в таких случаях его просто не пишут.

Практическое правило такое. Главную картинку страницы, логотип в шапке и всё, что видно без прокрутки, оставляют без loading или записывают loading="eager". Ленивыми делают картинки, до которых посетителю нужно прокручивать: галереи, статьи, длинные ленты.

HTML
<img src="hero.jpg" alt="Главная" width="1200" height="600">

<img src="gallery-1.jpg" alt="Фото 1" width="400" height="300"
  loading="lazy">

Скрытые и свёрнутые картинки: display none, details и за краем экрана

Ленивая картинка, которой не видно, ведёт себя по-разному в зависимости от способа скрытия. Это важно для каруселей, вкладок и раскрывающихся блоков.

Что делает браузер со скрытой ленивой картинкой
Как скрыта картинкаС loading="lazy"Без атрибута
display: noneНе загруженаЗагружена
В закрытом detailsНе загружена, загрузилась при открытииЗагружена сразу
visibility: hiddenЗагруженаЗагружена
opacity: 0ЗагруженаЗагружена
За левым или правым краем окна (минус или плюс 5000 пикселей)Не загруженаЗагружена
В прокручиваемом блоке далеко внизуНе загруженаЗагружена

Выводы для вёрстки. Картинки в закрытых вкладках, слайдах и раскрывающихся блоках с loading="lazy" подгрузятся только при их показе, поэтому на переключении возможна задержка. Скрытие через visibility и opacity загрузку не откладывает: для браузера такие картинки остаются на странице.

Loading у iframe: ленивые карты и видео

У <iframe> атрибут работает так же: фрейм далеко внизу не загружается, пока посетитель не приблизится. Это особенно полезно для карт и встроенных видео: такие фреймы загружают много скриптов и данных. По результатам замеров фрейм в 5000 пикселях ниже окна с loading="lazy" не запросил страницу, пока я не прокрутил к нему, а без атрибута запросил сразу.

HTML
<iframe src="https://example.com/map"
  width="600" height="400"
  loading="lazy" title="Карта"></iframe>

Так же, как и картинке, фрейму нужны width и height: без них область под фрейм по умолчанию получается 300 на 150 пикселей, и расположение страницы после загрузки может измениться. Подробнее о размерах фрейма сказано на страницах про width и height.

Loading в JavaScript: свойство loading, new Image() и событие load

Атрибут доступен из скрипта как свойство loading у картинки и у фрейма. Свойство приводит значение к одному из допустимых.

Что возвращает свойство loading
СостояниеЗначение свойстваПример записи
Атрибута нет"auto"img.loading
Атрибут LAZY"lazy", а сам атрибут остаётся как записанimg.loading = "LAZY"
Неверное значение"auto"img.loading = "junk"
У фрейма без атрибута"auto"iframe.loading

Если создавать картинку скриптом, loading удобно записывать до src. По результатам замеров ленивая картинка, созданная через new Image() с записанным заранее loading, далеко внизу страницы не запросилась, а с loading = "eager" запросилась сразу. Ещё одно свойство ленивой загрузки: она не задерживает событие load окна. Обычная картинка с задержкой в одну секунду отодвинула событие примерно на секунду, а ленивая, ещё не начавшая загрузку, нет.

HTML
const img = new Image();
img.loading = 'lazy';      // до src
img.width = 400;
img.height = 300;
img.src = 'cat.jpg';
document.body.append(img);

console.log(img.loading);   // "lazy"

Частые ошибки в атрибуте loading

Большинство ошибок связано с тем, что lazy считают универсальным ускорителем и записывают всем картинкам подряд.

ОшибкаЧто происходитКак исправить
loading="lazy" у главной картинки первого экранаВыгоды нет: картинка в окне загружается сразу, а запись только усложняет выбор моментаУбрать атрибут или записать eager
Ленивая картинка без width и heightВысота равна нулю, все картинки оказываются «рядом» и загружаются сразуЗаписать оба размера
loading=" lazy"Пробел делает значение неверным, загрузка не откладываетсяПисать без пробелов: lazy
loading="true", loading="yes"Любое значение кроме lazy и eager читается как обычная загрузкаПисать только lazy
Ждут загрузки точно в момент появленияБраузер начинает заранее, на запас в сотни пикселейНе рассчитывать на точный момент
Ждут, что lazy уменьшит файлРазмер файла не меняется, меняется только момент загрузкиСжать файл отдельно или дать несколько файлов через srcset
Проверяют на короткой страницеКартинки внизу загружены сразу, кажется, что атрибут не работаетПроверять на длинной странице с прокруткой
Ленивые картинки в закрытых вкладках и слайдахЗагрузка идёт только при показе, на переключении задержкаДля первого слайда убрать lazy
loading у source или pictureУ этих тегов атрибута нетЗаписать у вложенного img
Ждут, что lazy сработает для фона в CSSФон не тег, атрибут к нему не относитсяЗаменить фон на тег img или грузить фон скриптом
Ленивый фрейм без width и heightПод фрейм резервируется 300 на 150 пикселей, страница сдвигаетсяЗаписать размеры фрейма
Скрывают ленивую картинку через display: none и ждут загрузки заранееКартинка не загружается, пока её не покажутДля скрытия без отсрочки загрузки использовать visibility или opacity

Шпаргалка по атрибуту loading

Всё главное из статьи в одной таблице.

Атрибут loading: что и как писать
ЗадачаКак записатьПример записи
Отложить загрузку картинкиЗначение lazy и размеры<img src="a.jpg" alt="" width="400" height="300" loading="lazy">
Отложить загрузку фреймаЗначение lazy у iframe<iframe src="map.html" width="600" height="400" loading="lazy"></iframe>
Загрузить сразуБез атрибута или eager<img src="hero.jpg" alt="" loading="eager">
Главная картинка страницыБез lazy<img src="hero.jpg" alt="">
Скрытая картинкаНе display: none, если нужна заранееimg { opacity: 0; }
Картинка из скриптаloading до srcimg.loading = 'lazy'; img.src = 'a.jpg';
Прочитать значениеСвойство loadingimg.loading
Нельзя в loadingПробелы, true, пустое значениеloading=" lazy"
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×