Атрибут srcset
может быть установлен из JavaScript для реализации отзывчивых ленивых загруженных изображений.
Однако установка атрибута sizes
, похоже, не работает. Кодирование sizes
в HTML работает должным образом, но когда я пытаюсь установить атрибут sizes
из JavaScript (как в коде ниже), это не имеет никакого эффекта: выбранное изображение соответствует ширине области просмотра и не следует sizes
подсказки.
Это задумано или просто не реализовано?
Пример кода ниже.
const BASE_URL = 'https://res.cloudinary.com/foobar/f_auto,dpr_auto,q_auto:eco/';
const SIZES = {
0: 'calc(100vw - 60px)',
420: 'calc((100vw - 90px) / 2)',
750: 'calc((100vw - 120px) / 3)',
1200: 'calc((100vw - 150px) / 4)'
}
const WIDTHS = [500, 1000, 1500];
const options = {
rootMargin: '0px 0px 100px 0px',
};
function callback(entries) {
for (const entry of entries) {
if (entry.isIntersecting) {
const lazyImage = entry.target;
const id = lazyImage.dataset.id;
lazyImage.sizes = getSizes();
lazyImage.srcset = getSrcset(id);
io.unobserve(lazyImage);
}
}
}
function getSrcset(id) {
const srcset = [];
for (const width of WIDTHS) {
srcset.push(`${BASE_URL}w_${width}/${id}.jpg ${width}w`);
}
return srcset.join(',');
}
function getSizes() {
const sizes = [];
for (const size in SIZES) {
sizes.push(`(min-width: ${size}px) ${SIZES[size]}`);
}
return sizes.join(',');
}
const images = document.querySelectorAll('img.lazy');
let io;
if (window.IntersectionObserver) {
io = new IntersectionObserver(callback, options);
}
for (const image of images) {
if (window.IntersectionObserver) {
io.observe(image);
} else {
console.log('Intersection Observer not supported');
image.src = BASE_URL + image.getAttribute('data-id' + '.jpg');
}
}