Отложенная загрузка изображений (lazy loading) — это отличная техника для повышения производительности веб-страниц, особенно если на странице много изображений. Давайте разберём ваши вопросы.
1. **Использование тегов `<picture>` с `<source>`**: Если вы используете тег `<picture>` для поддержки различных форматов изображений, вы можете реализовать отложенную загрузку как для тега `<img>`, так и для тегов `<source>`. Однако основной принцип заключается в том, что браузер будет загружать изображения, указанные в тегах `<source>`, в зависимости от поддержки форматов, и в этом случае вам нужно правильно организовать отложенную загрузку, чтобы избежать ненужной загрузки.
2. **Необходимость использования форматов webp и avif**: Эти форматы изображений предлагают хорошее сжатие и могут существенно уменьшить размер изображений по сравнению с традиционными форматами (например, JPEG или PNG). Если ваша аудитория использует современные браузеры, поддерживающие эти форматы, их использование может улучшить производительность.
3. **Отложенная загрузка для тегов `<source>`**: Чтобы добавить отложенную загрузку для тегов `<source>`, вам придётся использовать немного другой подход, поскольку браузеры могут предзагружать законченные изображения перед тем, как они будут видны. Вы можете динамически добавлять атрибут `srcset` для тегов `<source>` в момент, когда они становятся видимыми (например, менять атрибут на значение из data-атрибута).
Пример реализации отложенной загрузки для тегов `<source>` и `<img>` может выглядеть следующим образом:
```html
<picture>
<source data-srcset="human-back.avif" type="image/avif">
<img data-src="human-back.jpg" src="pixel.png" alt="">
</picture>
```
```javascript
const sources = document.querySelectorAll('source[data-srcset]');
const images = document.querySelectorAll('img[data-src]');
function loadImages(entries, observer) {
entries.forEach(entry => {
if (entry.isIntersecting) {
// Отложенная загрузка для <source>
const source = entry.target.querySelector('source[data-srcset]');
if (source) {
source.srcset = source.dataset.srcset;
}
// Отложенная загрузка для <img>
const img = entry.target.querySelector('img[data-src]');
if (img) {
img.src = img.dataset.src;
}
observer.unobserve(entry.target);
}
});
}
const options = { threshold: 0, rootMargin: '50px' };
const observer = new IntersectionObserver(loadImages, options);
sources.forEach(source => {
observer.observe(source.parentNode); // Оборачиваем в родительский элемент <picture>
});
images.forEach(img => {
observer.observe(img.parentNode); // То же самое
});
```
Таким образом, при отложенной загрузке вы можете использовать как формат `<picture>`, так и форматы webp и avif, но вам нужно будет убедиться, что загружаете их правильно и динамически. Если ваша аудитория не нуждается в более новых форматах или у вас есть ограничения на поддержку браузеров, можно обойтись и без них.